diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index c24c5ddb..4bc7c88f 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username -custom: ['https://www.ventoy.net/en/donation.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +custom: ['https://www.paypal.me/ventoy', 'https://www.ventoy.net/en/donation.html'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/issue_template.yml b/.github/ISSUE_TEMPLATE/issue_template.yml index 906df8d6..d0e78bb3 100644 --- a/.github/ISSUE_TEMPLATE/issue_template.yml +++ b/.github/ISSUE_TEMPLATE/issue_template.yml @@ -21,7 +21,7 @@ body: attributes: label: Ventoy Version description: What version of ventoy are you running? - placeholder: 1.0.46 + placeholder: 1.0.62 validations: required: true - type: dropdown @@ -63,6 +63,13 @@ body: placeholder: 32GB validations: required: true + - type: input + id: vendor + attributes: + label: Disk Manufacturer + description: What is the manufacturer of the disk installed with Ventoy? (e.g. SanDisk/Kingston...) + validations: + required: false - type: dropdown id: checksum attributes: @@ -73,6 +80,14 @@ body: - No. validations: required: false + - type: input + id: link + attributes: + label: Image file download link (if applicable) + description: What is the image file download link? + placeholder: https://xxx + validations: + required: false - type: textarea id: what-happened attributes: diff --git a/.github/ISSUE_TEMPLATE/success_image_report.yml b/.github/ISSUE_TEMPLATE/success_image_report.yml new file mode 100644 index 00000000..fad2314e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/success_image_report.yml @@ -0,0 +1,101 @@ +name: Success Image Report +description: To report an image file that boot successfully in Ventoy and is not yet listed in https://www.ventoy.net/en/isolist.html +title: "[Success Image Report]: " +assignees: + - octocat +body: + - type: markdown + attributes: + value: | + I list all the successfully tested image files in the official website: https://www.ventoy.net/en/isolist.html + If you successfully test an image file which is not listed in the above page, you can tell me and I will be very glad to add it to the tested list. + - type: checkboxes + id: faq + attributes: + label: Official Website List + description: Have you checked the list at [https://www.ventoy.net/en/isolist.html](https://www.ventoy.net/en/isolist.html) and the image file is not listed? + options: + - label: I have checked the list in official website and the image file is not listed there. + required: true + - type: input + id: version + attributes: + label: Ventoy Version + description: What version of ventoy did you test with the image file. + placeholder: 1.0.57 + validations: + required: true + - type: dropdown + id: bios + attributes: + label: BIOS Mode + description: In which BIOS mode did you successfully test the image file? (It's recommended to test in both mode) + options: + - Legacy BIOS Mode + - UEFI Mode + - Both + validations: + required: true + - type: dropdown + id: partstyle + attributes: + label: Partition Style + description: Which partition style did you use with Ventoy? + options: + - MBR + - GPT + validations: + required: true + - type: input + id: filename + attributes: + label: Image file name + description: The successfully tested image file name. + placeholder: xxxx.iso + validations: + required: true + - type: dropdown + id: checksum + attributes: + label: Image file checksum type + description: + options: + - MD5 + - SHA1 + - SHA256 + - SHA512 + validations: + required: true + - type: input + id: checkvalue + attributes: + label: Image file checksum value + description: What is the image file checksum value corresponding to the above checksum type? + placeholder: xxxx + validations: + required: true + - type: input + id: link + attributes: + label: Image file download link (if applicable) + description: What is the image file download link? + placeholder: https://xxx + validations: + required: false + - type: input + id: testenv + attributes: + label: Test envrionment + description: The manufacturer/model and other details about your computer (or VM). + placeholder: Lenovo Thinkpad T420 laptop + validations: + required: true + - type: textarea + id: details + attributes: + label: More Details? + description: You can give more details here. + value: "This image file booted successfully in Ventoy." + validations: + required: false + diff --git a/.github/workflows/sync2gitee.yml b/.github/workflows/sync2gitee.yml index fd13a66f..2fd7e871 100644 --- a/.github/workflows/sync2gitee.yml +++ b/.github/workflows/sync2gitee.yml @@ -11,6 +11,7 @@ on: jobs: run: name: Sync-GitHub-to-Gitee + if: ${{ github.repository_owner == 'ventoy' }} runs-on: ubuntu-latest steps: - name: Mirror the Github repos to Gitee. diff --git a/Dockerfile b/Dockerfile index 4a6bf569..8ae66b3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,6 @@ RUN yum -y -q install \ mpfr.i686 mpfr-devel.i686 rsync autogen autoconf automake libtool gettext* bison binutils \ flex device-mapper-devel SDL libpciaccess libusb freetype freetype-devel gnu-free-* qemu-* virt-* \ libvirt* vte* NetworkManager-bluetooth brlapi fuse-devel dejavu* gnu-efi* pesign shim \ - iscsi-initiator-utils grub2-tools zip nasm acpica-tools glibc-static zlib-static xorriso + iscsi-initiator-utils grub2-tools zip nasm acpica-tools glibc-static zlib-static xorriso lz4 squashfs-tools CMD cd /ventoy/INSTALL && ls -la && sh docker_ci_build.sh diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c index 3bbfd9ef..cfcf4105 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c @@ -34,6 +34,7 @@ #include #include #include +#include #include BOOLEAN gDebugPrint = FALSE; @@ -58,6 +59,9 @@ static grub_env_set_pf grub_env_set = NULL; ventoy_grub_param_file_replace *g_file_replace_list = NULL; ventoy_efi_file_replace g_efi_file_replace; +ventoy_grub_param_file_replace *g_img_replace_list = NULL; +ventoy_efi_file_replace g_img_file_replace; + CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH; CONST CHAR16 gUdfEfiDriverPath[] = UDF_EFI_DRIVER_PATH; @@ -362,10 +366,22 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath return Handle; } +STATIC ventoy_ram_disk g_backup_ramdisk_param; +STATIC ventoy_os_param g_backup_os_param_var; + + EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID) { + UINTN DataSize; EFI_STATUS Status = EFI_SUCCESS; EFI_GUID VarGuid = VENTOY_GUID; + + DataSize = sizeof(g_backup_ramdisk_param); + Status = gRT->GetVariable(L"VentoyRamDisk", &VarGuid, NULL, &DataSize, &g_backup_ramdisk_param); + if (!EFI_ERROR(Status)) + { + debug("find previous ramdisk variable <%llu>", g_backup_ramdisk_param.DiskSize); + } Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, @@ -379,21 +395,38 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID) { EFI_STATUS Status = EFI_SUCCESS; EFI_GUID VarGuid = VENTOY_GUID; - - Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, + + if (g_backup_ramdisk_param.DiskSize > 0 && g_backup_ramdisk_param.PhyAddr > 0) + { + Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(g_backup_ramdisk_param), &g_backup_ramdisk_param); + debug("resotre ramdisk variable %r", Status); + } + else + { + Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, 0, NULL); - debug("delete efi variable %r", Status); + debug("delete ramdisk variable %r", Status); + } return Status; } - EFI_STATUS EFIAPI ventoy_save_variable(VOID) { + UINTN DataSize; EFI_STATUS Status = EFI_SUCCESS; EFI_GUID VarGuid = VENTOY_GUID; - + + DataSize = sizeof(g_backup_os_param_var); + Status = gRT->GetVariable(L"VentoyOsParam", &VarGuid, NULL, &DataSize, &g_backup_os_param_var); + if (!EFI_ERROR(Status)) + { + debug("find previous efi variable <%a>", g_backup_os_param_var.vtoy_img_path); + } + Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof(g_chain->os_param), &(g_chain->os_param)); @@ -406,11 +439,21 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID) { EFI_STATUS Status = EFI_SUCCESS; EFI_GUID VarGuid = VENTOY_GUID; - - Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, + + if (0 == CompareMem(&(g_backup_os_param_var.guid), &VarGuid, sizeof(EFI_GUID))) + { + Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(g_backup_os_param_var), &(g_backup_os_param_var)); + debug("restore efi variable %r", Status); + } + else + { + Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, 0, NULL); - debug("delete efi variable %r", Status); + debug("delete efi variable %r", Status); + } return Status; } @@ -667,6 +710,35 @@ STATIC EFI_STATUS EFIAPI ventoy_load_isoefi_driver(IN EFI_HANDLE ImageHandle) return EFI_SUCCESS; } +STATIC EFI_STATUS ventoy_proc_img_replace_name(ventoy_grub_param_file_replace *replace) +{ + UINT32 i; + char tmp[256]; + + if (replace->magic != GRUB_IMG_REPLACE_MAGIC) + { + return EFI_SUCCESS; + } + + if (replace->old_file_name[0][0] == 0) + { + return EFI_SUCCESS; + } + + AsciiStrCpyS(tmp, sizeof(tmp), replace->old_file_name[0]); + + for (i = 0; i < 256 && tmp[i]; i++) + { + if (tmp[i] == '/') + { + tmp[i] = '\\'; + } + } + + AsciiStrCpyS(replace->old_file_name[0], 256, tmp); + return EFI_SUCCESS; +} + STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle) { UINT32 i = 0; @@ -777,6 +849,19 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle) old_cnt > 3 ? g_file_replace_list->old_file_name[3] : "" ); + g_img_replace_list = &pGrubParam->img_replace; + ventoy_proc_img_replace_name(g_img_replace_list); + old_cnt = g_img_replace_list->old_file_cnt; + debug("img replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>", + g_img_replace_list->magic, + g_img_replace_list->new_file_virtual_id, + old_cnt, + old_cnt > 0 ? g_img_replace_list->old_file_name[0] : "", + old_cnt > 1 ? g_img_replace_list->old_file_name[1] : "", + old_cnt > 2 ? g_img_replace_list->old_file_name[2] : "", + old_cnt > 3 ? g_img_replace_list->old_file_name[3] : "" + ); + pPos = StrStr(pCmdLine, L"mem:"); chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4); @@ -1010,7 +1095,8 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle) gST->ConIn->Reset(gST->ConIn, FALSE); } - if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) + if ((g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC) || + (g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC)) { ventoy_wrapper_push_openvolume(pFile->OpenVolume); pFile->OpenVolume = ventoy_wrapper_open_volume; @@ -1085,6 +1171,8 @@ EFI_STATUS EFIAPI VentoyEfiMain return Status; } + ventoy_disable_ex_filesystem(); + if (gMemdiskMode) { g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf; @@ -1159,6 +1247,8 @@ EFI_STATUS EFIAPI VentoyEfiMain grub_env_set("vtoy_dotefi_retry", "YES"); } + ventoy_enable_ex_filesystem(); + return EFI_SUCCESS; } diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h index 1e79467e..30ed3c5c 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h @@ -169,7 +169,6 @@ typedef struct ventoy_virt_chunk { 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }} -#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy" #if defined (MDE_CPU_IA32) #define VENTOY_UEFI_DESC L"IA32 UEFI" @@ -244,6 +243,7 @@ typedef int (*grub_env_printf_pf)(const char *fmt, ...); #pragma pack(1) #define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF +#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF typedef struct ventoy_efi_file_replace { @@ -268,6 +268,7 @@ typedef struct ventoy_grub_param grub_env_get_pf grub_env_get; grub_env_set_pf grub_env_set; ventoy_grub_param_file_replace file_replace; + ventoy_grub_param_file_replace img_replace; grub_env_printf_pf grub_env_printf; }ventoy_grub_param; @@ -344,6 +345,14 @@ typedef struct ventoy_system_wrapper EFI_LOCATE_DEVICE_PATH OriLocateDevicePath; } ventoy_system_wrapper; + +#define MAX_DRIVER_BIND_WRAPPER 64 +typedef struct DriverBindWrapper +{ + EFI_DRIVER_BINDING_PROTOCOL *DriverBinding; + EFI_DRIVER_BINDING_SUPPORTED pfOldSupport; +}DRIVER_BIND_WRAPPER; + #define ventoy_wrapper(bs, wrapper, func, newfunc) \ {\ wrapper.Ori##func = bs->func;\ @@ -351,6 +360,22 @@ typedef struct ventoy_system_wrapper bs->func = wrapper.New##func;\ } + +#define VENTOY_GET_COMPONENT_NAME(Protocol, DriverName) \ +{\ + DriverName = NULL;\ + Status = Protocol->GetDriverName(Protocol, "en", &DriverName);\ + if (EFI_ERROR(Status) || NULL == DriverName) \ + {\ + DriverName = NULL;\ + Status = Protocol->GetDriverName(Protocol, "eng", &DriverName);\ + if (EFI_ERROR(Status) || NULL == DriverName) \ + {\ + continue;\ + }\ + }\ +} + extern BOOLEAN gDebugPrint; VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...); EFI_STATUS EFIAPI ventoy_wrapper_system(VOID); @@ -373,6 +398,7 @@ extern ventoy_virt_chunk *g_virt_chunk; extern UINT32 g_virt_chunk_num; extern vtoy_block_data gBlockData; extern ventoy_efi_file_replace g_efi_file_replace; +extern ventoy_efi_file_replace g_img_file_replace; extern ventoy_sector_flag *g_sector_flag; extern UINT32 g_sector_flag_num; extern BOOLEAN gMemdiskMode; @@ -380,6 +406,7 @@ extern BOOLEAN gSector512Mode; extern UINTN g_iso_buf_size; extern UINT8 *g_iso_data_buf; extern ventoy_grub_param_file_replace *g_file_replace_list; +extern ventoy_grub_param_file_replace *g_img_replace_list; extern BOOLEAN g_fixup_iso9660_secover_enable; extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex; extern BOOLEAN g_fix_windows_1st_cdrom_issue; @@ -396,6 +423,8 @@ EFI_STATUS ventoy_hook_keyboard_stop(VOID); BOOLEAN ventoy_is_cdrom_dp_exist(VOID); EFI_STATUS ventoy_hook_1st_cdrom_start(VOID); EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID); +EFI_STATUS ventoy_disable_ex_filesystem(VOID); +EFI_STATUS ventoy_enable_ex_filesystem(VOID); #endif diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c index 7af3349b..9bdfaaa9 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #define PROCOTOL_SLEEP_MSECONDS 0 diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c index f9323cb9..56cb3948 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c @@ -34,8 +34,12 @@ #include #include #include +#include #include +#define ASSIGN_REPLACE(This, replace) \ + replace = (This->FlushEx == ventoy_wrapper_file_flush_ex) ? &g_efi_file_replace : &g_img_file_replace + UINT8 *g_iso_data_buf = NULL; UINTN g_iso_buf_size = 0; BOOLEAN gMemdiskMode = FALSE; @@ -73,6 +77,9 @@ STATIC UINT8 g_sector_buf[2048]; STATIC EFI_BLOCK_READ g_sector_2048_read = NULL; STATIC EFI_BLOCK_WRITE g_sector_2048_write = NULL; +STATIC UINTN g_DriverBindWrapperCnt = 0; +STATIC DRIVER_BIND_WRAPPER g_DriverBindWrapperList[MAX_DRIVER_BIND_WRAPPER]; + BOOLEAN ventoy_is_cdrom_dp_exist(VOID) { UINTN i = 0; @@ -483,6 +490,8 @@ EFI_STATUS EFIAPI ventoy_block_io_read_real secNum = VirtSec - Lba; } + debug("XXX block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer); + if (secNum > g_sector_flag_num) { cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag)); @@ -618,26 +627,74 @@ EFI_STATUS EFIAPI ventoy_block_io_flush(IN EFI_BLOCK_IO_PROTOCOL *This) return EFI_SUCCESS; } +STATIC UINTN ventoy_get_current_device_path_id(VOID) +{ + UINTN i = 0; + UINTN Count = 0; + UINTN MaxId = 0; + UINTN CurId = 0; + BOOLEAN Find = FALSE; + EFI_HANDLE *Handles = NULL; + EFI_STATUS Status = EFI_SUCCESS; + EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL; + VENDOR_DEVICE_PATH *venPath = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid, + NULL, &Count, &Handles); + if (EFI_ERROR(Status)) + { + return 0; + } + + for (i = 0; i < Count; i++) + { + Status = gBS->HandleProtocol(Handles[i], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); + if (EFI_ERROR(Status)) + { + continue; + } + + if (DevicePath->Type == HARDWARE_DEVICE_PATH && DevicePath->SubType == HW_VENDOR_DP) + { + venPath = (VENDOR_DEVICE_PATH *)DevicePath; + if (CompareGuid(&venPath->Guid, &gVtoyBlockDevicePathGuid)) + { + CurId = StrDecimalToUintn((CHAR16 *)(venPath + 1) + StrLen(L"ventoy_")); + MaxId = MAX(MaxId, CurId); + Find = TRUE; + } + } + } + + FreePool(Handles); + + return Find ? (MaxId + 1) : 0; +} EFI_STATUS EFIAPI ventoy_fill_device_path(VOID) { + UINTN CurVtoyDpId = 0; UINTN NameLen = 0; UINT8 TmpBuf[128] = {0}; VENDOR_DEVICE_PATH *venPath = NULL; + CHAR16 VtoyDpName[32]; + + CurVtoyDpId = ventoy_get_current_device_path_id(); + UnicodeSPrintAsciiFormat(VtoyDpName, sizeof(VtoyDpName), "ventoy_%03lu", CurVtoyDpId); venPath = (VENDOR_DEVICE_PATH *)TmpBuf; - NameLen = StrSize(VTOY_BLOCK_DEVICE_PATH_NAME); + NameLen = StrSize(VtoyDpName); venPath->Header.Type = HARDWARE_DEVICE_PATH; venPath->Header.SubType = HW_VENDOR_DP; venPath->Header.Length[0] = sizeof(VENDOR_DEVICE_PATH) + NameLen; venPath->Header.Length[1] = 0; CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID)); - CopyMem(venPath + 1, VTOY_BLOCK_DEVICE_PATH_NAME, NameLen); + CopyMem(venPath + 1, VtoyDpName, NameLen); gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf); gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen; - debug("gBlockData.Path=<%s>\n", ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE)); + debug("gBlockData.Path=<%lu><%s>\n", CurVtoyDpId, ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE)); return EFI_SUCCESS; } @@ -670,11 +727,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST continue; } - Status = Name2Protocol->GetDriverName(Name2Protocol, "en", &DriverName); - if (EFI_ERROR(Status) || NULL == DriverName) - { - continue; - } + VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName); if (StrStr(DriverName, DrvName)) { @@ -712,11 +765,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST continue; } - Status = NameProtocol->GetDriverName(NameProtocol, "en", &DriverName); - if (EFI_ERROR(Status)) - { - continue; - } + VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName); if (StrStr(DriverName, DrvName)) { @@ -741,6 +790,223 @@ end: return Status; } + +STATIC BOOLEAN ventoy_filesystem_need_wrapper(IN CONST CHAR16 *DrvName) +{ + UINTN i; + CHAR16 UpperDrvName[256]; + + StrCpyS(UpperDrvName, 256, DrvName); + + for (i = 0; i < 256 && UpperDrvName[i]; i++) + { + if (UpperDrvName[i] >= 'a' && UpperDrvName[i] <= 'z') + { + UpperDrvName[i] = 'A' + (UpperDrvName[i] - 'a'); + } + } + + /* + * suppress some file system drivers + * 1. rEFInd File System Driver + * + */ + + if (StrStr(UpperDrvName, L"REFIND") && StrStr(UpperDrvName, L"FILE SYSTEM")) + { + return TRUE; + } + + return FALSE; +} + +STATIC VOID ventoy_add_filesystem_wrapper +( + IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol, + IN CONST CHAR16 *DriverName +) +{ + UINTN j; + + if (g_DriverBindWrapperCnt >= MAX_DRIVER_BIND_WRAPPER) + { + debug("driver binding wrapper overflow %lu", g_DriverBindWrapperCnt); + return; + } + + if (!ventoy_filesystem_need_wrapper(DriverName)) + { + return; + } + + for (j = 0; j < g_DriverBindWrapperCnt; j++) + { + if (g_DriverBindWrapperList[j].DriverBinding == DriverBindProtocol) + { + debug("Duplicate driverbinding <%s> %p %lu %lu", DriverName, DriverBindProtocol, j, g_DriverBindWrapperCnt); + break; + } + } + + if (j >= g_DriverBindWrapperCnt) + { + g_DriverBindWrapperList[g_DriverBindWrapperCnt].DriverBinding = DriverBindProtocol; + g_DriverBindWrapperList[g_DriverBindWrapperCnt].pfOldSupport = DriverBindProtocol->Supported; + g_DriverBindWrapperCnt++; + debug("Add driverbinding <%s> %p %lu", DriverName, DriverBindProtocol, g_DriverBindWrapperCnt); + } +} + +STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID) +{ + UINTN i = 0; + UINTN Count = 0; + CHAR16 *DriverName = NULL; + EFI_HANDLE *Handles = NULL; + EFI_STATUS Status = EFI_SUCCESS; + EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL; + EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL; + EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol = NULL; + + debug("ventoy_find_filesystem_driverbind..."); + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid, + NULL, &Count, &Handles); + if (EFI_ERROR(Status)) + { + return Status; + } + + for (i = 0; i < Count; i++) + { + Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol); + if (EFI_ERROR(Status)) + { + continue; + } + + VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName); + + Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol); + if (EFI_ERROR(Status)) + { + debug("### 2 No DriverBind <%s> <%r>", DriverName, Status); + continue; + } + + ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName); + } + + Count = 0; + FreePool(Handles); + Handles = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid, + NULL, &Count, &Handles); + if (EFI_ERROR(Status)) + { + return Status; + } + + for (i = 0; i < Count; i++) + { + Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol); + if (EFI_ERROR(Status)) + { + continue; + } + + VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName); + + Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol); + if (EFI_ERROR(Status)) + { + debug("### 1 No DriverBind <%s> <%r>", DriverName, Status); + continue; + } + + ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName); + } + + FreePool(Handles); + + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI ventoy_wrapper_driver_bind_support +( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL +) +{ + UINTN i; + EFI_STATUS Status = EFI_SUCCESS; + EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL; + EFI_DRIVER_BINDING_SUPPORTED pfOldSupport = NULL; + + for (i = 0; i < g_DriverBindWrapperCnt; i++) + { + if (g_DriverBindWrapperList[i].DriverBinding == This) + { + pfOldSupport = g_DriverBindWrapperList[i].pfOldSupport; + break; + } + } + + debug("ventoy_wrapper_driver_bind_support %lu %p", i, pfOldSupport); + + if (!pfOldSupport) + { + return EFI_UNSUPPORTED; + } + + Status = gBS->HandleProtocol(ControllerHandle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath); + if (EFI_ERROR(Status)) + { + goto out; + } + + if (0 == CompareMem(gBlockData.Path, DevicePath, gBlockData.DevicePathCompareLen)) + { + debug("return EFI_UNSUPPORTED for ventoy"); + return EFI_UNSUPPORTED; + } + +out: + return pfOldSupport(This, ControllerHandle, RemainingDevicePath); +} + +EFI_STATUS ventoy_disable_ex_filesystem(VOID) +{ + UINTN i; + + ventoy_find_filesystem_driverbind(); + + for (i = 0; i < g_DriverBindWrapperCnt; i++) + { + g_DriverBindWrapperList[i].DriverBinding->Supported = ventoy_wrapper_driver_bind_support; + } + + debug("Wrapper Ex Driver Binding %lu", g_DriverBindWrapperCnt); + ventoy_debug_pause(); + + return EFI_SUCCESS; +} + +EFI_STATUS ventoy_enable_ex_filesystem(VOID) +{ + UINTN i; + + for (i = 0; i < g_DriverBindWrapperCnt; i++) + { + g_DriverBindWrapperList[i].DriverBinding->Supported = g_DriverBindWrapperList[i].pfOldSupport; + } + g_DriverBindWrapperCnt = 0; + + return EFI_SUCCESS; +} + EFI_STATUS EFIAPI ventoy_block_io_read_512 ( IN EFI_BLOCK_IO_PROTOCOL *This, @@ -875,14 +1141,15 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im { gBlockData.Media.BlockSize = 512; gBlockData.Media.LastBlock = ImgSize / 512 - 1; + gBlockData.Media.ReadOnly = FALSE; } else { gBlockData.Media.BlockSize = 2048; gBlockData.Media.LastBlock = ImgSize / 2048 - 1; + gBlockData.Media.ReadOnly = TRUE; } - gBlockData.Media.ReadOnly = TRUE; gBlockData.Media.MediaPresent = 1; gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1; @@ -981,6 +1248,15 @@ ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) return EFI_SUCCESS; } +/* Ex version */ +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_flush_ex_img(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) +{ + (VOID)This; + (VOID)Token; + return EFI_SUCCESS; +} + STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) @@ -1006,19 +1282,20 @@ ventoy_wrapper_file_close(EFI_FILE_HANDLE This) return EFI_SUCCESS; } - STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position) { - (VOID)This; - - if (Position <= g_efi_file_replace.FileSizeBytes) + ventoy_efi_file_replace *replace = NULL; + + ASSIGN_REPLACE(This, replace); + + if (Position <= replace->FileSizeBytes) { - g_efi_file_replace.CurPos = Position; + replace->CurPos = Position; } else { - g_efi_file_replace.CurPos = g_efi_file_replace.FileSizeBytes; + replace->CurPos = replace->FileSizeBytes; } return EFI_SUCCESS; @@ -1027,9 +1304,11 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position) STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position) { - (VOID)This; + ventoy_efi_file_replace *replace = NULL; - *Position = g_efi_file_replace.CurPos; + ASSIGN_REPLACE(This, replace); + + *Position = replace->CurPos; return EFI_SUCCESS; } @@ -1039,6 +1318,9 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data) { EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data; + ventoy_efi_file_replace *replace = NULL; + + ASSIGN_REPLACE(This, replace); debug("ventoy_wrapper_file_get_info ... %u", *Len); @@ -1056,8 +1338,8 @@ ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, V ZeroMem(Data, sizeof(EFI_FILE_INFO)); Info->Size = sizeof(EFI_FILE_INFO); - Info->FileSize = g_efi_file_replace.FileSizeBytes; - Info->PhysicalSize = g_efi_file_replace.FileSizeBytes; + Info->FileSize = replace->FileSizeBytes; + Info->PhysicalSize = replace->FileSizeBytes; Info->Attribute = EFI_FILE_READ_ONLY; //Info->FileName = EFI_FILE_READ_ONLY; @@ -1071,23 +1353,24 @@ ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) { EFI_LBA Lba; UINTN ReadLen = *Len; - - (VOID)This; + ventoy_efi_file_replace *replace = NULL; + ASSIGN_REPLACE(This, replace); + debug("ventoy_wrapper_file_read ... %u", *Len); - if (g_efi_file_replace.CurPos + ReadLen > g_efi_file_replace.FileSizeBytes) + if (replace->CurPos + ReadLen > replace->FileSizeBytes) { - ReadLen = g_efi_file_replace.FileSizeBytes - g_efi_file_replace.CurPos; + ReadLen = replace->FileSizeBytes - replace->CurPos; } - Lba = g_efi_file_replace.CurPos / 2048 + g_efi_file_replace.BlockIoSectorStart; + Lba = replace->CurPos / 2048 + replace->BlockIoSectorStart; ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data); *Len = ReadLen; - g_efi_file_replace.CurPos += ReadLen; + replace->CurPos += ReadLen; return EFI_SUCCESS; } @@ -1098,7 +1381,7 @@ ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer); } -STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File) +STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img) { File->Revision = EFI_FILE_PROTOCOL_REVISION2; File->Open = ventoy_wrapper_fs_open; @@ -1114,7 +1397,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File) File->OpenEx = ventoy_wrapper_file_open_ex; File->ReadEx = ventoy_wrapper_file_read_ex; File->WriteEx = ventoy_wrapper_file_write_ex; - File->FlushEx = ventoy_wrapper_file_flush_ex; + File->FlushEx = Img ? ventoy_wrapper_file_flush_ex_img : ventoy_wrapper_file_flush_ex; return EFI_SUCCESS; } @@ -1133,16 +1416,28 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open UINT64 Sectors = 0; EFI_STATUS Status = EFI_SUCCESS; CHAR8 TmpName[256]; + CHAR8 OldName[256]; ventoy_virt_chunk *virt = NULL; debug("## ventoy_wrapper_file_open <%s> ", Name); + if ((Mode & EFI_FILE_MODE_WRITE) > 0 && StrCmp(Name, L"\\loader\\random-seed") == 0) + { + if (gDebugPrint) + { + debug("## ventoy_wrapper_file_open return NOT_FOUND for random-seed %lx", Mode); + sleep(3); + } + return EFI_NOT_FOUND; + } + Status = g_original_fopen(This, New, Name, Mode, Attributes); if (EFI_ERROR(Status)) { return Status; } + if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC && g_file_replace_list->new_file_virtual_id < g_virt_chunk_num) { @@ -1153,7 +1448,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open { g_original_fclose(*New); *New = &g_efi_file_replace.WrapperHandle; - ventoy_wrapper_file_procotol(*New); + ventoy_wrapper_file_procotol(*New, FALSE); virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id; @@ -1179,6 +1474,49 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open } } + + + if (g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC && + g_img_replace_list->new_file_virtual_id < g_virt_chunk_num) + { + AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name); + for (j = 0; j < g_img_replace_list->old_file_cnt; j++) + { + AsciiStrCpyS(OldName, sizeof(OldName), g_img_replace_list[i].old_file_name[j]); + if ((0 == AsciiStrCmp(OldName, TmpName)) || + (AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 && + AsciiStrCmp(OldName + 16, TmpName) == 0 + ) + ) + { + g_original_fclose(*New); + *New = &g_img_file_replace.WrapperHandle; + ventoy_wrapper_file_procotol(*New, TRUE); + + virt = g_virt_chunk + g_img_replace_list->new_file_virtual_id; + + Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start); + + g_img_file_replace.BlockIoSectorStart = virt->mem_sector_start; + g_img_file_replace.FileSizeBytes = Sectors * 2048; + + if (gDebugPrint) + { + debug("## ventoy_wrapper_file_open2 <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name, + g_img_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048); + sleep(3); + } + + return Status; + } + } + + if (StrCmp(Name, L"\\loader\\entries") == 0) + { + (*New)->Open = ventoy_wrapper_file_open; + } + } + return Status; } diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyDrv.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyDrv.c new file mode 100644 index 00000000..7886d66f --- /dev/null +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyDrv.c @@ -0,0 +1,140 @@ +/****************************************************************************** + * VtoyDrv.c + * + * Copyright (c) 2020, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC UINTN g_EfiDriverNameCnt = 0; +STATIC CHAR16 *g_EfiDriverNameList[1024] = { NULL }; + +STATIC EFI_STATUS AddEfiDriverName(IN CHAR16 *DriverName) +{ + UINTN i = 0; + + if (g_EfiDriverNameCnt >= 1024) + { + return EFI_OUT_OF_RESOURCES; + } + + for (i = 0; i < g_EfiDriverNameCnt; i++) + { + if (g_EfiDriverNameList[i] && StrCmp(g_EfiDriverNameList[i], DriverName) == 0) + { + break; + } + } + + if (i >= g_EfiDriverNameCnt) + { + g_EfiDriverNameList[g_EfiDriverNameCnt] = DriverName; + g_EfiDriverNameCnt++; + } + + return EFI_SUCCESS; +} + +EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine) +{ + UINTN i = 0; + UINTN Count = 0; + CHAR16 *DriverName = NULL; + EFI_HANDLE *Handles = NULL; + EFI_STATUS Status = EFI_SUCCESS; + EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL; + EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL; + + (VOID)ImageHandle; + (VOID)CmdLine; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid, + NULL, &Count, &Handles); + if (EFI_ERROR(Status)) + { + return Status; + } + + for (i = 0; i < Count; i++) + { + Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol); + if (EFI_ERROR(Status)) + { + continue; + } + + DriverName = NULL; + Status = VtoyGetComponentName(2, Name2Protocol, &DriverName); + if ((!EFI_ERROR(Status)) && (DriverName)) + { + AddEfiDriverName(DriverName); + } + } + + Count = 0; + FreePool(Handles); + Handles = NULL; + + Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid, + NULL, &Count, &Handles); + if (EFI_ERROR(Status)) + { + return Status; + } + + for (i = 0; i < Count; i++) + { + Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol); + if (EFI_ERROR(Status)) + { + continue; + } + + DriverName = NULL; + Status = VtoyGetComponentName(1, Name2Protocol, &DriverName); + if ((!EFI_ERROR(Status)) && (DriverName)) + { + AddEfiDriverName(DriverName); + } + } + + FreePool(Handles); + + for (i = 0; i < g_EfiDriverNameCnt; i++) + { + Printf("%2d %s\n", i, g_EfiDriverNameList[i]); + } + + return EFI_SUCCESS; +} + diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.c index 1e76055f..65212c23 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.c @@ -44,8 +44,39 @@ STATIC grub_env_printf_pf g_env_printf = NULL; STATIC VtoyUtilFeature gFeatureList[] = { { L"fix_windows_mmap", FixWindowsMemhole }, + { L"show_efi_drivers", ShowEfiDrivers }, }; +EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName) +{ + EFI_STATUS Status = EFI_SUCCESS; + CHAR16 *DrvName = NULL; + EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL; + EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL; + + if (1 == Ver) + { + NameProtocol = (EFI_COMPONENT_NAME_PROTOCOL *)Protocol; + Status = NameProtocol->GetDriverName(Protocol, "en", &DrvName); + if (EFI_ERROR(Status) || NULL == DrvName) + { + Status = NameProtocol->GetDriverName(Protocol, "eng", &DrvName); + } + } + else + { + Name2Protocol = (EFI_COMPONENT_NAME2_PROTOCOL *)Protocol; + Status = Name2Protocol->GetDriverName(Protocol, "en", &DrvName); + if (EFI_ERROR(Status) || NULL == DrvName) + { + Status = Name2Protocol->GetDriverName(Protocol, "eng", &DrvName); + } + } + + *DriverName = DrvName; + return Status; +} + VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...) { VA_LIST Marker; diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.h b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.h index 2ff64e6f..702a3f5f 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.h +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.h @@ -41,6 +41,7 @@ typedef struct ventoy_grub_param grub_env_get_pf grub_env_get; grub_env_set_pf grub_env_set; ventoy_grub_param_file_replace file_replace; + ventoy_grub_param_file_replace img_replace; grub_env_printf_pf grub_env_printf; }ventoy_grub_param; #pragma pack() @@ -57,7 +58,9 @@ VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...); #define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__) #define Printf VtoyUtilDebug +EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName); EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine); +EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine); #endif diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf index 9a4fbf27..c422b7d1 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf @@ -28,6 +28,7 @@ [Sources] VtoyUtil.h VtoyUtil.c + VtoyDrv.c Memhole.c [Packages] diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c index 1b0bfda9..7dc63f18 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/commands/hashsum.c @@ -69,7 +69,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result) grub_uint64_t total = 0; void *context; grub_uint8_t *readbuf; -#define BUF_SIZE 4096 +#define BUF_SIZE 1024 * 1024 readbuf = grub_malloc (BUF_SIZE); if (!readbuf) return grub_errno; @@ -94,7 +94,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result) { total += r; div = grub_divmod64(total * 100, (grub_uint64_t)file->size, &ro); - grub_printf("\rCalculating %d%% ", (int)div); + grub_printf("\rCalculating %s %d%% ", hash->name, (int)div); grub_refresh(); } } @@ -105,7 +105,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result) grub_free (context); if (progress) { - grub_printf("\rCalculating 100%% \n\r\n"); + grub_printf("\rCalculating %s 100%% \n\r\n", hash->name); grub_refresh(); } return GRUB_ERR_NONE; @@ -224,6 +224,8 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt, int keep = state[3].set; int uncompress = state[4].set; unsigned unread = 0; + int len = 0; + char hashsum[256]; for (i = 0; i < ARRAY_SIZE (aliases); i++) if (grub_strcmp (ctxt->extcmd->cmd->name, aliases[i].name) == 0) @@ -282,8 +284,12 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt, continue; } for (j = 0; j < hash->mdlen; j++) - grub_printf ("%02x", ((grub_uint8_t *) result)[j]); + { + grub_printf ("%02x", ((grub_uint8_t *) result)[j]); + len += grub_snprintf(hashsum + len, sizeof(hashsum) - len, "%02x", ((grub_uint8_t *) result)[j]); + } grub_printf (" %s\n", args[i]); + grub_env_set("VT_LAST_CHECK_SUM", hashsum); } if (unread) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/disk/loopback.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/disk/loopback.c new file mode 100644 index 00000000..ef946a49 --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/disk/loopback.c @@ -0,0 +1,257 @@ +/* loopback.c - command to add loopback devices. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2005,2006,2007 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +struct grub_loopback +{ + char *devname; + grub_file_t file; + struct grub_loopback *next; + unsigned long id; + grub_off_t skip; +}; + +static struct grub_loopback *loopback_list; +static unsigned long last_id = 0; + +static const struct grub_arg_option options[] = + { + /* TRANSLATORS: The disk is simply removed from the list of available ones, + not wiped, avoid to scare user. */ + {"delete", 'd', 0, N_("Delete the specified loopback drive."), 0, 0}, + {"skip", 's', 0, "skip sectors of the file.", "SECTORS", ARG_TYPE_INT }, + {0, 0, 0, 0, 0, 0} + }; + +/* Delete the loopback device NAME. */ +static grub_err_t +delete_loopback (const char *name) +{ + struct grub_loopback *dev; + struct grub_loopback **prev; + + /* Search for the device. */ + for (dev = loopback_list, prev = &loopback_list; + dev; + prev = &dev->next, dev = dev->next) + if (grub_strcmp (dev->devname, name) == 0) + break; + + if (! dev) + return grub_error (GRUB_ERR_BAD_DEVICE, "device not found"); + + /* Remove the device from the list. */ + *prev = dev->next; + + grub_free (dev->devname); + grub_file_close (dev->file); + grub_free (dev); + + return 0; +} + +/* The command to add and remove loopback devices. */ +static grub_err_t +grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args) +{ + struct grub_arg_list *state = ctxt->state; + grub_file_t file; + struct grub_loopback *newdev; + grub_err_t ret; + grub_off_t skip = 0; + + if (argc < 1) + return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required"); + + /* Check if `-d' was used. */ + if (state[0].set) + return delete_loopback (args[0]); + + if (state[1].set) + skip = (grub_off_t)grub_strtoull(state[1].arg, NULL, 10); + + if (argc < 2) + return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); + + file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK + | GRUB_FILE_TYPE_NO_DECOMPRESS); + if (! file) + return grub_errno; + + /* First try to replace the old device. */ + for (newdev = loopback_list; newdev; newdev = newdev->next) + if (grub_strcmp (newdev->devname, args[0]) == 0) + break; + + if (newdev) + { + grub_file_close (newdev->file); + newdev->file = file; + newdev->skip = skip; + + return 0; + } + + /* Unable to replace it, make a new entry. */ + newdev = grub_malloc (sizeof (struct grub_loopback)); + if (! newdev) + goto fail; + + newdev->devname = grub_strdup (args[0]); + if (! newdev->devname) + { + grub_free (newdev); + goto fail; + } + + newdev->file = file; + newdev->skip = skip; + newdev->id = last_id++; + + /* Add the new entry to the list. */ + newdev->next = loopback_list; + loopback_list = newdev; + + return 0; + +fail: + ret = grub_errno; + grub_file_close (file); + return ret; +} + + +static int +grub_loopback_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data, + grub_disk_pull_t pull) +{ + struct grub_loopback *d; + if (pull != GRUB_DISK_PULL_NONE) + return 0; + for (d = loopback_list; d; d = d->next) + { + if (hook (d->devname, hook_data)) + return 1; + } + return 0; +} + +static grub_err_t +grub_loopback_open (const char *name, grub_disk_t disk) +{ + struct grub_loopback *dev; + + for (dev = loopback_list; dev; dev = dev->next) + if (grub_strcmp (dev->devname, name) == 0) + break; + + if (! dev) + return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device"); + + /* Use the filesize for the disk size, round up to a complete sector. */ + if (dev->file->size != GRUB_FILE_SIZE_UNKNOWN) + disk->total_sectors = ((dev->file->size + GRUB_DISK_SECTOR_SIZE - 1) + / GRUB_DISK_SECTOR_SIZE); + else + disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN; + /* Avoid reading more than 512M. */ + disk->max_agglomerate = 1 << (29 - GRUB_DISK_SECTOR_BITS + - GRUB_DISK_CACHE_BITS); + + disk->id = dev->id; + + disk->data = dev; + + return 0; +} + +static grub_err_t +grub_loopback_read (grub_disk_t disk, grub_disk_addr_t sector, + grub_size_t size, char *buf) +{ + grub_file_t file = ((struct grub_loopback *) disk->data)->file; + grub_off_t skip = ((struct grub_loopback *) disk->data)->skip; + grub_off_t pos; + + grub_file_seek (file, (sector + skip) << GRUB_DISK_SECTOR_BITS); + + grub_file_read (file, buf, size << GRUB_DISK_SECTOR_BITS); + if (grub_errno) + return grub_errno; + + /* In case there is more data read than there is available, in case + of files that are not a multiple of GRUB_DISK_SECTOR_SIZE, fill + the rest with zeros. */ + pos = (sector + skip + size) << GRUB_DISK_SECTOR_BITS; + if (pos > file->size) + { + grub_size_t amount = pos - file->size; + grub_memset (buf + (size << GRUB_DISK_SECTOR_BITS) - amount, 0, amount); + } + + return 0; +} + +static grub_err_t +grub_loopback_write (grub_disk_t disk __attribute ((unused)), + grub_disk_addr_t sector __attribute ((unused)), + grub_size_t size __attribute ((unused)), + const char *buf __attribute ((unused))) +{ + return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, + "loopback write is not supported"); +} + +static struct grub_disk_dev grub_loopback_dev = + { + .name = "loopback", + .id = GRUB_DISK_DEVICE_LOOPBACK_ID, + .disk_iterate = grub_loopback_iterate, + .disk_open = grub_loopback_open, + .disk_read = grub_loopback_read, + .disk_write = grub_loopback_write, + .next = 0 + }; + +static grub_extcmd_t cmd; + +GRUB_MOD_INIT(loopback) +{ + cmd = grub_register_extcmd ("loopback", grub_cmd_loopback, 0, + N_("[-d] DEVICENAME FILE."), + /* TRANSLATORS: The file itself is not destroyed + or transformed into drive. */ + N_("Make a virtual drive from a file."), options); + grub_disk_dev_register (&grub_loopback_dev); +} + +GRUB_MOD_FINI(loopback) +{ + grub_unregister_extcmd (cmd); + grub_disk_dev_unregister (&grub_loopback_dev); +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/font/font.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/font/font.c new file mode 100644 index 00000000..b12fb6b9 --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/font/font.c @@ -0,0 +1,1603 @@ +/* font.c - Font API and font file loader. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2003,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +#if HAVE_FONT_SOURCE +#include "ascii.h" +#endif + +#ifndef FONT_DEBUG +#define FONT_DEBUG 0 +#endif + +struct char_index_entry +{ + grub_uint32_t code; + grub_uint8_t storage_flags; + grub_uint32_t offset; + + /* Glyph if loaded, or NULL otherwise. */ + struct grub_font_glyph *glyph; +}; + +#define FONT_WEIGHT_NORMAL 100 +#define FONT_WEIGHT_BOLD 200 +#define ASCII_BITMAP_SIZE 16 + +/* Definition of font registry. */ +struct grub_font_node *grub_font_list; + +static int register_font (grub_font_t font); +static void font_init (grub_font_t font); +static void free_font (grub_font_t font); +static void remove_font (grub_font_t font); + +struct font_file_section +{ + /* The file this section is in. */ + grub_file_t file; + + /* FOURCC name of the section. */ + char name[4]; + + /* Length of the section contents. */ + grub_uint32_t length; + + /* Set by open_section() on EOF. */ + int eof; +}; + +/* Replace unknown glyphs with a rounded question mark. */ +static grub_uint8_t unknown_glyph_bitmap[] = { + /* 76543210 */ + 0x7C, /* ooooo */ + 0x82, /* o o */ + 0xBA, /* o ooo o */ + 0xAA, /* o o o o */ + 0xAA, /* o o o o */ + 0x8A, /* o o o */ + 0x9A, /* o oo o */ + 0x92, /* o o o */ + 0x92, /* o o o */ + 0x92, /* o o o */ + 0x92, /* o o o */ + 0x82, /* o o */ + 0x92, /* o o o */ + 0x82, /* o o */ + 0x7C, /* ooooo */ + 0x00 /* */ +}; + +/* The "unknown glyph" glyph, used as a last resort. */ +static struct grub_font_glyph *unknown_glyph; + +/* The font structure used when no other font is loaded. This functions + as a "Null Object" pattern, so that code everywhere does not have to + check for a NULL grub_font_t to avoid dereferencing a null pointer. */ +static struct grub_font null_font; + +/* Flag to ensure module is initialized only once. */ +static grub_uint8_t font_loader_initialized; + +#if HAVE_FONT_SOURCE +static struct grub_font_glyph *ascii_font_glyph[0x80]; +#endif + +static struct grub_font_glyph * +ascii_glyph_lookup (grub_uint32_t code) +{ +#if HAVE_FONT_SOURCE + static int ascii_failback_initialized = 0; + + if (code >= 0x80) + return NULL; + + if (ascii_failback_initialized == 0) + { + int current; + for (current = 0; current < 0x80; current++) + { + ascii_font_glyph[current] = + grub_malloc (sizeof (struct grub_font_glyph) + ASCII_BITMAP_SIZE); + + ascii_font_glyph[current]->width = 8; + ascii_font_glyph[current]->height = 16; + ascii_font_glyph[current]->offset_x = 0; + ascii_font_glyph[current]->offset_y = -2; + ascii_font_glyph[current]->device_width = 8; + ascii_font_glyph[current]->font = NULL; + + grub_memcpy (ascii_font_glyph[current]->bitmap, + &ascii_bitmaps[current * ASCII_BITMAP_SIZE], + ASCII_BITMAP_SIZE); + } + + ascii_failback_initialized = 1; + } + + return ascii_font_glyph[code]; +#else + (void) code; + return NULL; +#endif +} + +void +grub_font_loader_init (void) +{ + /* Only initialize font loader once. */ + if (font_loader_initialized) + return; + + /* Make glyph for unknown glyph. */ + unknown_glyph = grub_malloc (sizeof (struct grub_font_glyph) + + sizeof (unknown_glyph_bitmap)); + if (!unknown_glyph) + return; + + unknown_glyph->width = 8; + unknown_glyph->height = 16; + unknown_glyph->offset_x = 0; + unknown_glyph->offset_y = -3; + unknown_glyph->device_width = 8; + grub_memcpy (unknown_glyph->bitmap, + unknown_glyph_bitmap, sizeof (unknown_glyph_bitmap)); + + /* Initialize the null font. */ + font_init (&null_font); + /* FIXME: Fix this slightly improper cast. */ + null_font.name = (char *) ""; + null_font.ascent = unknown_glyph->height - 3; + null_font.descent = 3; + null_font.max_char_width = unknown_glyph->width; + null_font.max_char_height = unknown_glyph->height; + + font_loader_initialized = 1; +} + +/* Initialize the font object with initial default values. */ +static void +font_init (grub_font_t font) +{ + font->name = 0; + font->file = 0; + font->family = 0; + font->point_size = 0; + font->weight = 0; + + /* Default leading value, not in font file yet. */ + font->leading = 1; + + font->max_char_width = 0; + font->max_char_height = 0; + font->ascent = 0; + font->descent = 0; + font->num_chars = 0; + font->char_index = 0; + font->bmp_idx = 0; +} + +/* Open the next section in the file. + + On success, the section name is stored in section->name and the length in + section->length, and 0 is returned. On failure, 1 is returned and + grub_errno is set appropriately with an error message. + + If 1 is returned due to being at the end of the file, then section->eof is + set to 1; otherwise, section->eof is set to 0. */ +static int +open_section (grub_file_t file, struct font_file_section *section) +{ + grub_ssize_t retval; + grub_uint32_t raw_length; + + section->file = file; + section->eof = 0; + + /* Read the FOURCC section name. */ + retval = grub_file_read (file, section->name, 4); + if (retval >= 0 && retval < 4) + { + /* EOF encountered. */ + section->eof = 1; + return 1; + } + else if (retval < 0) + { + /* Read error. */ + return 1; + } + + /* Read the big-endian 32-bit section length. */ + retval = grub_file_read (file, &raw_length, 4); + if (retval >= 0 && retval < 4) + { + /* EOF encountered. */ + section->eof = 1; + return 1; + } + else if (retval < 0) + { + /* Read error. */ + return 1; + } + + /* Convert byte-order and store in *length. */ + section->length = grub_be_to_cpu32 (raw_length); + + return 0; +} + +/* Size in bytes of each character index (CHIX section) + entry in the font file. */ +#define FONT_CHAR_INDEX_ENTRY_SIZE (4 + 1 + 4) + +/* Load the character index (CHIX) section contents from the font file. This + presumes that the position of FILE is positioned immediately after the + section length for the CHIX section (i.e., at the start of the section + contents). Returns 0 upon success, nonzero for failure (in which case + grub_errno is set appropriately). */ +static int +load_font_index (grub_file_t file, grub_uint32_t sect_length, struct + grub_font *font) +{ + unsigned i; + grub_uint32_t last_code; + +#if FONT_DEBUG >= 2 + grub_dprintf ("font", "load_font_index(sect_length=%d)\n", sect_length); +#endif + + /* Sanity check: ensure section length is divisible by the entry size. */ + if ((sect_length % FONT_CHAR_INDEX_ENTRY_SIZE) != 0) + { + grub_error (GRUB_ERR_BAD_FONT, + "font file format error: character index length %d " + "is not a multiple of the entry size %d", + sect_length, FONT_CHAR_INDEX_ENTRY_SIZE); + return 1; + } + + /* Calculate the number of characters. */ + font->num_chars = sect_length / FONT_CHAR_INDEX_ENTRY_SIZE; + + /* Allocate the character index array. */ + font->char_index = grub_malloc (font->num_chars + * sizeof (struct char_index_entry)); + if (!font->char_index) + return 1; + font->bmp_idx = grub_malloc (0x10000 * sizeof (grub_uint16_t)); + if (!font->bmp_idx) + return 1; + grub_memset (font->bmp_idx, 0xff, 0x10000 * sizeof (grub_uint16_t)); + + +#if FONT_DEBUG >= 2 + grub_dprintf ("font", "num_chars=%d)\n", font->num_chars); +#endif + + last_code = 0; + + /* Load the character index data from the file. */ + for (i = 0; i < font->num_chars; i++) + { + struct char_index_entry *entry = &font->char_index[i]; + + /* Read code point value; convert to native byte order. */ + if (grub_file_read (file, &entry->code, 4) != 4) + return 1; + entry->code = grub_be_to_cpu32 (entry->code); + + /* Verify that characters are in ascending order. */ + if (i != 0 && entry->code <= last_code) + { + grub_error (GRUB_ERR_BAD_FONT, + "font characters not in ascending order: %u <= %u", + entry->code, last_code); + return 1; + } + + if (entry->code < 0x10000) + font->bmp_idx[entry->code] = i; + + last_code = entry->code; + + /* Read storage flags byte. */ + if (grub_file_read (file, &entry->storage_flags, 1) != 1) + return 1; + + /* Read glyph data offset; convert to native byte order. */ + if (grub_file_read (file, &entry->offset, 4) != 4) + return 1; + entry->offset = grub_be_to_cpu32 (entry->offset); + + /* No glyph loaded. Will be loaded on demand and cached thereafter. */ + entry->glyph = 0; + +#if FONT_DEBUG >= 5 + /* Print the 1st 10 characters. */ + if (i < 10) + grub_dprintf ("font", "c=%d o=%d\n", entry->code, entry->offset); +#endif + } + + return 0; +} + +/* Read the contents of the specified section as a string, which is + allocated on the heap. Returns 0 if there is an error. */ +static char * +read_section_as_string (struct font_file_section *section) +{ + char *str; + grub_ssize_t ret; + + str = grub_malloc (section->length + 1); + if (!str) + return 0; + + ret = grub_file_read (section->file, str, section->length); + if (ret < 0 || ret != (grub_ssize_t) section->length) + { + grub_free (str); + return 0; + } + + str[section->length] = '\0'; + return str; +} + +/* Read the contents of the current section as a 16-bit integer value, + which is stored into *VALUE. + Returns 0 upon success, nonzero upon failure. */ +static int +read_section_as_short (struct font_file_section *section, + grub_int16_t * value) +{ + grub_uint16_t raw_value; + + if (section->length != 2) + { + grub_error (GRUB_ERR_BAD_FONT, + "font file format error: section %c%c%c%c length " + "is %d but should be 2", + section->name[0], section->name[1], + section->name[2], section->name[3], section->length); + return 1; + } + if (grub_file_read (section->file, &raw_value, 2) != 2) + return 1; + + *value = grub_be_to_cpu16 (raw_value); + return 0; +} + +/* Load a font and add it to the beginning of the global font list. + Returns 0 upon success, nonzero upon failure. */ +grub_font_t +grub_font_load (const char *filename) +{ + grub_file_t file = 0; + struct font_file_section section; + char magic[4]; + grub_font_t font = 0; + +#if FONT_DEBUG >= 1 + grub_dprintf ("font", "add_font(%s)\n", filename); +#endif + + if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+') + file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024); + else if (grub_strncmp(filename, "mem:", 4) == 0) + file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024); + else + { + const char *prefix = grub_env_get ("prefix"); + char *fullname, *ptr; + if (!prefix) + { + grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("variable `%s' isn't set"), + "prefix"); + goto fail; + } + fullname = grub_malloc (grub_strlen (prefix) + grub_strlen (filename) + 1 + + sizeof ("/fonts/") + sizeof (".pf2")); + if (!fullname) + goto fail; + ptr = grub_stpcpy (fullname, prefix); + ptr = grub_stpcpy (ptr, "/fonts/"); + ptr = grub_stpcpy (ptr, filename); + ptr = grub_stpcpy (ptr, ".pf2"); + *ptr = 0; + file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024); + grub_free (fullname); + } + if (!file) + goto fail; + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "file opened\n"); +#endif + + /* Read the FILE section. It indicates the file format. */ + if (open_section (file, §ion) != 0) + goto fail; + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "opened FILE section\n"); +#endif + if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FILE, + sizeof (FONT_FORMAT_SECTION_NAMES_FILE) - 1) != 0) + { + grub_error (GRUB_ERR_BAD_FONT, + "font file format error: 1st section must be FILE"); + goto fail; + } + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "section name ok\n"); +#endif + if (section.length != 4) + { + grub_error (GRUB_ERR_BAD_FONT, + "font file format error (file type ID length is %d " + "but should be 4)", section.length); + goto fail; + } + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "section length ok\n"); +#endif + /* Check the file format type code. */ + if (grub_file_read (file, magic, 4) != 4) + goto fail; + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "read magic ok\n"); +#endif + + if (grub_memcmp (magic, FONT_FORMAT_PFF2_MAGIC, 4) != 0) + { + grub_error (GRUB_ERR_BAD_FONT, "invalid font magic %x %x %x %x", + magic[0], magic[1], magic[2], magic[3]); + goto fail; + } + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "compare magic ok\n"); +#endif + + /* Allocate the font object. */ + font = (grub_font_t) grub_zalloc (sizeof (struct grub_font)); + if (!font) + goto fail; + + font_init (font); + font->file = file; + +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "allocate font ok; loading font info\n"); +#endif + + /* Load the font information. */ + while (1) + { + if (open_section (file, §ion) != 0) + { + if (section.eof) + break; /* Done reading the font file. */ + else + goto fail; + } + +#if FONT_DEBUG >= 2 + grub_dprintf ("font", "opened section %c%c%c%c ok\n", + section.name[0], section.name[1], + section.name[2], section.name[3]); +#endif + + if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FONT_NAME, + sizeof (FONT_FORMAT_SECTION_NAMES_FONT_NAME) - 1) == 0) + { + font->name = read_section_as_string (§ion); + if (!font->name) + goto fail; + } + else if (grub_memcmp (section.name, + FONT_FORMAT_SECTION_NAMES_POINT_SIZE, + sizeof (FONT_FORMAT_SECTION_NAMES_POINT_SIZE) - + 1) == 0) + { + if (read_section_as_short (§ion, &font->point_size) != 0) + goto fail; + } + else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_WEIGHT, + sizeof (FONT_FORMAT_SECTION_NAMES_WEIGHT) - 1) + == 0) + { + char *wt; + wt = read_section_as_string (§ion); + if (!wt) + continue; + /* Convert the weight string 'normal' or 'bold' into a number. */ + if (grub_strcmp (wt, "normal") == 0) + font->weight = FONT_WEIGHT_NORMAL; + else if (grub_strcmp (wt, "bold") == 0) + font->weight = FONT_WEIGHT_BOLD; + grub_free (wt); + } + else if (grub_memcmp (section.name, + FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH, + sizeof (FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH) + - 1) == 0) + { + if (read_section_as_short (§ion, &font->max_char_width) != 0) + goto fail; + } + else if (grub_memcmp (section.name, + FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT, + sizeof (FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT) + - 1) == 0) + { + if (read_section_as_short (§ion, &font->max_char_height) != 0) + goto fail; + } + else if (grub_memcmp (section.name, + FONT_FORMAT_SECTION_NAMES_ASCENT, + sizeof (FONT_FORMAT_SECTION_NAMES_ASCENT) - 1) + == 0) + { + if (read_section_as_short (§ion, &font->ascent) != 0) + goto fail; + } + else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DESCENT, + sizeof (FONT_FORMAT_SECTION_NAMES_DESCENT) - 1) + == 0) + { + if (read_section_as_short (§ion, &font->descent) != 0) + goto fail; + } + else if (grub_memcmp (section.name, + FONT_FORMAT_SECTION_NAMES_CHAR_INDEX, + sizeof (FONT_FORMAT_SECTION_NAMES_CHAR_INDEX) - + 1) == 0) + { + if (load_font_index (file, section.length, font) != 0) + goto fail; + } + else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DATA, + sizeof (FONT_FORMAT_SECTION_NAMES_DATA) - 1) == 0) + { + /* When the DATA section marker is reached, we stop reading. */ + break; + } + else + { + /* Unhandled section type, simply skip past it. */ +#if FONT_DEBUG >= 3 + grub_dprintf ("font", "Unhandled section type, skipping.\n"); +#endif + grub_off_t section_end = grub_file_tell (file) + section.length; + if ((int) grub_file_seek (file, section_end) == -1) + goto fail; + } + } + + if (!font->name) + { + grub_dprintf ("font", "Font has no name.\n"); + font->name = grub_strdup ("Unknown"); + } + +#if FONT_DEBUG >= 1 + grub_dprintf ("font", "Loaded font `%s'.\n" + "Ascent=%d Descent=%d MaxW=%d MaxH=%d Number of characters=%d.\n", + font->name, + font->ascent, font->descent, + font->max_char_width, font->max_char_height, font->num_chars); +#endif + + if (font->max_char_width == 0 + || font->max_char_height == 0 + || font->num_chars == 0 + || font->char_index == 0 || font->ascent == 0 || font->descent == 0) + { + grub_error (GRUB_ERR_BAD_FONT, + "invalid font file: missing some required data"); + goto fail; + } + + /* Add the font to the global font registry. */ + if (register_font (font) != 0) + goto fail; + + return font; + +fail: + if (file) + grub_file_close (file); + if (font) + font->file = 0; + + free_font (font); + return 0; +} + +/* Read a 16-bit big-endian integer from FILE, convert it to native byte + order, and store it in *VALUE. + Returns 0 on success, 1 on failure. */ +static int +read_be_uint16 (grub_file_t file, grub_uint16_t * value) +{ + if (grub_file_read (file, value, 2) != 2) + return 1; + *value = grub_be_to_cpu16 (*value); + return 0; +} + +static int +read_be_int16 (grub_file_t file, grub_int16_t * value) +{ + /* For the signed integer version, use the same code as for unsigned. */ + return read_be_uint16 (file, (grub_uint16_t *) value); +} + +/* Return a pointer to the character index entry for the glyph corresponding to + the codepoint CODE in the font FONT. If not found, return zero. */ +static inline struct char_index_entry * +find_glyph (const grub_font_t font, grub_uint32_t code) +{ + struct char_index_entry *table; + grub_size_t lo; + grub_size_t hi; + grub_size_t mid; + + table = font->char_index; + + /* Use BMP index if possible. */ + if (code < 0x10000 && font->bmp_idx) + { + if (font->bmp_idx[code] == 0xffff) + return 0; + return &table[font->bmp_idx[code]]; + } + + /* Do a binary search in `char_index', which is ordered by code point. */ + lo = 0; + hi = font->num_chars - 1; + + if (!table) + return 0; + + while (lo <= hi) + { + mid = lo + (hi - lo) / 2; + if (code < table[mid].code) + hi = mid - 1; + else if (code > table[mid].code) + lo = mid + 1; + else + return &table[mid]; + } + + return 0; +} + +/* Get a glyph for the Unicode character CODE in FONT. The glyph is loaded + from the font file if has not been loaded yet. + Returns a pointer to the glyph if found, or 0 if it is not found. */ +static struct grub_font_glyph * +grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code) +{ + struct char_index_entry *index_entry; + + index_entry = find_glyph (font, code); + if (index_entry) + { + struct grub_font_glyph *glyph = 0; + grub_uint16_t width; + grub_uint16_t height; + grub_int16_t xoff; + grub_int16_t yoff; + grub_int16_t dwidth; + int len; + + if (index_entry->glyph) + /* Return cached glyph. */ + return index_entry->glyph; + + if (!font->file) + /* No open file, can't load any glyphs. */ + return 0; + + /* Make sure we can find glyphs for error messages. Push active + error message to error stack and reset error message. */ + grub_error_push (); + + grub_file_seek (font->file, index_entry->offset); + + /* Read the glyph width, height, and baseline. */ + if (read_be_uint16 (font->file, &width) != 0 + || read_be_uint16 (font->file, &height) != 0 + || read_be_int16 (font->file, &xoff) != 0 + || read_be_int16 (font->file, &yoff) != 0 + || read_be_int16 (font->file, &dwidth) != 0) + { + remove_font (font); + return 0; + } + + len = (width * height + 7) / 8; + glyph = grub_malloc (sizeof (struct grub_font_glyph) + len); + if (!glyph) + { + remove_font (font); + return 0; + } + + glyph->font = font; + glyph->width = width; + glyph->height = height; + glyph->offset_x = xoff; + glyph->offset_y = yoff; + glyph->device_width = dwidth; + + /* Don't try to read empty bitmaps (e.g., space characters). */ + if (len != 0) + { + if (grub_file_read (font->file, glyph->bitmap, len) != len) + { + remove_font (font); + grub_free (glyph); + return 0; + } + } + + /* Restore old error message. */ + grub_error_pop (); + + /* Cache the glyph. */ + index_entry->glyph = glyph; + + return glyph; + } + + return 0; +} + +/* Free the memory used by FONT. + This should not be called if the font has been made available to + users (once it is added to the global font list), since there would + be the possibility of a dangling pointer. */ +static void +free_font (grub_font_t font) +{ + if (font) + { + if (font->file) + grub_file_close (font->file); + grub_free (font->name); + grub_free (font->family); + grub_free (font->char_index); + grub_free (font->bmp_idx); + grub_free (font); + } +} + +/* Add FONT to the global font registry. + Returns 0 upon success, nonzero on failure + (the font was not registered). */ +static int +register_font (grub_font_t font) +{ + struct grub_font_node *node = 0; + + node = grub_malloc (sizeof (struct grub_font_node)); + if (!node) + return 1; + + node->value = font; + node->next = grub_font_list; + grub_font_list = node; + + return 0; +} + +/* Remove the font from the global font list. We don't actually free the + font's memory since users could be holding references to the font. */ +static void +remove_font (grub_font_t font) +{ + struct grub_font_node **nextp, *cur; + + for (nextp = &grub_font_list, cur = *nextp; + cur; nextp = &cur->next, cur = cur->next) + { + if (cur->value == font) + { + *nextp = cur->next; + + /* Free the node, but not the font itself. */ + grub_free (cur); + + return; + } + } +} + +/* Get a font from the list of loaded fonts. This function will return + another font if the requested font is not available. If no fonts are + loaded, then a special 'null font' is returned, which contains no glyphs, + but is not a null pointer so the caller may omit checks for NULL. */ +grub_font_t +grub_font_get (const char *font_name) +{ + struct grub_font_node *node; + + for (node = grub_font_list; node; node = node->next) + { + grub_font_t font = node->value; + if (grub_strcmp (font->name, font_name) == 0) + return font; + } + + /* If no font by that name is found, return the first font in the list + as a fallback. */ + if (grub_font_list && grub_font_list->value) + return grub_font_list->value; + else + /* The null_font is a last resort. */ + return &null_font; +} + +/* Get the full name of the font. */ +const char * +grub_font_get_name (grub_font_t font) +{ + return font->name; +} + +/* Get the maximum width of any character in the font in pixels. */ +int +grub_font_get_max_char_width (grub_font_t font) +{ + return font->max_char_width; +} + +/* Get the distance in pixels from the baseline to the lowest descenders + (for instance, in a lowercase 'y', 'g', etc.). */ +int +grub_font_get_descent (grub_font_t font) +{ + return font->descent; +} + +/* FIXME: not correct for all fonts. */ +int +grub_font_get_xheight (grub_font_t font) +{ + return font->ascent / 2; +} + +/* Get the *standard leading* of the font in pixel, which is the spacing + between two lines of text. Specifically, it is the space between the + descent of one line and the ascent of the next line. This is included + in the *height* metric. */ +int +grub_font_get_leading (grub_font_t font) +{ + return font->leading; +} + +/* Get the distance in pixels between baselines of adjacent lines of text. */ +int +grub_font_get_height (grub_font_t font) +{ + return font->ascent + font->descent + font->leading; +} + +/* Get the glyph for FONT corresponding to the Unicode code point CODE. + Returns the ASCII glyph for the code if no other fonts are available. + The glyphs are cached once loaded. */ +struct grub_font_glyph * +grub_font_get_glyph (grub_font_t font, grub_uint32_t code) +{ + struct grub_font_glyph *glyph = 0; + if (font) + glyph = grub_font_get_glyph_internal (font, code); + if (glyph == 0) + { + glyph = ascii_glyph_lookup (code); + } + return glyph; +} + + +/* Calculate a subject value representing "how similar" two fonts are. + This is used to prioritize the order that fonts are scanned for missing + glyphs. The object is to select glyphs from the most similar font + possible, for the best appearance. + The heuristic is crude, but it helps greatly when fonts of similar + sizes are used so that tiny 8 point glyphs are not mixed into a string + of 24 point text unless there is no other choice. */ +static int +get_font_diversity (grub_font_t a, grub_font_t b) +{ + int d; + + d = 0; + + if (a->ascent && b->ascent) + d += grub_abs (a->ascent - b->ascent) * 8; + else + /* Penalty for missing attributes. */ + d += 50; + + if (a->max_char_height && b->max_char_height) + d += grub_abs (a->max_char_height - b->max_char_height) * 8; + else + /* Penalty for missing attributes. */ + d += 50; + + /* Weight is a minor factor. */ + d += (a->weight != b->weight) ? 5 : 0; + + return d; +} + +/* Get a glyph corresponding to the codepoint CODE. If FONT contains the + specified glyph, then it is returned. Otherwise, all other loaded fonts + are searched until one is found that contains a glyph for CODE. + If no glyph is available for CODE in the loaded fonts, then a glyph + representing an unknown character is returned. + This function never returns NULL. + The returned glyph is owned by the font manager and should not be freed + by the caller. The glyphs are cached. */ +struct grub_font_glyph * +grub_font_get_glyph_with_fallback (grub_font_t font, grub_uint32_t code) +{ + struct grub_font_glyph *glyph; + struct grub_font_node *node; + /* Keep track of next node, in case there's an I/O error in + grub_font_get_glyph_internal() and the font is removed from the list. */ + struct grub_font_node *next; + /* Information on the best glyph found so far, to help find the glyph in + the best matching to the requested one. */ + int best_diversity; + struct grub_font_glyph *best_glyph; + + if (font) + { + /* First try to get the glyph from the specified font. */ + glyph = grub_font_get_glyph_internal (font, code); + if (glyph) + return glyph; + } + + /* Otherwise, search all loaded fonts for the glyph and use the one from + the font that best matches the requested font. */ + best_diversity = 10000; + best_glyph = 0; + + for (node = grub_font_list; node; node = next) + { + grub_font_t curfont; + + curfont = node->value; + next = node->next; + + glyph = grub_font_get_glyph_internal (curfont, code); + if (glyph && !font) + return glyph; + if (glyph) + { + int d; + + d = get_font_diversity (curfont, font); + if (d < best_diversity) + { + best_diversity = d; + best_glyph = glyph; + } + } + } + + return best_glyph; +} + +#if 0 +static struct grub_font_glyph * +grub_font_dup_glyph (struct grub_font_glyph *glyph) +{ + static struct grub_font_glyph *ret; + ret = grub_malloc (sizeof (*ret) + (glyph->width * glyph->height + 7) / 8); + if (!ret) + return NULL; + grub_memcpy (ret, glyph, sizeof (*ret) + + (glyph->width * glyph->height + 7) / 8); + return ret; +} +#endif + +/* FIXME: suboptimal. */ +static void +grub_font_blit_glyph (struct grub_font_glyph *target, + struct grub_font_glyph *src, unsigned dx, unsigned dy) +{ + unsigned src_bit, tgt_bit, src_byte, tgt_byte; + unsigned i, j; + for (i = 0; i < src->height; i++) + { + src_bit = (src->width * i) % 8; + src_byte = (src->width * i) / 8; + tgt_bit = (target->width * (dy + i) + dx) % 8; + tgt_byte = (target->width * (dy + i) + dx) / 8; + for (j = 0; j < src->width; j++) + { + target->bitmap[tgt_byte] |= ((src->bitmap[src_byte] << src_bit) + & 0x80) >> tgt_bit; + src_bit++; + tgt_bit++; + if (src_bit == 8) + { + src_byte++; + src_bit = 0; + } + if (tgt_bit == 8) + { + tgt_byte++; + tgt_bit = 0; + } + } + } +} + +static void +grub_font_blit_glyph_mirror (struct grub_font_glyph *target, + struct grub_font_glyph *src, + unsigned dx, unsigned dy) +{ + unsigned tgt_bit, src_byte, tgt_byte; + signed src_bit; + unsigned i, j; + for (i = 0; i < src->height; i++) + { + src_bit = (src->width * i + src->width - 1) % 8; + src_byte = (src->width * i + src->width - 1) / 8; + tgt_bit = (target->width * (dy + i) + dx) % 8; + tgt_byte = (target->width * (dy + i) + dx) / 8; + for (j = 0; j < src->width; j++) + { + target->bitmap[tgt_byte] |= ((src->bitmap[src_byte] << src_bit) + & 0x80) >> tgt_bit; + src_bit--; + tgt_bit++; + if (src_bit == -1) + { + src_byte--; + src_bit = 7; + } + if (tgt_bit == 8) + { + tgt_byte++; + tgt_bit = 0; + } + } + } +} + +/* Context for blit_comb. */ +struct blit_comb_ctx +{ + struct grub_font_glyph *glyph; + int *device_width; + struct grub_video_signed_rect bounds; +}; + +/* Helper for blit_comb. */ +static void +do_blit (struct grub_font_glyph *src, signed dx, signed dy, + struct blit_comb_ctx *ctx) +{ + if (ctx->glyph) + grub_font_blit_glyph (ctx->glyph, src, dx - ctx->glyph->offset_x, + (ctx->glyph->height + ctx->glyph->offset_y) + dy); + if (dx < ctx->bounds.x) + { + ctx->bounds.width += ctx->bounds.x - dx; + ctx->bounds.x = dx; + } + if (ctx->bounds.y > -src->height - dy) + { + ctx->bounds.height += ctx->bounds.y - (-src->height - dy); + ctx->bounds.y = (-src->height - dy); + } + if (dx + src->width - ctx->bounds.x >= (signed) ctx->bounds.width) + ctx->bounds.width = dx + src->width - ctx->bounds.x + 1; + if ((signed) ctx->bounds.height < src->height + (-src->height - dy) + - ctx->bounds.y) + ctx->bounds.height = src->height + (-src->height - dy) - ctx->bounds.y; +} + +/* Helper for blit_comb. */ +static inline void +add_device_width (int val, struct blit_comb_ctx *ctx) +{ + if (ctx->glyph) + ctx->glyph->device_width += val; + if (ctx->device_width) + *ctx->device_width += val; +} + +static void +blit_comb (const struct grub_unicode_glyph *glyph_id, + struct grub_font_glyph *glyph, + struct grub_video_signed_rect *bounds_out, + struct grub_font_glyph *main_glyph, + struct grub_font_glyph **combining_glyphs, int *device_width) +{ + struct blit_comb_ctx ctx = { + .glyph = glyph, + .device_width = device_width + }; + unsigned i; + signed above_rightx, above_righty; + signed above_leftx, above_lefty; + signed below_rightx, below_righty; + signed min_devwidth = 0; + const struct grub_unicode_combining *comb; + + if (glyph) + glyph->device_width = main_glyph->device_width; + if (device_width) + *device_width = main_glyph->device_width; + + ctx.bounds.x = main_glyph->offset_x; + ctx.bounds.y = main_glyph->offset_y; + ctx.bounds.width = main_glyph->width; + ctx.bounds.height = main_glyph->height; + + above_rightx = main_glyph->offset_x + main_glyph->width; + above_righty = ctx.bounds.y + ctx.bounds.height; + + above_leftx = main_glyph->offset_x; + above_lefty = ctx.bounds.y + ctx.bounds.height; + + below_rightx = ctx.bounds.x + ctx.bounds.width; + below_righty = ctx.bounds.y; + + comb = grub_unicode_get_comb (glyph_id); + + for (i = 0; i < glyph_id->ncomb; i++) + { + grub_int16_t space = 0; + /* Center by default. */ + grub_int16_t targetx; + + if (!combining_glyphs[i]) + continue; + targetx = (ctx.bounds.width - combining_glyphs[i]->width) / 2 + ctx.bounds.x; + /* CGJ is to avoid diacritics reordering. */ + if (comb[i].code + == GRUB_UNICODE_COMBINING_GRAPHEME_JOINER) + continue; + switch (comb[i].type) + { + case GRUB_UNICODE_COMB_OVERLAY: + do_blit (combining_glyphs[i], + targetx, + (ctx.bounds.height - combining_glyphs[i]->height) / 2 + - (ctx.bounds.height + ctx.bounds.y), &ctx); + if (min_devwidth < combining_glyphs[i]->width) + min_devwidth = combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT: + do_blit (combining_glyphs[i], above_rightx, -above_righty, &ctx); + above_rightx += combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_ABOVE_RIGHT: + do_blit (combining_glyphs[i], above_rightx, + -(above_righty + combining_glyphs[i]->height), &ctx); + above_rightx += combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_ABOVE_LEFT: + above_leftx -= combining_glyphs[i]->width; + do_blit (combining_glyphs[i], above_leftx, + -(above_lefty + combining_glyphs[i]->height), &ctx); + break; + + case GRUB_UNICODE_COMB_BELOW_RIGHT: + do_blit (combining_glyphs[i], below_rightx, below_righty, &ctx); + below_rightx += combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_HEBREW_HOLAM: + if (glyph_id->base != GRUB_UNICODE_HEBREW_WAW) + targetx = + main_glyph->offset_x - combining_glyphs[i]->width - + (combining_glyphs[i]->width + 3) / 4; + goto above_on_main; + + case GRUB_UNICODE_COMB_HEBREW_SIN_DOT: + targetx = main_glyph->offset_x + combining_glyphs[i]->width / 4; + goto above_on_main; + + case GRUB_UNICODE_COMB_HEBREW_SHIN_DOT: + targetx = + main_glyph->width + main_glyph->offset_x - + combining_glyphs[i]->width; + above_on_main: + space = combining_glyphs[i]->offset_y + - grub_font_get_xheight (combining_glyphs[i]->font) - 1; + if (space <= 0) + space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; + do_blit (combining_glyphs[i], targetx, + -(main_glyph->height + main_glyph->offset_y + space + + combining_glyphs[i]->height), &ctx); + if (min_devwidth < combining_glyphs[i]->width) + min_devwidth = combining_glyphs[i]->width; + break; + + /* TODO: Put dammah, fathah and alif nearer to shadda. */ + case GRUB_UNICODE_COMB_SYRIAC_SUPERSCRIPT_ALAPH: + case GRUB_UNICODE_COMB_ARABIC_DAMMAH: + case GRUB_UNICODE_COMB_ARABIC_DAMMATAN: + case GRUB_UNICODE_COMB_ARABIC_FATHATAN: + case GRUB_UNICODE_COMB_ARABIC_FATHAH: + case GRUB_UNICODE_COMB_ARABIC_SUPERSCRIPT_ALIF: + case GRUB_UNICODE_COMB_ARABIC_SUKUN: + case GRUB_UNICODE_COMB_ARABIC_SHADDA: + case GRUB_UNICODE_COMB_HEBREW_RAFE: + case GRUB_UNICODE_STACK_ABOVE: + stacked_above: + space = combining_glyphs[i]->offset_y + - grub_font_get_xheight (combining_glyphs[i]->font) - 1; + if (space <= 0) + space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; + /* Fallthrough. */ + case GRUB_UNICODE_STACK_ATTACHED_ABOVE: + do_blit (combining_glyphs[i], targetx, + -(ctx.bounds.height + ctx.bounds.y + space + + combining_glyphs[i]->height), &ctx); + if (min_devwidth < combining_glyphs[i]->width) + min_devwidth = combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_HEBREW_DAGESH: + do_blit (combining_glyphs[i], targetx, + -(ctx.bounds.height / 2 + ctx.bounds.y + + combining_glyphs[i]->height / 2), &ctx); + if (min_devwidth < combining_glyphs[i]->width) + min_devwidth = combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_HEBREW_SHEVA: + case GRUB_UNICODE_COMB_HEBREW_HIRIQ: + case GRUB_UNICODE_COMB_HEBREW_QAMATS: + case GRUB_UNICODE_COMB_HEBREW_TSERE: + case GRUB_UNICODE_COMB_HEBREW_SEGOL: + /* TODO: placement in final kaf and under reish. */ + + case GRUB_UNICODE_COMB_HEBREW_HATAF_SEGOL: + case GRUB_UNICODE_COMB_HEBREW_HATAF_PATAH: + case GRUB_UNICODE_COMB_HEBREW_HATAF_QAMATS: + case GRUB_UNICODE_COMB_HEBREW_PATAH: + case GRUB_UNICODE_COMB_HEBREW_QUBUTS: + case GRUB_UNICODE_COMB_HEBREW_METEG: + /* TODO: Put kasra and kasratan under shadda. */ + case GRUB_UNICODE_COMB_ARABIC_KASRA: + case GRUB_UNICODE_COMB_ARABIC_KASRATAN: + /* I don't know how ypogegrammeni differs from subscript. */ + case GRUB_UNICODE_COMB_YPOGEGRAMMENI: + case GRUB_UNICODE_STACK_BELOW: + stacked_below: + space = -(combining_glyphs[i]->offset_y + + combining_glyphs[i]->height); + if (space <= 0) + space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8; + /* Fallthrough. */ + + case GRUB_UNICODE_STACK_ATTACHED_BELOW: + do_blit (combining_glyphs[i], targetx, -(ctx.bounds.y - space), + &ctx); + if (min_devwidth < combining_glyphs[i]->width) + min_devwidth = combining_glyphs[i]->width; + break; + + case GRUB_UNICODE_COMB_MN: + switch (comb[i].code) + { + case GRUB_UNICODE_THAANA_ABAFILI: + case GRUB_UNICODE_THAANA_AABAAFILI: + case GRUB_UNICODE_THAANA_UBUFILI: + case GRUB_UNICODE_THAANA_OOBOOFILI: + case GRUB_UNICODE_THAANA_EBEFILI: + case GRUB_UNICODE_THAANA_EYBEYFILI: + case GRUB_UNICODE_THAANA_OBOFILI: + case GRUB_UNICODE_THAANA_OABOAFILI: + case GRUB_UNICODE_THAANA_SUKUN: + goto stacked_above; + case GRUB_UNICODE_THAANA_IBIFILI: + case GRUB_UNICODE_THAANA_EEBEEFILI: + goto stacked_below; + } + /* Fall through. */ + default: + { + /* Default handling. Just draw combining character on top + of base character. + FIXME: support more unicode types correctly. + */ + do_blit (combining_glyphs[i], + main_glyph->device_width + + combining_glyphs[i]->offset_x, + -(combining_glyphs[i]->height + + combining_glyphs[i]->offset_y), &ctx); + add_device_width (combining_glyphs[i]->device_width, &ctx); + } + } + } + add_device_width ((above_rightx > + below_rightx ? above_rightx : below_rightx) - + (main_glyph->offset_x + main_glyph->width), &ctx); + add_device_width (above_leftx - main_glyph->offset_x, &ctx); + if (glyph && glyph->device_width < min_devwidth) + glyph->device_width = min_devwidth; + if (device_width && *device_width < min_devwidth) + *device_width = min_devwidth; + + if (bounds_out) + *bounds_out = ctx.bounds; +} + +static struct grub_font_glyph * +grub_font_construct_dry_run (grub_font_t hinted_font, + const struct grub_unicode_glyph *glyph_id, + struct grub_video_signed_rect *bounds, + struct grub_font_glyph **combining_glyphs, + int *device_width) +{ + struct grub_font_glyph *main_glyph = NULL; + grub_uint32_t desired_attributes = 0; + unsigned i; + grub_uint32_t base = glyph_id->base; + const struct grub_unicode_combining *comb; + + if (glyph_id->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED) + desired_attributes |= GRUB_FONT_CODE_RIGHT_JOINED; + + if (glyph_id->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED) + desired_attributes |= GRUB_FONT_CODE_LEFT_JOINED; + + comb = grub_unicode_get_comb (glyph_id); + + if (base == 'i' || base == 'j') + { + for (i = 0; i < glyph_id->ncomb; i++) + if (comb[i].type == GRUB_UNICODE_STACK_ABOVE) + break; + if (i < glyph_id->ncomb && base == 'i') + base = GRUB_UNICODE_DOTLESS_LOWERCASE_I; + if (i < glyph_id->ncomb && base == 'j') + base = GRUB_UNICODE_DOTLESS_LOWERCASE_J; + } + + main_glyph = grub_font_get_glyph_with_fallback (hinted_font, base + | desired_attributes); + + if (!main_glyph) + main_glyph = grub_font_get_glyph_with_fallback (hinted_font, + base); + + /* Glyph not available in any font. Use ASCII fallback. */ + if (!main_glyph) + main_glyph = ascii_glyph_lookup (base); + + /* Glyph not available in any font. Return unknown glyph. */ + if (!main_glyph) + return NULL; + + if (device_width) + *device_width = main_glyph->device_width; + + if (!glyph_id->ncomb && !glyph_id->attributes) + return main_glyph; + + if (glyph_id->ncomb && !combining_glyphs) + { + grub_errno = GRUB_ERR_NONE; + return main_glyph; + } + + for (i = 0; i < glyph_id->ncomb; i++) + combining_glyphs[i] + = grub_font_get_glyph_with_fallback (main_glyph->font, + comb[i].code); + + blit_comb (glyph_id, NULL, bounds, main_glyph, combining_glyphs, + device_width); + + return main_glyph; +} + +static struct grub_font_glyph **render_combining_glyphs = 0; +static grub_size_t render_max_comb_glyphs = 0; + +static void +ensure_comb_space (const struct grub_unicode_glyph *glyph_id) +{ + if (glyph_id->ncomb <= render_max_comb_glyphs) + return; + + render_max_comb_glyphs = 2 * glyph_id->ncomb; + if (render_max_comb_glyphs < 8) + render_max_comb_glyphs = 8; + grub_free (render_combining_glyphs); + render_combining_glyphs = grub_malloc (render_max_comb_glyphs + * sizeof (render_combining_glyphs[0])); + if (!render_combining_glyphs) + grub_errno = 0; +} + +int +grub_font_get_constructed_device_width (grub_font_t hinted_font, + const struct grub_unicode_glyph + *glyph_id) +{ + int ret; + struct grub_font_glyph *main_glyph; + + ensure_comb_space (glyph_id); + + main_glyph = grub_font_construct_dry_run (hinted_font, glyph_id, NULL, + render_combining_glyphs, &ret); + if (!main_glyph) + return unknown_glyph->device_width; + return ret; +} + +struct grub_font_glyph * +grub_font_construct_glyph (grub_font_t hinted_font, + const struct grub_unicode_glyph *glyph_id) +{ + struct grub_font_glyph *main_glyph; + struct grub_video_signed_rect bounds; + static struct grub_font_glyph *glyph = 0; + static grub_size_t max_glyph_size = 0; + + ensure_comb_space (glyph_id); + + main_glyph = grub_font_construct_dry_run (hinted_font, glyph_id, + &bounds, render_combining_glyphs, + NULL); + + if (!main_glyph) + return unknown_glyph; + + if (!render_combining_glyphs && glyph_id->ncomb) + return main_glyph; + + if (!glyph_id->ncomb && !glyph_id->attributes) + return main_glyph; + + if (max_glyph_size < sizeof (*glyph) + (bounds.width * bounds.height + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT) + { + grub_free (glyph); + max_glyph_size = (sizeof (*glyph) + (bounds.width * bounds.height + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT) * 2; + if (max_glyph_size < 8) + max_glyph_size = 8; + glyph = grub_malloc (max_glyph_size); + } + if (!glyph) + { + grub_errno = GRUB_ERR_NONE; + return main_glyph; + } + + grub_memset (glyph, 0, sizeof (*glyph) + + (bounds.width * bounds.height + + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT); + + glyph->font = main_glyph->font; + glyph->width = bounds.width; + glyph->height = bounds.height; + glyph->offset_x = bounds.x; + glyph->offset_y = bounds.y; + + if (glyph_id->attributes & GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR) + grub_font_blit_glyph_mirror (glyph, main_glyph, + main_glyph->offset_x - glyph->offset_x, + (glyph->height + glyph->offset_y) + - (main_glyph->height + + main_glyph->offset_y)); + else + grub_font_blit_glyph (glyph, main_glyph, + main_glyph->offset_x - glyph->offset_x, + (glyph->height + glyph->offset_y) + - (main_glyph->height + main_glyph->offset_y)); + + blit_comb (glyph_id, glyph, NULL, main_glyph, render_combining_glyphs, NULL); + + return glyph; +} + +/* Draw the specified glyph at (x, y). The y coordinate designates the + baseline of the character, while the x coordinate designates the left + side location of the character. */ +grub_err_t +grub_font_draw_glyph (struct grub_font_glyph * glyph, + grub_video_color_t color, int left_x, int baseline_y) +{ + struct grub_video_bitmap glyph_bitmap; + + /* Don't try to draw empty glyphs (U+0020, etc.). */ + if (glyph->width == 0 || glyph->height == 0) + return GRUB_ERR_NONE; + + glyph_bitmap.mode_info.width = glyph->width; + glyph_bitmap.mode_info.height = glyph->height; + glyph_bitmap.mode_info.mode_type + = (1 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS) | GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP; + glyph_bitmap.mode_info.blit_format = GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED; + glyph_bitmap.mode_info.bpp = 1; + + /* Really 1 bit per pixel. */ + glyph_bitmap.mode_info.bytes_per_pixel = 0; + + /* Packed densely as bits. */ + glyph_bitmap.mode_info.pitch = glyph->width; + + glyph_bitmap.mode_info.number_of_colors = 2; + glyph_bitmap.mode_info.bg_red = 0; + glyph_bitmap.mode_info.bg_green = 0; + glyph_bitmap.mode_info.bg_blue = 0; + glyph_bitmap.mode_info.bg_alpha = 0; + grub_video_unmap_color (color, + &glyph_bitmap.mode_info.fg_red, + &glyph_bitmap.mode_info.fg_green, + &glyph_bitmap.mode_info.fg_blue, + &glyph_bitmap.mode_info.fg_alpha); + glyph_bitmap.data = glyph->bitmap; + + int bitmap_left = left_x + glyph->offset_x; + int bitmap_bottom = baseline_y - glyph->offset_y; + int bitmap_top = bitmap_bottom - glyph->height; + + return grub_video_blit_bitmap (&glyph_bitmap, GRUB_VIDEO_BLIT_BLEND, + bitmap_left, bitmap_top, + 0, 0, glyph->width, glyph->height); +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/fs/iso9660.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/fs/iso9660.c index bd357564..9a26bb21 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/fs/iso9660.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/fs/iso9660.c @@ -33,6 +33,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); static int g_ventoy_no_joliet = 0; +static int g_ventoy_cur_joliet = 0; static grub_uint64_t g_ventoy_last_read_pos = 0; static grub_uint64_t g_ventoy_last_read_offset = 0; static grub_uint64_t g_ventoy_last_read_dirent_pos = 0; @@ -451,6 +452,7 @@ grub_iso9660_mount (grub_disk_t disk) data->disk = disk; + g_ventoy_cur_joliet = 0; block = 16; do { @@ -484,6 +486,7 @@ grub_iso9660_mount (grub_disk_t disk) if (0 == g_ventoy_no_joliet) { copy_voldesc = 1; data->joliet = 1; + g_ventoy_cur_joliet = 1; } } @@ -1118,6 +1121,11 @@ void grub_iso9660_set_nojoliet(int nojoliet) g_ventoy_no_joliet = nojoliet; } +int grub_iso9660_is_joliet(void) +{ + return g_ventoy_cur_joliet; +} + grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file) { (void)file; diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/gui_label.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/gui_label.c index 5e448d27..63d8c7be 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/gui_label.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/gui_label.c @@ -59,11 +59,15 @@ struct grub_gui_label grub_font_t font; grub_video_rgba_color_t color; int value; + int vtoytip; enum align_mode align; }; typedef struct grub_gui_label *grub_gui_label_t; +extern const char * g_ventoy_tip_msg1; +extern const char * g_ventoy_tip_msg2; + static void label_destroy (void *vself) { @@ -90,6 +94,7 @@ label_is_instance (void *vself __attribute__((unused)), const char *type) static void label_paint (void *vself, const grub_video_rect_t *region) { + const char *text; grub_gui_label_t self = vself; if (! self->visible) @@ -98,16 +103,24 @@ label_paint (void *vself, const grub_video_rect_t *region) if (!grub_video_have_common_points (region, &self->bounds)) return; + if (self->vtoytip == 1) { + text = g_ventoy_tip_msg1 ? g_ventoy_tip_msg1 : ""; + } else if (self->vtoytip == 2) { + text = g_ventoy_tip_msg2 ? g_ventoy_tip_msg2 : ""; + } else { + text = self->text; + } + /* Calculate the starting x coordinate. */ int left_x; if (self->align == align_left) left_x = 0; else if (self->align == align_center) left_x = (self->bounds.width - - grub_font_get_string_width (self->font, self->text)) / 2; + - grub_font_get_string_width (self->font, text)) / 2; else if (self->align == align_right) left_x = (self->bounds.width - - grub_font_get_string_width (self->font, self->text)); + - grub_font_get_string_width (self->font, text)); else return; /* Invalid alignment. */ @@ -116,7 +129,7 @@ label_paint (void *vself, const grub_video_rect_t *region) grub_video_rect_t vpsave; grub_gui_set_viewport (&self->bounds, &vpsave); - grub_font_draw_string (self->text, + grub_font_draw_string (text, self->font, grub_video_map_rgba_color (self->color), left_x, @@ -156,8 +169,8 @@ static void label_get_minimal_size (void *vself, unsigned *width, unsigned *height) { grub_gui_label_t self = vself; - *width = grub_font_get_string_width (self->font, self->text); - *height = (grub_font_get_ascent (self->font) + *width = grub_font_get_string_width (self->font, self->text); + *height = (grub_font_get_ascent (self->font) + grub_font_get_descent (self->font)); } @@ -255,8 +268,14 @@ label_set_property (void *vself, const char *name, const char *value) { grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self); grub_free (self->id); - if (value) + if (value) { self->id = grub_strdup (value); + if (grub_strcmp(value, "VTOY_MENU_TIP_1") == 0) { + self->vtoytip = 1; + } else if (grub_strcmp(value, "VTOY_MENU_TIP_2") == 0) { + self->vtoytip = 2; + } + } else self->id = 0; if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/theme_loader.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/theme_loader.c index cc905ced..5fea1cb2 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/theme_loader.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/theme_loader.c @@ -733,6 +733,8 @@ done: return grub_errno; } +extern int g_menu_update_mode; + /* Set properties on the view based on settings from the specified theme file. */ grub_err_t @@ -752,7 +754,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path) } p.len = grub_file_size (file); - p.buf = grub_malloc (p.len + 4096); + p.buf = grub_malloc (p.len + 8192); p.pos = 0; p.line_num = 1; p.col_num = 1; @@ -781,6 +783,33 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path) } } +{ + const char *tip = grub_env_get("VTOY_MENU_TIP_ENABLE"); + if (tip && tip[0] == '1') + { + char tmpmsg[512]; + + grub_memset(tmpmsg, 'w', 500); + tmpmsg[500] = 0; + + g_menu_update_mode = 1; + p.len += grub_snprintf(p.buf + p.len, 4096, + "\n+ vbox{\n left = %s\n top = %s\n" + "+ label { id=\"VTOY_MENU_TIP_1\" text = \"%s\" color = \"%s\" align = \"%s\"}\n" + "+ label { id=\"VTOY_MENU_TIP_2\" text = \"%s\" color = \"%s\" align = \"%s\"}\n" + "}\n", + grub_env_get("VTOY_TIP_LEFT"), + grub_env_get("VTOY_TIP_TOP"), + tmpmsg, + grub_env_get("VTOY_TIP_COLOR"), + grub_env_get("VTOY_TIP_ALIGN"), + tmpmsg, + grub_env_get("VTOY_TIP_COLOR"), + grub_env_get("VTOY_TIP_ALIGN") + ); + } +} + if (view->canvas) view->canvas->component.ops->destroy (view->canvas); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/view.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/view.c index bfac3756..0bd7515e 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/view.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/gfxmenu/view.c @@ -386,21 +386,37 @@ redraw_menu_visit (grub_gui_component_t component, } } +extern int g_menu_update_mode; + +static void grub_gfxmenu_update_all(grub_gfxmenu_view_t view) +{ + grub_video_set_area_status(GRUB_VIDEO_AREA_DISABLED); + grub_gfxmenu_view_redraw(view, &view->screen); +} + void grub_gfxmenu_redraw_menu (grub_gfxmenu_view_t view) { update_menu_components (view); - grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, - redraw_menu_visit, view); + if (g_menu_update_mode) + grub_gfxmenu_update_all(view); + else + grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, + redraw_menu_visit, view); + grub_video_swap_buffers (); if (view->double_repaint) { - grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, - redraw_menu_visit, view); + if (g_menu_update_mode) + grub_gfxmenu_update_all(view); + else + grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, + redraw_menu_visit, view); } } + void grub_gfxmenu_set_chosen_entry (int entry, void *data) { @@ -408,6 +424,8 @@ grub_gfxmenu_set_chosen_entry (int entry, void *data) view->selected = entry; grub_gfxmenu_redraw_menu (view); + + } static void diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c index f8dfec64..f2c40d01 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/arm64/linux.c @@ -279,6 +279,13 @@ static int ventoy_boot_opt_filter(char *opt) opt[1] = 't'; return 0; } + + if (grub_strncmp(opt, "dm=", 3) == 0) + { + opt[0] = 'D'; + opt[1] = 'M'; + return 0; + } if (ventoy_debug) { diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/i386/linux.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/i386/linux.c index f6c879f5..ae06ad1d 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/i386/linux.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/i386/linux.c @@ -506,6 +506,13 @@ static int ventoy_boot_opt_filter(char *opt) return 0; } + if (grub_strncmp(opt, "dm=", 3) == 0) + { + opt[0] = 'D'; + opt[1] = 'M'; + return 0; + } + if (ventoy_debug) { if (grub_strcmp(opt, "quiet") == 0) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c index 2822187d..d81cc3c8 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/loader/mips64/linux.c @@ -228,6 +228,13 @@ static int ventoy_boot_opt_filter(char *opt) return 0; } + if (grub_strncmp(opt, "dm=", 3) == 0) + { + opt[0] = 'D'; + opt[1] = 'M'; + return 0; + } + if (ventoy_debug) { if (grub_strcmp(opt, "quiet") == 0) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu.c index 14e3dac5..34b71ef6 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/normal/menu.c @@ -33,6 +33,9 @@ #include #include #include +#include +#include +#include "ventoy/ventoy_def.h" int g_ventoy_menu_refresh = 0; int g_ventoy_memdisk_mode = 0; @@ -42,10 +45,24 @@ int g_ventoy_wimboot_mode = 0; int g_ventoy_iso_uefi_drv = 0; int g_ventoy_last_entry = -1; int g_ventoy_suppress_esc = 0; +int g_ventoy_suppress_esc_default = 1; int g_ventoy_menu_esc = 0; int g_ventoy_fn_mutex = 0; int g_ventoy_terminal_output = 0; +#define VTOY_COMM_HOTKEY(cmdkey) \ +if (0 == g_ventoy_fn_mutex) { \ + cmdstr = grub_env_get(cmdkey); \ + if (cmdstr) \ + { \ + menu_fini (); \ + g_ventoy_fn_mutex = 1; \ + grub_script_execute_sourcecode(cmdstr); \ + g_ventoy_fn_mutex = 0; \ + goto refresh; \ + } \ +} + /* Time to delay after displaying an error message about a default/fallback entry failing to boot. */ #define DEFAULT_ENTRY_ERROR_DELAY_MS 2500 @@ -381,10 +398,65 @@ grub_menu_execute_with_fallback (grub_menu_t menu, static struct grub_menu_viewer *viewers; +int g_menu_update_mode = 0; +int g_ventoy_tip_label_enable = 0; +const char * g_ventoy_tip_msg1 = NULL; +const char * g_ventoy_tip_msg2 = NULL; +char g_ventoy_theme_path[256] = {0}; +static const char *g_ventoy_cur_img_path = NULL; +static void menu_set_chosen_tip(grub_menu_t menu, int entry) +{ + int i; + img_info *img; + menu_tip *tip; + grub_menu_entry_t e = grub_menu_get_entry (menu, entry); + + if (g_ventoy_theme_path[0]) + { + grub_env_set("theme", g_ventoy_theme_path); + } + + g_ventoy_tip_msg1 = g_ventoy_tip_msg2 = NULL; + if (e && e->id && grub_strncmp(e->id, "VID_", 4) == 0) + { + g_ventoy_theme_path[0] = 0; + img = (img_info *)(void *)grub_strtoul(e->id + 4, NULL, 16); + if (img) + { + g_ventoy_tip_msg1 = img->tip1; + g_ventoy_tip_msg2 = img->tip2; + g_ventoy_cur_img_path = img->path; + } + } + else if (e && e->id && grub_strncmp(e->id, "DIR_", 4) == 0) + { + g_ventoy_theme_path[0] = 0; + for (i = 0; i < e->argc; i++) + { + if (e->args[i] && grub_strncmp(e->args[i], "_VTIP_", 6) == 0) + { + break; + } + } + + if (i < e->argc) + { + tip = (menu_tip *)(void *)grub_strtoul(e->args[i] + 6, NULL, 16); + if (tip) + { + g_ventoy_tip_msg1 = tip->tip1; + g_ventoy_tip_msg2 = tip->tip2; + } + } + } +} + static void -menu_set_chosen_entry (int entry) +menu_set_chosen_entry (grub_menu_t menu, int entry) { struct grub_menu_viewer *cur; + + menu_set_chosen_tip(menu, entry); for (cur = viewers; cur; cur = cur->next) cur->set_chosen_entry (entry, cur->data); } @@ -598,7 +670,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) default_entry = get_entry_number (menu, "default"); if (g_ventoy_suppress_esc) - default_entry = 1; + default_entry = g_ventoy_suppress_esc_default; else if (g_ventoy_last_entry >= 0 && g_ventoy_last_entry < menu->size) { default_entry = g_ventoy_last_entry; } @@ -680,6 +752,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) current_entry = default_entry; refresh: + menu_set_chosen_tip(menu, current_entry); menu_init (current_entry, menu, nested); /* Initialize the time. */ @@ -732,13 +805,13 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) case GRUB_TERM_KEY_HOME: case GRUB_TERM_CTRL | 'a': current_entry = 0; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case GRUB_TERM_KEY_END: case GRUB_TERM_CTRL | 'e': current_entry = menu->size - 1; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case GRUB_TERM_KEY_UP: @@ -746,7 +819,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) case '^': if (current_entry > 0) current_entry--; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case GRUB_TERM_CTRL | 'n': @@ -754,7 +827,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) case 'v': if (current_entry < menu->size - 1) current_entry++; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case GRUB_TERM_CTRL | 'g': @@ -763,7 +836,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) current_entry = 0; else current_entry -= GRUB_MENU_PAGE_SIZE; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case GRUB_TERM_CTRL | 'c': @@ -772,7 +845,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) current_entry += GRUB_MENU_PAGE_SIZE; else current_entry = menu->size - 1; - menu_set_chosen_entry (current_entry); + menu_set_chosen_entry (menu, current_entry); break; case '\n': @@ -807,71 +880,23 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) case GRUB_TERM_KEY_F2: case '2': - if (0 == g_ventoy_fn_mutex) { - cmdstr = grub_env_get("VTOY_F2_CMD"); - if (cmdstr) - { - menu_fini (); - g_ventoy_fn_mutex = 1; - grub_script_execute_sourcecode(cmdstr); - g_ventoy_fn_mutex = 0; - goto refresh; - } - } + VTOY_COMM_HOTKEY("VTOY_F2_CMD"); break; case GRUB_TERM_KEY_F3: case '3': - if (0 == g_ventoy_fn_mutex) { - cmdstr = grub_env_get("VTOY_F3_CMD"); - if (cmdstr) - { - menu_fini (); - grub_script_execute_sourcecode(cmdstr); - goto refresh; - } - } + VTOY_COMM_HOTKEY("VTOY_F3_CMD"); break; case GRUB_TERM_KEY_F4: case '4': - if (0 == g_ventoy_fn_mutex) { - cmdstr = grub_env_get("VTOY_F4_CMD"); - if (cmdstr) - { - menu_fini (); - g_ventoy_fn_mutex = 1; - grub_script_execute_sourcecode(cmdstr); - g_ventoy_fn_mutex = 0; - goto refresh; - } - } + VTOY_COMM_HOTKEY("VTOY_F4_CMD"); break; case GRUB_TERM_KEY_F5: case '5': - if (0 == g_ventoy_fn_mutex) { - cmdstr = grub_env_get("VTOY_F5_CMD"); - if (cmdstr) - { - menu_fini (); - g_ventoy_fn_mutex = 1; - grub_script_execute_sourcecode(cmdstr); - g_ventoy_fn_mutex = 0; - goto refresh; - } - } + VTOY_COMM_HOTKEY("VTOY_F5_CMD"); break; case GRUB_TERM_KEY_F6: case '6': - if (0 == g_ventoy_fn_mutex) { - cmdstr = grub_env_get("VTOY_F6_CMD"); - if (cmdstr) - { - menu_fini (); - g_ventoy_fn_mutex = 1; - grub_script_execute_sourcecode(cmdstr); - g_ventoy_fn_mutex = 0; - goto refresh; - } - } + VTOY_COMM_HOTKEY("VTOY_F6_CMD"); break; case GRUB_TERM_KEY_F7: menu_fini (); @@ -917,6 +942,40 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) g_ventoy_menu_refresh = 1; goto refresh; + case (GRUB_TERM_CTRL | 'h'): + case 'h': + { + cmdstr = grub_env_get("VTOY_HELP_CMD"); + if (cmdstr) + { + grub_script_execute_sourcecode(cmdstr); + while (grub_getkey() != GRUB_TERM_ESC) + ; + menu_fini (); + goto refresh; + } + break; + } + case (GRUB_TERM_CTRL | 'm'): + case 'm': + { + if (g_ventoy_cur_img_path) + { + grub_env_set("VTOY_CHKSUM_FILE_PATH", g_ventoy_cur_img_path); + cmdstr = grub_env_get("VTOY_CHKSUM_CMD"); + if (cmdstr) + { + menu_fini(); + grub_script_execute_sourcecode(cmdstr); + goto refresh; + } + } + else + { + grub_env_set("VTOY_CHKSUM_FILE_PATH", "X"); + } + break; + } default: { int entry; @@ -1010,6 +1069,11 @@ show_menu (grub_menu_t menu, int nested, int autobooted) break; } + if (autobooted == 0 && g_ventoy_menu_esc && auto_boot) { + g_ventoy_last_entry = boot_entry; + break; + } + e = grub_menu_get_entry (menu, boot_entry); if (! e) continue; /* Menu is empty. */ diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c new file mode 100644 index 00000000..2975ad4a --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/partmap/gpt.c @@ -0,0 +1,232 @@ +/* gpt.c - Read GUID Partition Tables (GPT). */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2002,2005,2006,2007,2008 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +static grub_uint8_t grub_gpt_magic[8] = + { + 0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54 + }; + +static const grub_gpt_part_guid_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY; + +#ifdef GRUB_UTIL +static const grub_gpt_part_guid_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT; +#endif + +/* 512 << 7 = 65536 byte sectors. */ +#define MAX_SECTOR_LOG 7 + +static struct grub_partition_map grub_gpt_partition_map; + + + +grub_err_t +grub_gpt_partition_map_iterate (grub_disk_t disk, + grub_partition_iterate_hook_t hook, + void *hook_data) +{ + struct grub_partition part; + struct grub_gpt_header gpt; + struct grub_gpt_partentry entry; + struct grub_msdos_partition_mbr mbr; + grub_uint64_t entries; + unsigned int i; + int last_offset = 0; + int sector_log = 0; + + /* Read the protective MBR. */ + if (grub_disk_read (disk, 0, 0, sizeof (mbr), &mbr)) + return grub_errno; + + /* Check if it is valid. */ + if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE)) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature"); + + /* Make sure the MBR is a protective MBR and not a normal MBR. */ + for (i = 0; i < 4; i++) + if (mbr.entries[i].type == GRUB_PC_PARTITION_TYPE_GPT_DISK) + break; + if (i == 4) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no GPT partition map found"); + + /* Read the GPT header. */ + for (sector_log = 0; sector_log < MAX_SECTOR_LOG; sector_log++) + { + if (grub_disk_read (disk, 1 << sector_log, 0, sizeof (gpt), &gpt)) + return grub_errno; + + if (grub_memcmp (gpt.magic, grub_gpt_magic, sizeof (grub_gpt_magic)) == 0) + break; + } + if (sector_log == MAX_SECTOR_LOG) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "no valid GPT header"); + + grub_dprintf ("gpt", "Read a valid GPT header\n"); + + entries = grub_le_to_cpu64 (gpt.partitions) << sector_log; + for (i = 0; i < grub_le_to_cpu32 (gpt.maxpart); i++) + { + if (grub_disk_read (disk, entries, last_offset, + sizeof (entry), &entry)) + return grub_errno; + + if (grub_memcmp (&grub_gpt_partition_type_empty, &entry.type, + sizeof (grub_gpt_partition_type_empty))) + { + /* Calculate the first block and the size of the partition. */ + part.start = grub_le_to_cpu64 (entry.start) << sector_log; + part.len = (grub_le_to_cpu64 (entry.end) + - grub_le_to_cpu64 (entry.start) + 1) << sector_log; + part.offset = entries; + part.number = i; + part.index = last_offset; + part.partmap = &grub_gpt_partition_map; + part.parent = disk->partition; + part.gpt_attrib = entry.attrib; + + grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i, + (unsigned long long) part.start, + (unsigned long long) part.len); + + if (hook (disk, &part, hook_data)) + return grub_errno; + } + + last_offset += grub_le_to_cpu32 (gpt.partentry_size); + if (last_offset == GRUB_DISK_SECTOR_SIZE) + { + last_offset = 0; + entries++; + } + } + + return GRUB_ERR_NONE; +} + +#ifdef GRUB_UTIL +/* Context for gpt_partition_map_embed. */ +struct gpt_partition_map_embed_ctx +{ + grub_disk_addr_t start, len; +}; + +/* Helper for gpt_partition_map_embed. */ +static int +find_usable_region (grub_disk_t disk __attribute__ ((unused)), + const grub_partition_t p, void *data) +{ + struct gpt_partition_map_embed_ctx *ctx = data; + struct grub_gpt_partentry gptdata; + grub_partition_t p2; + + p2 = disk->partition; + disk->partition = p->parent; + if (grub_disk_read (disk, p->offset, p->index, + sizeof (gptdata), &gptdata)) + { + disk->partition = p2; + return 0; + } + disk->partition = p2; + + /* If there's an embed region, it is in a dedicated partition. */ + if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16)) + { + ctx->start = p->start; + ctx->len = p->len; + return 1; + } + + return 0; +} + +static grub_err_t +gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors, + unsigned int max_nsectors, + grub_embed_type_t embed_type, + grub_disk_addr_t **sectors) +{ + struct gpt_partition_map_embed_ctx ctx = { + .start = 0, + .len = 0 + }; + unsigned i; + grub_err_t err; + + if (embed_type != GRUB_EMBED_PCBIOS) + return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, + "GPT currently supports only PC-BIOS embedding"); + + err = grub_gpt_partition_map_iterate (disk, find_usable_region, &ctx); + if (err) + return err; + + if (ctx.len == 0) + return grub_error (GRUB_ERR_FILE_NOT_FOUND, + N_("this GPT partition label contains no BIOS Boot Partition;" + " embedding won't be possible")); + + if (ctx.len < *nsectors) + return grub_error (GRUB_ERR_OUT_OF_RANGE, + N_("your BIOS Boot Partition is too small;" + " embedding won't be possible")); + + *nsectors = ctx.len; + if (*nsectors > max_nsectors) + *nsectors = max_nsectors; + *sectors = grub_malloc (*nsectors * sizeof (**sectors)); + if (!*sectors) + return grub_errno; + for (i = 0; i < *nsectors; i++) + (*sectors)[i] = ctx.start + i; + + return GRUB_ERR_NONE; +} +#endif + + +/* Partition map type. */ +static struct grub_partition_map grub_gpt_partition_map = + { + .name = "gpt", + .iterate = grub_gpt_partition_map_iterate, +#ifdef GRUB_UTIL + .embed = gpt_partition_map_embed +#endif + }; + +GRUB_MOD_INIT(part_gpt) +{ + grub_partition_map_register (&grub_gpt_partition_map); +} + +GRUB_MOD_FINI(part_gpt) +{ + grub_partition_map_unregister (&grub_gpt_partition_map); +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/script/function.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/script/function.c new file mode 100644 index 00000000..fc10ac4f --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/script/function.c @@ -0,0 +1,113 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2005,2007,2009,2010 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include + +grub_script_function_t grub_script_function_list; + +grub_script_function_t +grub_script_function_create (struct grub_script_arg *functionname_arg, + struct grub_script *cmd) +{ + grub_script_function_t func; + grub_script_function_t *p; + + func = (grub_script_function_t) grub_malloc (sizeof (*func)); + if (! func) + return 0; + + func->name = grub_strdup (functionname_arg->str); + if (! func->name) + { + grub_free (func); + return 0; + } + + func->func = cmd; + + /* Keep the list sorted for simplicity. */ + p = &grub_script_function_list; + while (*p) + { + if (grub_strcmp ((*p)->name, func->name) >= 0) + break; + + p = &((*p)->next); + } + + /* If the function already exists, overwrite the old function. */ + if (*p && grub_strcmp ((*p)->name, func->name) == 0) + { + grub_script_function_t q; + + q = *p; + grub_script_free (q->func); + q->func = cmd; + grub_free (func); + func = q; + } + else + { + func->next = *p; + *p = func; + } + + return func; +} + +void +grub_script_function_remove (const char *name) +{ + grub_script_function_t *p, q; + + for (p = &grub_script_function_list, q = *p; q; p = &(q->next), q = q->next) + if (grub_strcmp (name, q->name) == 0) + { + *p = q->next; + grub_free (q->name); + grub_script_free (q->func); + grub_free (q); + break; + } +} + +grub_script_function_t +grub_script_function_find (char *functionname) +{ + grub_script_function_t func; + + for (func = grub_script_function_list; func; func = func->next) + if (grub_strcmp (functionname, func->name) == 0) + break; + + if (! func) + { + char tmp[64]; + grub_strncpy (tmp, functionname, 63); + tmp[63] = 0; + /* Avoid truncating inside UTF-8 character. */ + tmp[grub_getend (tmp, tmp + grub_strlen (tmp))] = 0; + grub_error (GRUB_ERR_UNKNOWN_COMMAND, N_("can't find command `%s'"), tmp); + } + + return func; +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c index 56dd7dd2..732a96f2 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c @@ -462,6 +462,8 @@ static int lzx_uncompressed ( struct lzx *lzx ) { if ( len % 2 ) lzx->input.offset++; + lzx->output.offset += len; + return 0; } @@ -614,7 +616,7 @@ ssize_t lzx_decompress ( const void *data, size_t len, void *buf ) { /* Sanity check */ if ( len % 2 ) { DBG ( "LZX cannot handle odd-length input data\n" ); - return -1; + //return -1; } /* Initialise global state, if required */ diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c index 14dae6e0..8d6a8272 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c @@ -53,6 +53,26 @@ void ventoy_debug(const char *fmt, ...) va_end (args); } +void ventoy_str_tolower(char *str) +{ + while (*str) + { + *str = grub_tolower(*str); + str++; + } +} + +void ventoy_str_toupper(char *str) +{ + while (*str) + { + *str = grub_toupper(*str); + str++; + } +} + + + int ventoy_strcmp(const char *pattern, const char *str) { while (*pattern && *str) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c index 6f9d7262..5adcdc65 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c @@ -51,6 +51,13 @@ GRUB_MOD_LICENSE ("GPLv3+"); +static grub_uint8_t g_check_mbr_data[] = { + 0xEB, 0x63, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44, 0x00, 0x52, 0x64, 0x00, 0x20, 0x45, 0x72, 0x0D, +}; + initrd_info *g_initrd_img_list = NULL; initrd_info *g_initrd_img_tail = NULL; int g_initrd_img_count = 0; @@ -127,6 +134,9 @@ static grub_uint64_t g_enumerate_start_time_ms; static grub_uint64_t g_enumerate_finish_time_ms; static int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0}; +static int g_pager_flag = 0; +static char g_old_pager[32]; + static const char *g_vtoy_winpeshl_ini = "[LaunchApps]\r\nvtoyjump.exe"; static const char *g_menu_class[] = @@ -142,6 +152,8 @@ const char *g_menu_prefix[img_type_max] = static int g_vtoy_load_prompt = 0; static char g_vtoy_prompt_msg[64]; +static char g_json_case_mis_path[32]; + static int ventoy_get_fs_type(const char *fs) { if (NULL == fs) @@ -474,7 +486,7 @@ static int ventoy_set_check_result(int ret) grub_printf(VTOY_WARNING"\n"); grub_printf(VTOY_WARNING"\n\n\n"); - grub_printf("This is NOT a standard Ventoy device and is NOT supported (0x%x).\n\n", ret); + grub_printf("This is NOT a standard Ventoy device and is NOT supported (%d).\n\n", ret); grub_printf("You should follow the instructions in https://www.ventoy.net to use Ventoy.\n"); grub_printf("\n\nWill exit after 10 seconds ...... "); @@ -492,6 +504,8 @@ static int ventoy_check_official_device(grub_device_t dev) grub_uint64_t offset; char devname[64]; grub_fs_t fs; + grub_uint8_t mbr[512]; + grub_disk_t disk; grub_device_t dev2; char *label = NULL; struct grub_partition *partition; @@ -606,7 +620,23 @@ static int ventoy_check_official_device(grub_device_t dev) grub_device_close(dev2); } + + /* MBR check */ + disk = grub_disk_open(dev->disk->name); + if (!disk) + { + return ventoy_set_check_result(11); + } + + grub_memset(mbr, 0, 512); + grub_disk_read(disk, 0, 0, 512, mbr); + grub_disk_close(disk); + if (grub_memcmp(g_check_mbr_data, mbr, 0x30) || grub_memcmp(g_check_mbr_data + 0x30, mbr + 0x190, 16)) + { + return ventoy_set_check_result(12); + } + return ventoy_set_check_result(0); } @@ -860,6 +890,38 @@ static grub_err_t ventoy_cmd_strbegin(grub_extcmd_context_t ctxt, int argc, char return 0; } +static grub_err_t ventoy_cmd_strcasebegin(grub_extcmd_context_t ctxt, int argc, char **args) +{ + char *c0, *c1; + + (void)ctxt; + + if (argc != 2) + { + return 1; + } + + c0 = args[0]; + c1 = args[1]; + + while (*c0 && *c1) + { + if ((*c0 != *c1) && (*c0 != grub_toupper(*c1))) + { + return 1; + } + c0++; + c1++; + } + + if (*c1) + { + return 1; + } + + return 0; +} + static grub_err_t ventoy_cmd_incr(grub_extcmd_context_t ctxt, int argc, char **args) { long value_long = 0; @@ -1221,6 +1283,23 @@ static grub_err_t ventoy_cmd_load_img_memdisk(grub_extcmd_context_t ctxt, int ar return rc; } +static grub_err_t ventoy_cmd_iso9660_is_joliet(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + (void)argc; + (void)args; + + if (grub_iso9660_is_joliet()) + { + debug("This time has joliet process\n"); + return 0; + } + else + { + return 1; + } +} + static grub_err_t ventoy_cmd_iso9660_nojoliet(grub_extcmd_context_t ctxt, int argc, char **args) { (void)ctxt; @@ -1540,6 +1619,7 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh grub_size_t len; img_info *img; img_info *tail; + const menu_tip *tip; img_iterator_node *tmp; img_iterator_node *new_node; img_iterator_node *node = (img_iterator_node *)data; @@ -1757,6 +1837,14 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh g_ventoy_img_count++; img->alias = ventoy_plugin_get_menu_alias(vtoy_alias_image_file, img->path); + + tip = ventoy_plugin_get_menu_tip(vtoy_tip_image_file, img->path); + if (tip) + { + img->tip1 = tip->tip1; + img->tip2 = tip->tip2; + } + img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name, img->path); if (!img->class) { @@ -1951,7 +2039,8 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node) const char *dir_class = NULL; const char *dir_alias = NULL; img_iterator_node *child = NULL; - + const menu_tip *tip = NULL; + if (node->isocnt == 0 || node->done == 1) { return 0; @@ -1991,20 +2080,22 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node) dir_class = "vtoydir"; } + tip = ventoy_plugin_get_menu_tip(vtoy_tip_directory, node->dir); + dir_alias = ventoy_plugin_get_menu_alias(vtoy_alias_directory, node->dir); if (dir_alias) { if (g_tree_view_menu_style == 0) { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "submenu \"%-10s %s\" --class=\"%s\" --id=\"DIR_%s\" {\n", - "DIR", dir_alias, dir_class, node->dir + offset); + "submenu \"%-10s %s\" --class=\"%s\" --id=\"DIR_%s\" _VTIP_%p {\n", + "DIR", dir_alias, dir_class, node->dir + offset, tip); } else { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "submenu \"%s\" --class=\"%s\" --id=\"DIR_%s\" {\n", - dir_alias, dir_class, node->dir + offset); + "submenu \"%s\" --class=\"%s\" --id=\"DIR_%s\" _VTIP_%p {\n", + dir_alias, dir_class, node->dir + offset, tip); } } else @@ -2014,14 +2105,14 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node) if (g_tree_view_menu_style == 0) { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "submenu \"%-10s [%s]\" --class=\"%s\" --id=\"DIR_%s\" {\n", - "DIR", dir_alias, dir_class, node->dir + offset); + "submenu \"%-10s [%s]\" --class=\"%s\" --id=\"DIR_%s\" _VTIP_%p {\n", + "DIR", dir_alias, dir_class, node->dir + offset, tip); } else { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "submenu \"[%s]\" --class=\"%s\" --id=\"DIR_%s\" {\n", - dir_alias, dir_class, node->dir + offset); + "submenu \"[%s]\" --class=\"%s\" --id=\"DIR_%s\" _VTIP_%p {\n", + dir_alias, dir_class, node->dir + offset, tip); } } @@ -2051,23 +2142,23 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node) if (g_tree_view_menu_style == 0) { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "menuentry \"%-10s %s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" + "menuentry \"%-10s %s%s\" --class=\"%s\" --id=\"VID_%p\" {\n" " %s_%s \n" "}\n", grub_get_human_size(img->size, GRUB_HUMAN_SIZE_SHORT), img->unsupport ? "[***********] " : "", - img->alias ? img->alias : img->name, img->class, img->id, + img->alias ? img->alias : img->name, img->class, img, img->menu_prefix, img->unsupport ? "unsupport_menuentry" : "common_menuentry"); } else { vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, - "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" + "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%p\" {\n" " %s_%s \n" "}\n", img->unsupport ? "[***********] " : "", - img->alias ? img->alias : img->name, img->class, img->id, + img->alias ? img->alias : img->name, img->class, img, img->menu_prefix, img->unsupport ? "unsupport_menuentry" : "common_menuentry"); } @@ -2114,7 +2205,7 @@ static int ventoy_set_default_menu(void) if (0 == g_default_menu_mode) { - vtoy_ssprintf(g_list_script_buf, g_list_script_pos, "set default='VID_%d'\n", default_node->id); + vtoy_ssprintf(g_list_script_buf, g_list_script_pos, "set default='VID_%p'\n", default_node); } else { @@ -2147,7 +2238,7 @@ static int ventoy_set_default_menu(void) pos = end + 1; } - vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, "VID_%d'\n", default_node->id); + vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, "VID_%p'\n", default_node); grub_free(def); } } @@ -2244,7 +2335,7 @@ static grub_err_t ventoy_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, int return grub_error(GRUB_ERR_BAD_ARGUMENT, "No such image"); } - grub_snprintf(id, sizeof(id), "VID_%d", cur->id); + grub_snprintf(id, sizeof(id), "VID_%p", cur); grub_env_set("chosen", id); grub_env_export("chosen"); @@ -2253,11 +2344,10 @@ static grub_err_t ventoy_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, int static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int argc, char **args) { - int img_id = 0; char value[32]; char *pos = NULL; const char *id = NULL; - img_info *cur = g_ventoy_img_list; + img_info *cur = NULL; (void)ctxt; @@ -2271,20 +2361,11 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg pos = grub_strstr(id, "VID_"); if (pos) { - img_id = (int)grub_strtoul(pos + 4, NULL, 10); + cur = (img_info *)(void *)grub_strtoul(pos + 4, NULL, 16); } else { - img_id = (int)grub_strtoul(id, NULL, 10); - } - - while (cur) - { - if (img_id == cur->id) - { - break; - } - cur = cur->next; + cur = g_ventoy_img_list; } if (!cur) @@ -2313,12 +2394,14 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char grub_device_t dev = NULL; img_info *cur = NULL; img_info *tail = NULL; + img_info *min = NULL; + img_info *head = NULL; const char *strdata = NULL; char *device_name = NULL; char buf[32]; img_iterator_node *node = NULL; img_iterator_node *tmp = NULL; - + (void)ctxt; if (argc != 2) @@ -2448,17 +2531,49 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char } /* sort image list by image name */ - for (cur = g_ventoy_img_list; cur; cur = cur->next) + while (g_ventoy_img_list) { - for (tail = cur->next; tail; tail = tail->next) + min = g_ventoy_img_list; + for (cur = g_ventoy_img_list->next; cur; cur = cur->next) { - if (ventoy_cmp_img(cur, tail) > 0) + if (ventoy_cmp_img(min, cur) > 0) { - ventoy_swap_img(cur, tail); + min = cur; } } + + if (min->prev) + { + min->prev->next = min->next; + } + + if (min->next) + { + min->next->prev = min->prev; + } + + if (min == g_ventoy_img_list) + { + g_ventoy_img_list = min->next; + } + + if (head == NULL) + { + head = tail = min; + min->prev = NULL; + min->next = NULL; + } + else + { + tail->next = min; + min->prev = tail; + min->next = NULL; + tail = min; + } } + g_ventoy_img_list = head; + if (g_default_menu_mode == 1) { vtoy_ssprintf(g_list_script_buf, g_list_script_pos, @@ -2470,11 +2585,11 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char for (cur = g_ventoy_img_list; cur; cur = cur->next) { vtoy_ssprintf(g_list_script_buf, g_list_script_pos, - "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" + "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%p\" {\n" " %s_%s \n" "}\n", cur->unsupport ? "[***********] " : "", - cur->alias ? cur->alias : cur->name, cur->class, cur->id, + cur->alias ? cur->alias : cur->name, cur->class, cur, cur->menu_prefix, cur->unsupport ? "unsupport_menuentry" : "common_menuentry"); } @@ -2561,6 +2676,22 @@ grub_uint32_t ventoy_get_iso_boot_catlog(grub_file_t file) return desc.sector; } +static grub_uint32_t ventoy_get_bios_eltorito_rba(grub_file_t file, grub_uint32_t sector) +{ + grub_uint8_t buf[512]; + + grub_file_seek(file, sector * 2048); + grub_file_read(file, buf, sizeof(buf)); + + if (buf[0] == 0x01 && buf[1] == 0x00 && + buf[30] == 0x55 && buf[31] == 0xaa && buf[32] == 0x88) + { + return *((grub_uint32_t *)(buf + 40)); + } + + return 0; +} + int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector) { int i; @@ -2838,6 +2969,7 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch } grub_memset(&g_grub_param->file_replace, 0, sizeof(g_grub_param->file_replace)); + grub_memset(&g_grub_param->img_replace, 0, sizeof(g_grub_param->img_replace)); VENTOY_CMD_RETURN(GRUB_ERR_NONE); } @@ -2869,15 +3001,21 @@ static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int arg debug("Find conf replace for %s\n", args[1]); file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf); - if (!file) + if (file) + { + offset = grub_iso9660_get_last_file_dirent_pos(file); + grub_file_close(file); + } + else if (node->img > 0) + { + offset = 0; + } + else { debug("<(loop)%s> NOT exist\n", node->orgconf); goto end; } - offset = grub_iso9660_get_last_file_dirent_pos(file); - grub_file_close(file); - file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->newconf); if (!file) { @@ -2900,6 +3038,13 @@ static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int arg g_conf_replace_node = node; g_conf_replace_offset = offset + 2; + if (node->img > 0) + { + g_grub_param->img_replace.magic = GRUB_IMG_REPLACE_MAGIC; + g_grub_param->img_replace.old_name_cnt = 1; + grub_snprintf(g_grub_param->img_replace.old_file_name[0], 256, "%s", node->orgconf); + } + debug("conf_replace OK: newlen: %d\n", g_conf_replace_new_len); end: @@ -2914,6 +3059,7 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar { int i = 0; int pos = 0; + int defidx = 1; char *buf = NULL; char configfile[128]; install_template *node = NULL; @@ -2938,9 +3084,13 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar if (node->autosel >= 0 && node->autosel <= node->templatenum) { - node->cursel = node->autosel - 1; - debug("Auto install template auto select %d\n", node->autosel); - return 0; + defidx = node->autosel; + if (node->timeout < 0) + { + node->cursel = node->autosel - 1; + debug("Auto install template auto select %d\n", node->autosel); + return 0; + } } buf = (char *)grub_malloc(VTOY_MAX_SCRIPT_BUF); @@ -2949,24 +3099,31 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar return 0; } + if (node->timeout > 0) + { + vtoy_ssprintf(buf, pos, "set timeout=%d\n", node->timeout); + } + vtoy_ssprintf(buf, pos, "menuentry \"Boot without auto installation template\" {\n" - " echo %s\n}\n", "123"); + " echo %s\n}\n", ""); for (i = 0; i < node->templatenum; i++) { - vtoy_ssprintf(buf, pos, "menuentry \"Boot with %s\" {\n" - " echo 123\n}\n", + vtoy_ssprintf(buf, pos, "menuentry \"Boot with %s\"{\n" + " echo \"\"\n}\n", node->templatepath[i].path); } g_ventoy_menu_esc = 1; g_ventoy_suppress_esc = 1; + g_ventoy_suppress_esc_default = defidx; grub_snprintf(configfile, sizeof(configfile), "configfile mem:0x%llx:size:%d", (ulonglong)(ulong)buf, pos); grub_script_execute_sourcecode(configfile); g_ventoy_menu_esc = 0; g_ventoy_suppress_esc = 0; + g_ventoy_suppress_esc_default = 1; grub_free(buf); @@ -2979,6 +3136,7 @@ static grub_err_t ventoy_cmd_sel_persistence(grub_extcmd_context_t ctxt, int arg { int i = 0; int pos = 0; + int defidx = 1; char *buf = NULL; char configfile[128]; persistence_config *node; @@ -3003,9 +3161,13 @@ static grub_err_t ventoy_cmd_sel_persistence(grub_extcmd_context_t ctxt, int arg if (node->autosel >= 0 && node->autosel <= node->backendnum) { - node->cursel = node->autosel - 1; - debug("Persistence image auto select %d\n", node->autosel); - return 0; + defidx = node->autosel; + if (node->timeout < 0) + { + node->cursel = node->autosel - 1; + debug("Persistence image auto select %d\n", node->autosel); + return 0; + } } buf = (char *)grub_malloc(VTOY_MAX_SCRIPT_BUF); @@ -3014,25 +3176,32 @@ static grub_err_t ventoy_cmd_sel_persistence(grub_extcmd_context_t ctxt, int arg return 0; } + if (node->timeout > 0) + { + vtoy_ssprintf(buf, pos, "set timeout=%d\n", node->timeout); + } + vtoy_ssprintf(buf, pos, "menuentry \"Boot without persistence\" {\n" - " echo %s\n}\n", "123"); + " echo %s\n}\n", ""); for (i = 0; i < node->backendnum; i++) { vtoy_ssprintf(buf, pos, "menuentry \"Boot with %s\" {\n" - " echo 123\n}\n", + " echo \"\"\n}\n", node->backendpath[i].path); } g_ventoy_menu_esc = 1; g_ventoy_suppress_esc = 1; - + g_ventoy_suppress_esc_default = defidx; + grub_snprintf(configfile, sizeof(configfile), "configfile mem:0x%llx:size:%d", (ulonglong)(ulong)buf, pos); grub_script_execute_sourcecode(configfile); g_ventoy_menu_esc = 0; g_ventoy_suppress_esc = 0; + g_ventoy_suppress_esc_default = 1; grub_free(buf); @@ -3148,6 +3317,22 @@ static grub_err_t ventoy_cmd_add_replace_file(grub_extcmd_context_t ctxt, int ar VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static grub_err_t ventoy_cmd_get_replace_file_cnt(grub_extcmd_context_t ctxt, int argc, char **args) +{ + char buf[32]; + ventoy_grub_param_file_replace *replace = &(g_grub_param->file_replace); + + (void)ctxt; + + if (argc >= 1) + { + grub_snprintf(buf, sizeof(buf), "%u", replace->old_name_cnt); + grub_env_set(args[0], buf); + } + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + static grub_err_t ventoy_cmd_dump_menu(grub_extcmd_context_t ctxt, int argc, char **args) { (void)ctxt; @@ -3453,9 +3638,11 @@ end: static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data) { + int *pCnt = (int *)data; + (void)disk; - (void)data; + (*pCnt)++; g_part_list_pos += grub_snprintf(g_part_list_buf + g_part_list_pos, VTOY_MAX_SCRIPT_BUF - g_part_list_pos, "0 %llu linear /dev/ventoy %llu\n", (ulonglong)partition->len, (ulonglong)partition->start); @@ -3465,6 +3652,7 @@ static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_par static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, char **args) { + int cnt = 0; char *device_name = NULL; grub_device_t dev = NULL; char buf[64]; @@ -3493,11 +3681,14 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, goto end; } - grub_partition_iterate(dev->disk, ventoy_img_partition_callback, NULL); + grub_partition_iterate(dev->disk, ventoy_img_partition_callback, &cnt); grub_snprintf(buf, sizeof(buf), "newc:vtoy_dm_table:mem:0x%llx:size:%d", (ulonglong)(ulong)g_part_list_buf, g_part_list_pos); grub_env_set("vtoy_img_part_file", buf); + grub_snprintf(buf, sizeof(buf), "%d", cnt); + grub_env_set("vtoy_img_part_cnt", buf); + end: check_free(device_name, grub_free); @@ -4425,6 +4616,454 @@ static grub_err_t ventoy_cmd_get_video_mode(grub_extcmd_context_t ctxt, int argc VENTOY_CMD_RETURN(0); } +static grub_err_t ventoy_cmd_get_efivdisk_offset(grub_extcmd_context_t ctxt, int argc, char **args) +{ + grub_uint32_t i; + grub_uint32_t loadsector = 0; + grub_file_t file; + char value[32]; + grub_uint32_t boot_catlog = 0; + grub_uint8_t buf[512]; + + (void)ctxt; + + if (argc != 2) + { + debug("ventoy_cmd_get_efivdisk_offset, invalid param num %d\n", argc); + return 1; + } + + file = grub_file_open(args[0], VENTOY_FILE_TYPE); + if (!file) + { + debug("failed to open %s\n", args[0]); + return 1; + } + + boot_catlog = ventoy_get_iso_boot_catlog(file); + if (boot_catlog == 0) + { + debug("No bootcatlog found\n"); + grub_file_close(file); + return 1; + } + + grub_memset(buf, 0, sizeof(buf)); + grub_file_seek(file, boot_catlog * 2048); + grub_file_read(file, buf, sizeof(buf)); + grub_file_close(file); + + for (i = 0; i < sizeof(buf); i += 32) + { + if ((buf[i] == 0 || buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0xEF) + { + if (buf[i + 32] == 0x88) + { + loadsector = *(grub_uint32_t *)(buf + i + 32 + 8); + grub_snprintf(value, sizeof(value), "%u", loadsector * 4); //change to sector size 512 + break; + } + } + } + + if (loadsector == 0) + { + debug("No EFI eltorito info found\n"); + return 1; + } + + debug("ventoy_cmd_get_efivdisk_offset <%s>\n", value); + grub_env_set(args[1], value); + VENTOY_CMD_RETURN(0); +} + +static int ventoy_collect_replace_initrd(const char *filename, const struct grub_dirhook_info *info, void *data) +{ + int curpos; + int printlen; + grub_size_t len; + replace_fs_dir *pfsdir = (replace_fs_dir *)data; + + if (pfsdir->initrd[0]) + { + return 1; + } + + curpos = pfsdir->curpos; + len = grub_strlen(filename); + + if (info->dir) + { + if ((len == 1 && filename[0] == '.') || + (len == 2 && filename[0] == '.' && filename[1] == '.')) + { + return 0; + } + + //debug("#### [DIR] <%s> <%s>\n", pfsdir->fullpath, filename); + pfsdir->dircnt++; + + printlen = grub_snprintf(pfsdir->fullpath + curpos, 512 - curpos, "%s/", filename); + pfsdir->curpos = curpos + printlen; + pfsdir->fs->fs_dir(pfsdir->dev, pfsdir->fullpath, ventoy_collect_replace_initrd, pfsdir); + pfsdir->curpos = curpos; + pfsdir->fullpath[curpos] = 0; + } + else + { + //debug("#### [FILE] <%s> <%s>\n", pfsdir->fullpath, filename); + pfsdir->filecnt++; + + /* We consider the xxx.img file bigger than 32MB is the initramfs file */ + if (len > 4 && grub_strncmp(filename + len - 4, ".img", 4) == 0) + { + if (info->size > 32 * VTOY_SIZE_1MB) + { + grub_snprintf(pfsdir->initrd, sizeof(pfsdir->initrd), "%s%s", pfsdir->fullpath, filename); + return 1; + } + } + } + + return 0; +} + +static grub_err_t ventoy_cmd_search_replace_initrd(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int i; + char *pos = NULL; + char *device_name = NULL; + grub_device_t dev = NULL; + grub_fs_t fs = NULL; + replace_fs_dir *pfsdir = NULL; + + (void)ctxt; + + if (argc != 2) + { + debug("ventoy_cmd_search_replace_initrd, invalid param num %d\n", argc); + return 1; + } + + pfsdir = grub_zalloc(sizeof(replace_fs_dir)); + if (!pfsdir) + { + return 1; + } + + device_name = grub_file_get_device_name(args[0]); + if (!device_name) + { + goto fail; + } + + dev = grub_device_open(device_name); + if (!dev) + { + goto fail; + } + + fs = grub_fs_probe(dev); + if (!fs) + { + goto fail; + } + + pfsdir->dev = dev; + pfsdir->fs = fs; + pfsdir->curpos = 1; + pfsdir->fullpath[0] = '/'; + fs->fs_dir(dev, "/", ventoy_collect_replace_initrd, pfsdir); + + if (pfsdir->initrd[0]) + { + debug("Replace initrd <%s> <%d %d>\n", pfsdir->initrd, pfsdir->dircnt, pfsdir->filecnt); + + for (i = 0; i < (int)sizeof(pfsdir->initrd) && pfsdir->initrd[i]; i++) + { + if (pfsdir->initrd[i] == '/') + { + pfsdir->initrd[i] = '\\'; + } + } + + pos = (pfsdir->initrd[0] == '\\') ? pfsdir->initrd + 1 : pfsdir->initrd; + grub_env_set(args[1], pos); + } + else + { + debug("Replace initrd NOT found <%s> <%d %d>\n", args[0], pfsdir->dircnt, pfsdir->filecnt); + } + +fail: + + grub_check_free(pfsdir); + grub_check_free(device_name); + check_free(dev, grub_device_close); + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +static grub_err_t ventoy_cmd_push_pager(grub_extcmd_context_t ctxt, int argc, char **args) +{ + const char *pager = NULL; + + (void)ctxt; + (void)argc; + (void)args; + + pager = grub_env_get("pager"); + if (NULL == pager) + { + g_pager_flag = 1; + grub_env_set("pager", "1"); + } + else if (pager[0] == '1') + { + g_pager_flag = 0; + } + else + { + grub_snprintf(g_old_pager, sizeof(g_old_pager), "%s", pager); + g_pager_flag = 2; + grub_env_set("pager", "1"); + } + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +static grub_err_t ventoy_cmd_pop_pager(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + (void)argc; + (void)args; + + if (g_pager_flag == 1) + { + grub_env_unset("pager"); + } + else if (g_pager_flag == 2) + { + grub_env_set("pager", g_old_pager); + } + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +static int ventoy_chk_case_file(const char *filename, const struct grub_dirhook_info *info, void *data) +{ + if (g_json_case_mis_path[0]) + { + return 1; + } + + if (0 == info->dir && grub_strcasecmp(filename, "ventoy.json") == 0) + { + grub_snprintf(g_json_case_mis_path, 32, "%s/%s", (char *)data, filename); + return 1; + } + return 0; +} + +static int ventoy_chk_case_dir(const char *filename, const struct grub_dirhook_info *info, void *data) +{ + char path[16]; + chk_case_fs_dir *fs_dir = (chk_case_fs_dir *)data; + + if (g_json_case_mis_path[0]) + { + return 1; + } + + if (info->dir && (filename[0] == 'v' || filename[0] == 'V')) + { + if (grub_strcasecmp(filename, "ventoy") == 0) + { + grub_snprintf(path, sizeof(path), "/%s", filename); + fs_dir->fs->fs_dir(fs_dir->dev, path, ventoy_chk_case_file, path); + if (g_json_case_mis_path[0]) + { + return 1; + } + } + } + + return 0; +} + +static grub_err_t ventoy_cmd_chk_json_pathcase(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int fstype = 0; + char *device_name = NULL; + grub_device_t dev = NULL; + grub_fs_t fs = NULL; + chk_case_fs_dir fs_dir; + + (void)ctxt; + (void)argc; + (void)args; + + device_name = grub_file_get_device_name(args[0]); + if (!device_name) + { + goto out; + } + + dev = grub_device_open(device_name); + if (!dev) + { + goto out; + } + + fs = grub_fs_probe(dev); + if (!fs) + { + goto out; + } + + fstype = ventoy_get_fs_type(fs->name); + if (fstype == ventoy_fs_fat || fstype == ventoy_fs_exfat || fstype >= ventoy_fs_max) + { + goto out; + } + + g_json_case_mis_path[0] = 0; + fs_dir.dev = dev; + fs_dir.fs = fs; + fs->fs_dir(dev, "/", ventoy_chk_case_dir, &fs_dir); + + if (g_json_case_mis_path[0]) + { + grub_env_set("VTOY_PLUGIN_PATH_CASE_MISMATCH", g_json_case_mis_path); + } + +out: + + grub_check_free(device_name); + check_free(dev, grub_device_close); + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + +static grub_err_t grub_cmd_gptpriority(grub_extcmd_context_t ctxt, int argc, char **args) +{ + grub_disk_t disk; + grub_partition_t part; + char priority_str[3]; /* Maximum value 15 */ + + (void)ctxt; + + if (argc < 2 || argc > 3) + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "gptpriority DISKNAME PARTITIONNUM [VARNAME]"); + + /* Open the disk if it exists */ + disk = grub_disk_open (args[0]); + if (!disk) + { + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "Not a disk"); + } + + part = grub_partition_probe (disk, args[1]); + if (!part) + { + grub_disk_close (disk); + return grub_error (GRUB_ERR_BAD_ARGUMENT, + "No such partition"); + } + + if (grub_strcmp (part->partmap->name, "gpt")) + { + grub_disk_close (disk); + return grub_error (GRUB_ERR_BAD_PART_TABLE, + "Not a GPT partition"); + } + + grub_snprintf (priority_str, sizeof(priority_str), "%u", + (grub_uint32_t)((part->gpt_attrib >> 48) & 0xfULL)); + + if (argc == 3) + { + grub_env_set (args[2], priority_str); + grub_env_export (args[2]); + } + else + { + grub_printf ("Priority is %s\n", priority_str); + } + + grub_disk_close (disk); + return GRUB_ERR_NONE; +} + + +static grub_err_t grub_cmd_syslinux_nojoliet(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int ret = 1; + int joliet = 0; + grub_file_t file = NULL; + grub_uint32_t loadrba = 0; + grub_uint32_t boot_catlog = 0; + grub_uint8_t sector[512]; + boot_info_table *info = NULL; + + (void)ctxt; + (void)argc; + + /* This also trigger a iso9660 fs parse */ + if (ventoy_check_file_exist("(loop)/isolinux/isolinux.cfg")) + { + return 0; + } + + joliet = grub_iso9660_is_joliet(); + if (joliet == 0) + { + return 1; + } + + file = grub_file_open(args[0], VENTOY_FILE_TYPE); + if (!file) + { + debug("failed to open %s\n", args[0]); + return 1; + } + + boot_catlog = ventoy_get_iso_boot_catlog(file); + if (boot_catlog == 0) + { + debug("no bootcatlog found %u\n", boot_catlog); + goto out; + } + + loadrba = ventoy_get_bios_eltorito_rba(file, boot_catlog); + if (loadrba == 0) + { + debug("no bios eltorito rba found %u\n", loadrba); + goto out; + } + + grub_file_seek(file, loadrba * 2048); + grub_file_read(file, sector, 512); + + info = (boot_info_table *)sector; + if (info->bi_data0 == 0x7c6ceafa && + info->bi_data1 == 0x90900000 && + info->bi_PrimaryVolumeDescriptor == 16 && + info->bi_BootFileLocation == loadrba) + { + debug("bootloader is syslinux, %u.\n", loadrba); + ret = 0; + } + +out: + + grub_file_close(file); + grub_errno = GRUB_ERR_NONE; + return ret; +} + int ventoy_env_init(void) { char buf[64]; @@ -4472,12 +5111,15 @@ int ventoy_env_init(void) return 0; } + + static cmd_para ventoy_cmds[] = { { "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL }, { "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL }, { "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL }, { "vt_str_begin", ventoy_cmd_strbegin, 0, NULL, "", "", NULL }, + { "vt_str_casebegin", ventoy_cmd_strcasebegin, 0, NULL, "", "", NULL }, { "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL }, { "vtdebug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL }, { "vtbreak", ventoy_cmd_break, 0, NULL, "{level}", "set debug break", NULL }, @@ -4532,6 +5174,7 @@ static cmd_para ventoy_cmds[] = { "vt_select_conf_replace", ventoy_select_conf_replace, 0, NULL, "", "", NULL }, { "vt_iso9660_nojoliet", ventoy_cmd_iso9660_nojoliet, 0, NULL, "", "", NULL }, + { "vt_iso9660_isjoliet", ventoy_cmd_iso9660_is_joliet, 0, NULL, "", "", NULL }, { "vt_is_udf", ventoy_cmd_is_udf, 0, NULL, "", "", NULL }, { "vt_file_size", ventoy_cmd_file_size, 0, NULL, "", "", NULL }, { "vt_load_file_to_mem", ventoy_cmd_load_file_to_mem, 0, NULL, "", "", NULL }, @@ -4560,6 +5203,7 @@ static cmd_para ventoy_cmds[] = { "vt_wim_chain_data", ventoy_cmd_wim_chain_data, 0, NULL, "", "", NULL }, { "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL }, + { "vt_get_replace_file_cnt", ventoy_cmd_get_replace_file_cnt, 0, NULL, "", "", NULL }, { "vt_test_block_list", ventoy_cmd_test_block_list, 0, NULL, "", "", NULL }, { "vt_file_exist_nocase", ventoy_cmd_file_exist_nocase, 0, NULL, "", "", NULL }, @@ -4581,6 +5225,7 @@ static cmd_para ventoy_cmds[] = { "vt_unix_reset", ventoy_cmd_unix_reset, 0, NULL, "", "", NULL }, { "vt_unix_replace_conf", ventoy_cmd_unix_replace_conf, 0, NULL, "", "", NULL }, { "vt_unix_replace_ko", ventoy_cmd_unix_replace_ko, 0, NULL, "", "", NULL }, + { "vt_unix_ko_fillmap", ventoy_cmd_unix_ko_fillmap, 0, NULL, "", "", NULL }, { "vt_unix_fill_image_desc", ventoy_cmd_unix_fill_image_desc, 0, NULL, "", "", NULL }, { "vt_unix_gzip_new_ko", ventoy_cmd_unix_gzip_newko, 0, NULL, "", "", NULL }, { "vt_unix_chain_data", ventoy_cmd_unix_chain_data, 0, NULL, "", "", NULL }, @@ -4595,7 +5240,17 @@ static cmd_para ventoy_cmds[] = { "vt_sel_wimboot", ventoy_cmd_sel_wimboot, 0, NULL, "", "", NULL }, { "vt_set_wim_load_prompt", ventoy_cmd_set_wim_prompt, 0, NULL, "", "", NULL }, { "vt_set_theme", ventoy_cmd_set_theme, 0, NULL, "", "", NULL }, + { "vt_set_theme_path", ventoy_cmd_set_theme_path, 0, NULL, "", "", NULL }, + { "vt_select_theme_cfg", ventoy_cmd_select_theme_cfg, 0, NULL, "", "", NULL }, + { "vt_get_efi_vdisk_offset", ventoy_cmd_get_efivdisk_offset, 0, NULL, "", "", NULL }, + { "vt_search_replace_initrd", ventoy_cmd_search_replace_initrd, 0, NULL, "", "", NULL }, + { "vt_push_pager", ventoy_cmd_push_pager, 0, NULL, "", "", NULL }, + { "vt_pop_pager", ventoy_cmd_pop_pager, 0, NULL, "", "", NULL }, + { "vt_check_json_path_case", ventoy_cmd_chk_json_pathcase, 0, NULL, "", "", NULL }, + { "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL }, + { "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL }, + { "vt_syslinux_need_nojoliet", grub_cmd_syslinux_nojoliet, 0, NULL, "", "", NULL }, }; int ventoy_register_all_cmd(void) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index 4c349707..b9f94d5c 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -21,6 +21,8 @@ #ifndef __VENTOY_DEF_H__ #define __VENTOY_DEF_H__ +#define VTOY_MAX_DIR_DEPTH 32 + #define VTOY_MAX_SCRIPT_BUF (4 * 1024 * 1024) #define VTOY_PART_BUF_LEN (128 * 1024) @@ -69,6 +71,9 @@ #define VTOY_ARCH_CPIO "ventoy_x86.cpio" #endif +#define ventoy_varg_4(arg) arg[0], arg[1], arg[2], arg[3] +#define ventoy_varg_8(arg) arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7] + #define VTOY_PWD_CORRUPTED(err) \ {\ grub_printf("\n\n Password corrupted, will reboot after 5 seconds.\n\n"); \ @@ -194,6 +199,18 @@ typedef struct ventoy_iso9660_vd grub_uint32_t space; }ventoy_iso9660_vd; +/* https://wiki.osdev.org/El-Torito */ +typedef struct boot_info_table +{ + grub_uint32_t bi_data0; + grub_uint32_t bi_data1; + grub_uint32_t bi_PrimaryVolumeDescriptor; + grub_uint32_t bi_BootFileLocation; + grub_uint32_t bi_BootFileLength; + grub_uint32_t bi_Checksum; + grub_uint8_t bi_Reserved[40]; +}boot_info_table; + #pragma pack() #define img_type_start 0 @@ -212,6 +229,8 @@ typedef struct img_info char name[256]; const char *alias; + const char *tip1; + const char *tip2; const char *class; const char *menu_prefix; @@ -429,6 +448,18 @@ typedef struct wim_directory_entry /** No security information exists for this file */ #define WIM_NO_SECURITY 0xffffffffUL +typedef struct reg_vk +{ + grub_uint32_t res1; + grub_uint16_t sig; + grub_uint16_t namesize; + grub_uint32_t datasize; + grub_uint32_t dataoffset; + grub_uint32_t datatype; + grub_uint16_t flag; + grub_uint16_t res2; +}reg_vk; + #pragma pack() @@ -531,8 +562,26 @@ typedef struct plugin_entry const char *key; ventoy_plugin_entry_pf entryfunc; ventoy_plugin_check_pf checkfunc; + int flag; }plugin_entry; +typedef struct replace_fs_dir +{ + grub_device_t dev; + grub_fs_t fs; + char fullpath[512]; + char initrd[512]; + int curpos; + int dircnt; + int filecnt; +}replace_fs_dir; + +typedef struct chk_case_fs_dir +{ + grub_device_t dev; + grub_fs_t fs; +}chk_case_fs_dir; + int ventoy_strcmp(const char *pattern, const char *str); int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n); void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param); @@ -548,6 +597,7 @@ grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc, grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_valid_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args); +grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **args); @@ -792,6 +842,7 @@ typedef struct install_template int pathlen; char isopath[256]; + int timeout; int autosel; int cursel; int templatenum; @@ -823,6 +874,7 @@ typedef struct persistence_config int pathlen; char isopath[256]; + int timeout; int autosel; int cursel; int backendnum; @@ -844,6 +896,20 @@ typedef struct menu_alias struct menu_alias *next; }menu_alias; +#define vtoy_tip_image_file 0 +#define vtoy_tip_directory 1 +typedef struct menu_tip +{ + int type; + int pathlen; + char isopath[256]; + char tip1[1024]; + char tip2[1024]; + + struct menu_tip *next; +}menu_tip; + + #define vtoy_class_image_file 0 #define vtoy_class_directory 1 @@ -875,6 +941,7 @@ typedef struct custom_boot typedef struct conf_replace { int pathlen; + int img; char isopath[256]; char orgconf[256]; char newconf[256]; @@ -939,6 +1006,7 @@ typedef struct menu_password extern int g_ventoy_menu_esc; extern int g_ventoy_suppress_esc; +extern int g_ventoy_suppress_esc_default; extern int g_ventoy_last_entry; extern int g_ventoy_memdisk_mode; extern int g_ventoy_iso_raw; @@ -983,6 +1051,8 @@ extern grub_uint32_t g_ventoy_plat_data; #define ventoy_syscall0(name) grub_##name() #define ventoy_syscall1(name, a) grub_##name(a) +void ventoy_str_tolower(char *str); +void ventoy_str_toupper(char *str); char * ventoy_get_line(char *start); int ventoy_cmp_img(img_info *img1, img_info *img2); void ventoy_swap_img(img_info *img1, img_info *img2); @@ -996,6 +1066,7 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath); int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list); const char * ventoy_plugin_get_injection(const char *isopath); const char * ventoy_plugin_get_menu_alias(int type, const char *isopath); +const menu_tip * ventoy_plugin_get_menu_tip(int type, const char *isopath); const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path); int ventoy_plugin_check_memdisk(const char *isopath); int ventoy_plugin_get_image_list_index(int type, const char *name); @@ -1006,6 +1077,8 @@ int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, gr int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start); void ventoy_plugin_dump_persistence(void); grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args); +grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char **args); +grub_err_t ventoy_cmd_select_theme_cfg(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_check_password(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, int argc, char **args); @@ -1017,6 +1090,7 @@ int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid, grub_uint8_t grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args); +grub_err_t ventoy_cmd_unix_ko_fillmap(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_gzip_newko(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args); @@ -1053,5 +1127,31 @@ int ventoy_chain_file_read(const char *path, int offset, int len, void *buf); grub_env_export(env);\ } +#define ret_goto_end(a) ret = a; goto end; + +extern ventoy_grub_param *g_grub_param; + +#pragma pack(1) +#define VENTOY_UNIX_SEG_MAGIC0 0x11223344 +#define VENTOY_UNIX_SEG_MAGIC1 0x55667788 +#define VENTOY_UNIX_SEG_MAGIC2 0x99aabbcc +#define VENTOY_UNIX_SEG_MAGIC3 0xddeeff00 +#define VENTOY_UNIX_MAX_SEGNUM 40960 +struct g_ventoy_seg { + grub_uint64_t seg_start_bytes; + grub_uint64_t seg_end_bytes; +}; + +struct g_ventoy_map{ + grub_uint32_t magic1[4]; + grub_uint32_t magic2[4]; + grub_uint64_t segnum; + grub_uint64_t disksize; + grub_uint8_t diskuuid[16]; + struct g_ventoy_seg seglist[VENTOY_UNIX_MAX_SEGNUM]; + grub_uint32_t magic3[4]; +}; +#pragma pack() + #endif /* __VENTOY_DEF_H__ */ diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_json.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_json.c index b9e4a743..8f81779f 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_json.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_json.c @@ -152,6 +152,23 @@ static int vtoy_json_parse_string return JSON_FAILED; } + if (*(pcPos - 1) == '\\') + { + for (pcPos++; *pcPos; pcPos++) + { + if (*pcPos == '"' && *(pcPos - 1) != '\\') + { + break; + } + } + + if (*pcPos == 0 || pcPos < pcTmp) + { + json_debug("Invalid quotes string %s.", pcData); + return JSON_FAILED; + } + } + *ppcEnd = pcPos + 1; uiLen = (grub_uint32_t)(unsigned long)(pcPos - pcTmp); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c index 8c7a8ff9..37910c76 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_linux.c @@ -38,6 +38,9 @@ GRUB_MOD_LICENSE ("GPLv3+"); +#define VTOY_APPEND_EXT_SIZE 4096 +static int g_append_ext_sector = 0; + char * ventoy_get_line(char *start) { if (start == NULL) @@ -333,7 +336,9 @@ end: static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName) { int i = 0; + int len = 0; int dollar = 0; + int quotation = 0; grub_file_t file = NULL; char *buf = NULL; char *start = NULL; @@ -382,6 +387,12 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName) start++; } + if (*start == '"') + { + quotation = 1; + start++; + } + while (*start) { img = grub_zalloc(sizeof(initrd_info)); @@ -400,6 +411,16 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName) } } + if (quotation) + { + len = (int)grub_strlen(img->name); + if (len > 2 && img->name[len - 1] == '"') + { + img->name[len - 1] = 0; + } + debug("Remove quotation <%s>\n", img->name); + } + if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name)) { grub_free(img); @@ -640,6 +661,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_count(void) count++; } + if (g_append_ext_sector > 0) + { + count++; + } + return count; } @@ -653,6 +679,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void) { size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align; } + + if (g_append_ext_sector > 0) + { + size += sizeof(ventoy_virt_chunk) + VTOY_APPEND_EXT_SIZE; + } return size; } @@ -660,6 +691,7 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void) static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain) { int id = 0; + int virtid = 0; initrd_info *node; grub_uint64_t sector; grub_uint32_t offset; @@ -707,6 +739,29 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_ offset += g_ventoy_cpio_size; sector += cpio_secs + initrd_secs; cur++; + virtid++; + } + + /* Lenovo EasyStartup need an addional sector for boundary check */ + if (g_append_ext_sector > 0) + { + cpio_secs = VTOY_APPEND_EXT_SIZE / 2048; + + cur->mem_sector_start = sector; + cur->mem_sector_end = cur->mem_sector_start + cpio_secs; + cur->mem_sector_offset = offset; + cur->remap_sector_start = 0; + cur->remap_sector_end = 0; + cur->org_sector_start = 0; + + grub_memset(override + offset, 0, VTOY_APPEND_EXT_SIZE); + + chain->virt_img_size_in_bytes += VTOY_APPEND_EXT_SIZE; + + offset += VTOY_APPEND_EXT_SIZE; + sector += cpio_secs; + cur++; + virtid++; } if (g_conf_replace_offset > 0) @@ -724,9 +779,15 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_ chain->virt_img_size_in_bytes += g_conf_replace_new_len_align; + if (g_grub_param->img_replace.magic == GRUB_IMG_REPLACE_MAGIC) + { + g_grub_param->img_replace.new_file_virtual_id = virtid; + } + offset += g_conf_replace_new_len_align; sector += cpio_secs; cur++; + virtid++; } return; @@ -926,6 +987,12 @@ static grub_err_t ventoy_linux_locate_initrd(int filt, int *filtcnt) } } + /* skip hdt.img */ + if (file->size <= VTOY_SIZE_1MB && grub_strcmp(node->name, "/boot/hdt.img") == 0) + { + continue; + } + if (grub_strcmp(file->fs->name, "iso9660") == 0) { node->iso_type = 0; @@ -1101,6 +1168,24 @@ grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)ctxt; + (void)argc; + (void)args; + + if (args[0][0] == '1') + { + g_append_ext_sector = 1; + } + else + { + g_append_ext_sector = 0; + } + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args) { int i; @@ -1441,9 +1526,9 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char ** VENTOY_CMD_RETURN(GRUB_ERR_NONE); } - grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args) { + int len = 0; int ventoy_compatible = 0; grub_uint32_t size = 0; grub_uint64_t isosize = 0; @@ -1483,23 +1568,31 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha isosize = file->size; - boot_catlog = ventoy_get_iso_boot_catlog(file); - if (boot_catlog) + len = (int)grub_strlen(args[0]); + if (len >= 4 && 0 == grub_strcasecmp(args[0] + len - 4, ".img")) { - if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog))) - { - grub_env_set("LoadIsoEfiDriver", "on"); - } + debug("boot catlog %u for img file\n", boot_catlog); } else { - if (ventoy_is_efi_os()) + boot_catlog = ventoy_get_iso_boot_catlog(file); + if (boot_catlog) { - grub_env_set("LoadIsoEfiDriver", "on"); + if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog))) + { + grub_env_set("LoadIsoEfiDriver", "on"); + } } else { - return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]); + if (ventoy_is_efi_os()) + { + grub_env_set("LoadIsoEfiDriver", "on"); + } + else + { + return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]); + } } } diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c index c41d9649..59fca857 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c @@ -48,6 +48,7 @@ static install_template *g_install_template_head = NULL; static dud *g_dud_head = NULL; static menu_password *g_pwd_head = NULL; static persistence_config *g_persistence_head = NULL; +static menu_tip *g_menu_tip_head = NULL; static menu_alias *g_menu_alias_head = NULL; static menu_class *g_menu_class_head = NULL; static custom_boot *g_custom_boot_head = NULL; @@ -56,6 +57,7 @@ static auto_memdisk *g_auto_memdisk_head = NULL; static image_list *g_image_list_head = NULL; static conf_replace *g_conf_replace_head = NULL; +static int g_theme_id = 0; static int g_theme_num = 0; static theme_list *g_theme_head = NULL; static int g_theme_random = vtoy_theme_random_boot_second; @@ -280,6 +282,7 @@ static int ventoy_plugin_theme_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_theme_entry(VTOY_JSON *json, const char *isodisk) { const char *value; + char val[64]; char filepath[256]; VTOY_JSON *node = NULL; theme_list *tail = NULL; @@ -365,6 +368,18 @@ static int ventoy_plugin_theme_entry(VTOY_JSON *json, const char *isodisk) } } } + + grub_snprintf(val, sizeof(val), "%d", g_theme_num); + grub_env_set("VTOY_THEME_COUNT", val); + grub_env_export("VTOY_THEME_COUNT"); + if (g_theme_num > 0) + { + vtoy_json_get_int(json->pstChild, "default_file", &g_theme_id); + if (g_theme_id > g_theme_num || g_theme_id < 0) + { + g_theme_id = 0; + } + } value = vtoy_json_get_string_ex(json->pstChild, "gfxmode"); if (value) @@ -601,6 +616,7 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk { int pathnum = 0; int autosel = 0; + int timeout = 0; char *pos = NULL; const char *iso = NULL; VTOY_JSON *pNode = NULL; @@ -637,6 +653,18 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk grub_printf("autosel: %d [FAIL]\n", autosel); } } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "timeout", &timeout)) + { + if (timeout >= 0) + { + grub_printf("timeout: %d [OK]\n", timeout); + } + else + { + grub_printf("timeout: %d [FAIL]\n", timeout); + } + } } else { @@ -661,6 +689,18 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk grub_printf("autosel: %d [FAIL]\n", autosel); } } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "timeout", &timeout)) + { + if (timeout >= 0) + { + grub_printf("timeout: %d [OK]\n", timeout); + } + else + { + grub_printf("timeout: %d [FAIL]\n", timeout); + } + } } else { @@ -681,6 +721,7 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk int type = 0; int pathnum = 0; int autosel = 0; + int timeout = 0; const char *iso = NULL; VTOY_JSON *pNode = NULL; install_template *node = NULL; @@ -728,6 +769,7 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk node->templatenum = pathnum; node->autosel = -1; + node->timeout = -1; if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel)) { if (autosel >= 0 && autosel <= pathnum) @@ -735,6 +777,14 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk node->autosel = autosel; } } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "timeout", &timeout)) + { + if (timeout >= 0) + { + node->timeout = timeout; + } + } if (g_install_template_head) { @@ -1174,6 +1224,7 @@ static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk) { int autosel = 0; + int timeout = 0; int pathnum = 0; char *pos = NULL; const char *iso = NULL; @@ -1212,6 +1263,18 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk) grub_printf("autosel: %d [FAIL]\n", autosel); } } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "timeout", &timeout)) + { + if (timeout >= 0) + { + grub_printf("timeout: %d [OK]\n", timeout); + } + else + { + grub_printf("timeout: %d [FAIL]\n", timeout); + } + } } else { @@ -1230,6 +1293,7 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk) { int autosel = 0; + int timeout = 0; int pathnum = 0; const char *iso = NULL; VTOY_JSON *pNode = NULL; @@ -1272,6 +1336,7 @@ static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk) node->backendnum = pathnum; node->autosel = -1; + node->timeout = -1; if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel)) { if (autosel >= 0 && autosel <= pathnum) @@ -1279,6 +1344,14 @@ static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk) node->autosel = autosel; } } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "timeout", &timeout)) + { + if (timeout >= 0) + { + node->timeout = timeout; + } + } if (g_persistence_head) { @@ -1417,6 +1490,207 @@ static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk) return 0; } +static int ventoy_plugin_menutip_check(VTOY_JSON *json, const char *isodisk) +{ + int type; + const char *path = NULL; + const char *tip = NULL; + VTOY_JSON *pNode = NULL; + + (void)isodisk; + + if (json->enDataType != JSON_TYPE_OBJECT) + { + grub_printf("Not object %d\n", json->enDataType); + return 1; + } + + tip = vtoy_json_get_string_ex(json->pstChild, "left"); + if (tip) + { + grub_printf("left: <%s>\n", tip); + } + + tip = vtoy_json_get_string_ex(json->pstChild, "top"); + if (tip) + { + grub_printf("top: <%s>\n", tip); + } + + tip = vtoy_json_get_string_ex(json->pstChild, "color"); + if (tip) + { + grub_printf("color: <%s>\n", tip); + } + + pNode = vtoy_json_find_item(json->pstChild, JSON_TYPE_ARRAY, "tips"); + for (pNode = pNode->pstChild; pNode; pNode = pNode->pstNext) + { + type = vtoy_tip_image_file; + path = vtoy_json_get_string_ex(pNode->pstChild, "image"); + if (!path) + { + path = vtoy_json_get_string_ex(pNode->pstChild, "dir"); + type = vtoy_tip_directory; + } + + if (path && path[0] == '/') + { + if (vtoy_tip_image_file == type) + { + if (grub_strchr(path, '*')) + { + grub_printf("image: <%s> [ * ]\n", path); + } + else if (ventoy_is_file_exist("%s%s", isodisk, path)) + { + grub_printf("image: <%s> [ OK ]\n", path); + } + else + { + grub_printf("image: <%s> [ NOT EXIST ]\n", path); + } + } + else + { + if (ventoy_is_dir_exist("%s%s", isodisk, path)) + { + grub_printf("dir: <%s> [ OK ]\n", path); + } + else + { + grub_printf("dir: <%s> [ NOT EXIST ]\n", path); + } + } + + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip"); + if (tip) + { + grub_printf("tip: <%s>\n", tip); + } + else + { + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip1"); + if (tip) + grub_printf("tip1: <%s>\n", tip); + else + grub_printf("tip1: \n"); + + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip2"); + if (tip) + grub_printf("tip2: <%s>\n", tip); + else + grub_printf("tip2: \n"); + } + } + else + { + grub_printf("image: <%s> [ INVALID ]\n", path); + } + } + + return 0; +} + +static int ventoy_plugin_menutip_entry(VTOY_JSON *json, const char *isodisk) +{ + int type; + const char *path = NULL; + const char *tip = NULL; + VTOY_JSON *pNode = NULL; + menu_tip *node = NULL; + menu_tip *next = NULL; + + (void)isodisk; + + if (json->enDataType != JSON_TYPE_OBJECT) + { + debug("Not object %d\n", json->enDataType); + return 0; + } + + pNode = vtoy_json_find_item(json->pstChild, JSON_TYPE_ARRAY, "tips"); + if (pNode == NULL) + { + debug("Not tips found\n"); + return 0; + } + + if (g_menu_tip_head) + { + for (node = g_menu_tip_head; node; node = next) + { + next = node->next; + grub_free(node); + } + + g_menu_tip_head = NULL; + } + + tip = vtoy_json_get_string_ex(json->pstChild, "left"); + if (tip) + { + grub_env_set("VTOY_TIP_LEFT", tip); + } + + tip = vtoy_json_get_string_ex(json->pstChild, "top"); + if (tip) + { + grub_env_set("VTOY_TIP_TOP", tip); + } + + tip = vtoy_json_get_string_ex(json->pstChild, "color"); + if (tip) + { + grub_env_set("VTOY_TIP_COLOR", tip); + } + + for (pNode = pNode->pstChild; pNode; pNode = pNode->pstNext) + { + type = vtoy_tip_image_file; + path = vtoy_json_get_string_ex(pNode->pstChild, "image"); + if (!path) + { + path = vtoy_json_get_string_ex(pNode->pstChild, "dir"); + type = vtoy_tip_directory; + } + + if (path && path[0] == '/') + { + node = grub_zalloc(sizeof(menu_tip)); + if (node) + { + node->type = type; + node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", path); + + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip"); + if (tip) + { + grub_snprintf(node->tip1, 1000, "%s", tip); + } + else + { + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip1"); + if (tip) + grub_snprintf(node->tip1, 1000, "%s", tip); + + tip = vtoy_json_get_string_ex(pNode->pstChild, "tip2"); + if (tip) + grub_snprintf(node->tip2, 1000, "%s", tip); + } + + if (g_menu_tip_head) + { + node->next = g_menu_tip_head; + } + + g_menu_tip_head = node; + } + } + } + + return 0; +} static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk) { @@ -1776,6 +2050,7 @@ static int ventoy_plugin_custom_boot_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk) { + int img = 0; const char *isof = NULL; const char *orgf = NULL; const char *newf = NULL; @@ -1813,6 +2088,11 @@ static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk node = grub_zalloc(sizeof(conf_replace)); if (node) { + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "img", &img)) + { + node->img = img; + } + node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", isof); grub_snprintf(node->orgconf, sizeof(node->orgconf), "%s", orgf); grub_snprintf(node->newconf, sizeof(node->newconf), "%s", newf); @@ -1835,6 +2115,7 @@ static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk) { + int img = 0; const char *isof = NULL; const char *orgf = NULL; const char *newf = NULL; @@ -1904,7 +2185,7 @@ static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk } else { - grub_printf("new:<%s> [OK]\n", newf); + grub_printf("new1:<%s> [OK]\n", newf); } grub_file_close(file); } @@ -1912,6 +2193,12 @@ static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk { grub_printf("new:<%s> [NOT Exist]\n", newf); } + + if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "img", &img)) + { + grub_printf("img:<%d>\n", img); + } + grub_printf("\n"); } } @@ -2096,44 +2383,59 @@ static int ventoy_plugin_image_list_check(VTOY_JSON *json, const char *isodisk) static plugin_entry g_plugin_entries[] = { - { "control", ventoy_plugin_control_entry, ventoy_plugin_control_check }, - { "theme", ventoy_plugin_theme_entry, ventoy_plugin_theme_check }, - { "auto_install", ventoy_plugin_auto_install_entry, ventoy_plugin_auto_install_check }, - { "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check }, - { "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check }, - { "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check }, - { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check }, - { "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check }, - { "image_list", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check }, - { "image_blacklist", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check }, - { "conf_replace", ventoy_plugin_conf_replace_entry, ventoy_plugin_conf_replace_check }, - { "dud", ventoy_plugin_dud_entry, ventoy_plugin_dud_check }, - { "password", ventoy_plugin_pwd_entry, ventoy_plugin_pwd_check }, - { "custom_boot", ventoy_plugin_custom_boot_entry, ventoy_plugin_custom_boot_check }, + { "control", ventoy_plugin_control_entry, ventoy_plugin_control_check, 0 }, + { "theme", ventoy_plugin_theme_entry, ventoy_plugin_theme_check, 0 }, + { "auto_install", ventoy_plugin_auto_install_entry, ventoy_plugin_auto_install_check, 0 }, + { "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check, 0 }, + { "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check, 0 }, + { "menu_tip", ventoy_plugin_menutip_entry, ventoy_plugin_menutip_check, 0 }, + { "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check, 0 }, + { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check, 0 }, + { "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check, 0 }, + { "image_list", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check, 0 }, + { "image_blacklist", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check, 0 }, + { "conf_replace", ventoy_plugin_conf_replace_entry, ventoy_plugin_conf_replace_check, 0 }, + { "dud", ventoy_plugin_dud_entry, ventoy_plugin_dud_check, 0 }, + { "password", ventoy_plugin_pwd_entry, ventoy_plugin_pwd_check, 0 }, + { "custom_boot", ventoy_plugin_custom_boot_entry, ventoy_plugin_custom_boot_check, 0 }, }; static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk) { int i; char key[128]; - VTOY_JSON *cur = json; + VTOY_JSON *cur = NULL; grub_snprintf(g_iso_disk_name, sizeof(g_iso_disk_name), "%s", isodisk); - while (cur) + for (cur = json; cur; cur = cur->pstNext) { for (i = 0; i < (int)ARRAY_SIZE(g_plugin_entries); i++) { grub_snprintf(key, sizeof(key), "%s_%s", g_plugin_entries[i].key, g_arch_mode_suffix); - if (grub_strcmp(g_plugin_entries[i].key, cur->pcName) == 0 || grub_strcmp(key, cur->pcName) == 0) + if (g_plugin_entries[i].flag == 0 && grub_strcmp(key, cur->pcName) == 0) { debug("Plugin entry for %s\n", g_plugin_entries[i].key); g_plugin_entries[i].entryfunc(cur, isodisk); + g_plugin_entries[i].flag = 1; break; } } + } + - cur = cur->pstNext; + for (cur = json; cur; cur = cur->pstNext) + { + for (i = 0; i < (int)ARRAY_SIZE(g_plugin_entries); i++) + { + if (g_plugin_entries[i].flag == 0 && grub_strcmp(g_plugin_entries[i].key, cur->pcName) == 0) + { + debug("Plugin entry for %s\n", g_plugin_entries[i].key); + g_plugin_entries[i].entryfunc(cur, isodisk); + g_plugin_entries[i].flag = 1; + break; + } + } } return 0; @@ -2142,13 +2444,20 @@ static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk) grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args) { int ret = 0; + int offset = 0; char *buf = NULL; + grub_uint8_t *code = NULL; grub_file_t file; VTOY_JSON *json = NULL; (void)ctxt; (void)argc; + grub_env_set("VTOY_TIP_LEFT", "10%"); + grub_env_set("VTOY_TIP_TOP", "80%+5"); + grub_env_set("VTOY_TIP_COLOR", "blue"); + grub_env_set("VTOY_TIP_ALIGN", "left"); + file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "%s/ventoy/ventoy.json", args[0]); if (!file) { @@ -2174,9 +2483,25 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a return 1; } - + code = (grub_uint8_t *)buf; + if (code[0] == 0xef && code[1] == 0xbb && code[2] == 0xbf) + { + offset = 3; /* Skip UTF-8 BOM */ + } + else if ((code[0] == 0xff && code[1] == 0xfe) || (code[0] == 0xfe && code[1] == 0xff)) + { + grub_env_set("VTOY_PLUGIN_SYNTAX_ERROR", "1"); + grub_env_export("VTOY_PLUGIN_SYNTAX_ERROR"); - ret = vtoy_json_parse(json, buf); + grub_env_set("VTOY_PLUGIN_ENCODE_ERROR", "1"); + grub_env_export("VTOY_PLUGIN_ENCODE_ERROR"); + + debug("Failed to parse json string %d\n", ret); + grub_free(buf); + return 1; + } + + ret = vtoy_json_parse(json, buf + offset); if (ret) { grub_env_set("VTOY_PLUGIN_SYNTAX_ERROR", "1"); @@ -2205,6 +2530,15 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a } } + if (g_menu_tip_head) + { + grub_env_set("VTOY_MENU_TIP_ENABLE", "1"); + } + else + { + grub_env_unset("VTOY_MENU_TIP_ENABLE"); + } + VENTOY_CMD_RETURN(GRUB_ERR_NONE); } @@ -2465,6 +2799,29 @@ const char * ventoy_plugin_get_menu_alias(int type, const char *isopath) return NULL; } +const menu_tip * ventoy_plugin_get_menu_tip(int type, const char *isopath) +{ + int len; + menu_tip *node = NULL; + + if (!g_menu_tip_head) + { + return NULL; + } + + len = (int)grub_strlen(isopath); + for (node = g_menu_tip_head; node; node = node->next) + { + if (node->type == type && node->pathlen && + node->pathlen == len && ventoy_strcmp(node->isopath, isopath) == 0) + { + return node; + } + } + + return NULL; +} + const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path) { int namelen; @@ -2891,7 +3248,7 @@ grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, ch grub_snprintf(key, sizeof(key), "%s_%s", args[1], g_arch_mode_suffix); for (node = json->pstChild; node; node = node->pstNext) { - if (grub_strcmp(node->pcName, args[1]) == 0 || grub_strcmp(node->pcName, key) == 0) + if (grub_strcmp(node->pcName, key) == 0) { break; } @@ -2899,8 +3256,19 @@ grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, ch if (!node) { - grub_printf("%s is NOT found in ventoy.json\n", args[1]); - goto end; + for (node = json->pstChild; node; node = node->pstNext) + { + if (grub_strcmp(node->pcName, args[1]) == 0) + { + break; + } + } + + if (!node) + { + grub_printf("%s is NOT found in ventoy.json\n", args[1]); + goto end; + } } for (i = 0; i < (int)ARRAY_SIZE(g_plugin_entries); i++) @@ -2923,6 +3291,65 @@ end: return 0; } +grub_err_t ventoy_cmd_select_theme_cfg(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int pos = 0; + int bufsize = 0; + char *name = NULL; + char *buf = NULL; + theme_list *node = NULL; + + (void)argc; + (void)args; + (void)ctxt; + + if (g_theme_single_file[0]) + { + return 0; + } + + if (g_theme_num < 2) + { + return 0; + } + + bufsize = (g_theme_num + 1) * 1024; + buf = grub_malloc(bufsize); + if (!buf) + { + return 0; + } + + for (node = g_theme_head; node; node = node->next) + { + name = grub_strstr(node->theme.path, ")/"); + if (name) + { + name++; + } + else + { + name = node->theme.path; + } + + pos += grub_snprintf(buf + pos, bufsize - pos, + "menuentry \"%s\" --class=debug_theme_item --class=debug_theme_select --class=F5tool {\n" + "vt_set_theme_path \"%s\"\n" + "}\n", + name, node->theme.path); + } + + pos += grub_snprintf(buf + pos, bufsize - pos, + "menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {\n" + "echo 'Return ...'\n" + "}\n"); + + grub_script_execute_sourcecode(buf); + grub_free(buf); + + return 0; +} + grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args) { grub_uint32_t i = 0; @@ -2947,6 +3374,17 @@ grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **arg { goto end; } + + if (g_theme_id > 0 && g_theme_id <= g_theme_num) + { + for (i = 0; i < (grub_uint32_t)(g_theme_id - 1) && node; i++) + { + node = node->next; + } + + grub_env_set("theme", node->theme.path); + goto end; + } grub_memset(&datetime, 0, sizeof(datetime)); grub_get_datetime(&datetime); @@ -2978,7 +3416,25 @@ grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **arg grub_env_set("theme", node->theme.path); end: + VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +extern char g_ventoy_theme_path[256]; +grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char **args) +{ + (void)argc; + (void)ctxt; + + if (argc == 0) + { + g_ventoy_theme_path[0] = 0; + } + else + { + grub_snprintf(g_ventoy_theme_path, sizeof(g_ventoy_theme_path), "%s", args[0]); + } + + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c index 179739b2..fe581447 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_unix.c @@ -47,6 +47,11 @@ char *g_conf_new_data = NULL; int g_mod_new_len = 0; char *g_mod_new_data = NULL; +int g_mod_search_magic = 0; + +int g_ko_fillmap_len = 0; +char *g_ko_fillmap_data = NULL; + grub_uint64_t g_mod_override_offset = 0; grub_uint64_t g_conf_override_offset = 0; @@ -82,6 +87,15 @@ static grub_uint32_t ventoy_unix_get_override_chunk_count(void) { count++; } + + if (g_ko_fillmap_len > 0) + { + count += (g_ko_fillmap_len / 512); + if ((g_ko_fillmap_len % 512) > 0) + { + count++; + } + } return count; } @@ -121,15 +135,50 @@ static grub_uint32_t ventoy_unix_get_virt_chunk_size(void) return size; } -static void ventoy_unix_fill_override_data( grub_uint64_t isosize, void *override) +static void ventoy_unix_fill_map_data(ventoy_chain_head *chain, struct g_ventoy_map *map) { + grub_uint32_t i; + ventoy_img_chunk *chunk = NULL; + + debug("Fill unix map data: <%llu> <%u> %p\n", + (unsigned long long)chain->os_param.vtoy_disk_size, g_img_chunk_list.cur_chunk, map); + + map->magic1[0] = map->magic2[0] = VENTOY_UNIX_SEG_MAGIC0; + map->magic1[1] = map->magic2[1] = VENTOY_UNIX_SEG_MAGIC1; + map->magic1[2] = map->magic2[2] = VENTOY_UNIX_SEG_MAGIC2; + map->magic1[3] = map->magic2[3] = VENTOY_UNIX_SEG_MAGIC3; + + map->disksize = chain->os_param.vtoy_disk_size; + grub_memcpy(map->diskuuid, chain->os_param.vtoy_disk_guid, 16); + + map->segnum = g_img_chunk_list.cur_chunk; + if (g_img_chunk_list.cur_chunk > VENTOY_UNIX_MAX_SEGNUM) + { + debug("####[FAIL] Too many segments for the ISO file %u\n", g_img_chunk_list.cur_chunk); + map->segnum = VENTOY_UNIX_MAX_SEGNUM; + } + + for (i = 0; i < (grub_uint32_t)(map->segnum); i++) + { + chunk = g_img_chunk_list.chunk + i; + map->seglist[i].seg_start_bytes = chunk->disk_start_sector * 512ULL; + map->seglist[i].seg_end_bytes = (chunk->disk_end_sector + 1) * 512ULL; + } +} + +static void ventoy_unix_fill_override_data( grub_uint64_t isosize, ventoy_chain_head *chain) +{ + int i; + int left; + char *data = NULL; + grub_uint64_t offset; grub_uint64_t sector; ventoy_override_chunk *cur; ventoy_iso9660_override *dirent; sector = (isosize + 2047) / 2048; - cur = (ventoy_override_chunk *)override; + cur = (ventoy_override_chunk *)((char *)chain + chain->override_chunk_offset); if (g_conf_new_len > 0) { @@ -142,12 +191,12 @@ static void ventoy_unix_fill_override_data( grub_uint64_t isosize, void *over dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector); dirent->size_be = grub_swap_bytes32(dirent->size); sector += (dirent->size + 2047) / 2048; + cur++; } if (g_mod_new_len > 0) { /* mod.ko */ - cur++; cur->img_offset = g_mod_override_offset; cur->override_size = sizeof(ventoy_iso9660_override); dirent = (ventoy_iso9660_override *)cur->override_data; @@ -156,6 +205,37 @@ static void ventoy_unix_fill_override_data( grub_uint64_t isosize, void *over dirent->first_sector_be = grub_swap_bytes32(dirent->first_sector); dirent->size_be = grub_swap_bytes32(dirent->size); sector += (dirent->size + 2047) / 2048; + cur++; + } + + if (g_ko_fillmap_len > 0) + { + data = g_ko_fillmap_data; + offset = g_mod_override_offset; + + ventoy_unix_fill_map_data(chain, (struct g_ventoy_map *)data); + + for (i = 0; i < g_ko_fillmap_len / 512; i++) + { + cur->img_offset = offset; + cur->override_size = 512; + grub_memcpy(cur->override_data, data, 512); + + offset += 512; + data += 512; + cur++; + } + + left = (g_ko_fillmap_len % 512); + if (left > 0) + { + cur->img_offset = offset; + cur->override_size = left; + grub_memcpy(cur->override_data, data, left); + + offset += left; + cur++; + } } return; @@ -182,6 +262,11 @@ static void ventoy_unix_fill_virt_data( grub_uint64_t isosize, ventoy_chain_h if (g_mod_new_len > 0) { + if (g_mod_search_magic > 0) + { + ventoy_unix_fill_map_data(chain, (struct g_ventoy_map *)(g_mod_new_data + g_mod_search_magic)); + } + ventoy_unix_fill_virt(g_mod_new_data, g_mod_new_len); } @@ -210,6 +295,12 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath) vtoy_ssprintf(buf, pos, "ventoy_load=\"%s\"\n", "YES"); vtoy_ssprintf(buf, pos, "ventoy_name=\"%s\"\n", g_ko_mod_path); + if (g_mod_search_magic) + { + debug("hint.ventoy NO need\n"); + goto out; + } + disk = isofile->device->disk; ventoy_get_disk_guid(isofile->name, disk_guid, disk_sig); @@ -232,8 +323,8 @@ static int ventoy_freebsd_append_conf(char *buf, const char *isopath) (ulonglong)((chunk->disk_end_sector + 1) * 512)); } +out: grub_file_close(isofile); - return pos; } @@ -258,13 +349,16 @@ grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **ar (void)argc; (void)args; + g_mod_search_magic = 0; g_conf_new_len = 0; g_mod_new_len = 0; g_mod_override_offset = 0; g_conf_override_offset = 0; + g_ko_fillmap_len = 0; check_free(g_mod_new_data, grub_free); check_free(g_conf_new_data, grub_free); + check_free(g_ko_fillmap_data, grub_free); VENTOY_CMD_RETURN(GRUB_ERR_NONE); } @@ -624,6 +718,27 @@ grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, ch VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +static int ventoy_unix_search_magic(char *data, int len) +{ + int i; + grub_uint32_t *magic = NULL; + + for (i = 0; i < len; i += 65536) + { + magic = (grub_uint32_t *)(data + i); + if (magic[0] == VENTOY_UNIX_SEG_MAGIC0 && magic[1] == VENTOY_UNIX_SEG_MAGIC1 && + magic[2] == VENTOY_UNIX_SEG_MAGIC2 && magic[3] == VENTOY_UNIX_SEG_MAGIC3) + { + debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 16)); + g_mod_search_magic = i; + return 0; + } + } + + debug("unix can not find search magic\n"); + return 1; +} + grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args) { char *data; @@ -673,10 +788,73 @@ grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char g_mod_new_data = data; g_mod_new_len = (int)file->size; + + ventoy_unix_search_magic(g_mod_new_data, g_mod_new_len); VENTOY_CMD_RETURN(GRUB_ERR_NONE); } +grub_err_t ventoy_cmd_unix_ko_fillmap(grub_extcmd_context_t ctxt, int argc, char **args) +{ + int i; + grub_file_t file; + grub_uint32_t magic[4]; + grub_uint32_t len; + + (void)ctxt; + + if (argc != 1) + { + debug("Fillmap ko invalid argc %d\n", argc); + return 1; + } + + debug("Fillmap ko %s\n", args[0]); + + file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", args[0]); + if (file) + { + grub_file_read(file, magic, 4); /* read for trigger */ + g_mod_override_offset = grub_iso9660_get_last_read_pos(file); + } + else + { + debug("Can't find replace ko file from %s\n", args[0]); + return 1; + } + + for (i = 0; i < (int)(file->size); i += 65536) + { + magic[0] = 0; + grub_file_seek(file, i); + grub_file_read(file, magic, sizeof(magic)); + + if (magic[0] == VENTOY_UNIX_SEG_MAGIC0 && magic[1] == VENTOY_UNIX_SEG_MAGIC1 && + magic[2] == VENTOY_UNIX_SEG_MAGIC2 && magic[3] == VENTOY_UNIX_SEG_MAGIC3) + { + debug("unix find search magic at 0x%x loop:%d\n", i, (i >> 16)); + g_mod_override_offset += i; + break; + } + } + + len = (grub_uint32_t)OFFSET_OF(struct g_ventoy_map, seglist) + + (sizeof(struct g_ventoy_seg) * g_img_chunk_list.cur_chunk); + + g_ko_fillmap_len = (int)len; + g_ko_fillmap_data = grub_malloc(len); + if (!g_ko_fillmap_data) + { + g_ko_fillmap_len = 0; + debug("Failed to malloc fillmap data\n"); + } + + debug("Fillmap ko segnum:%u, override len:%u data:%p\n", g_img_chunk_list.cur_chunk, len, g_ko_fillmap_data); + + grub_file_close(file); + VENTOY_CMD_RETURN(GRUB_ERR_NONE); +} + grub_err_t ventoy_cmd_unix_fill_image_desc(grub_extcmd_context_t ctxt, int argc, char **args) { int i; @@ -908,7 +1086,7 @@ grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char /* part 4: override chunk */ chain->override_chunk_offset = chain->img_chunk_offset + img_chunk_size; chain->override_chunk_num = override_count; - ventoy_unix_fill_override_data(isosize, (char *)chain + chain->override_chunk_offset); + ventoy_unix_fill_override_data(isosize, chain); /* part 5: virt chunk */ chain->virt_chunk_offset = chain->override_chunk_offset + override_size; diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c index ba738693..4e605093 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c @@ -375,6 +375,7 @@ grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **a g_ventoy_menu_esc = 1; g_ventoy_suppress_esc = 1; + g_ventoy_suppress_esc_default = 1; grub_snprintf(configfile, sizeof(configfile), "configfile mem:0x%llx:size:%d", (ulonglong)(ulong)buf, size); grub_script_execute_sourcecode(configfile); @@ -548,6 +549,8 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN; cur_offset = (chunk_num - 1) * 4; chunk_offset = (grub_uint32_t *)buffer_compress; + + //debug("%llu %llu chunk_num=%lu", (ulonglong)head->size_in_wim, (ulonglong)head->raw_size, chunk_num); cur_dst = buffer_decompress; @@ -600,9 +603,11 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst); } } - + cur_dst += decompress_len; total_decompress += decompress_len; + + //debug("last chunk_size:%u decompresslen:%d tot:%d\n", last_chunk_size, decompress_len, total_decompress); if (cur_dst != buffer_decompress + head->raw_size) { @@ -654,30 +659,6 @@ static wim_directory_entry * search_full_wim_dirent return search; } -static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir) -{ - wim_directory_entry *wim_dirent = NULL; - const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL }; - //const char *native_path[] = { "Windows", "System32", "native.exe", NULL }; - - wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); - debug("search winpeshl.exe %p\n", wim_dirent); - if (wim_dirent) - { - return wim_dirent; - } - - #if 0 - wim_dirent = search_full_wim_dirent(meta_data, dir, native_path); - debug("search native.exe %p\n", wim_dirent); - if (wim_dirent) - { - return wim_dirent; - } - #endif - - return NULL; -} static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_entry *lookup, wim_hash *hash) @@ -695,6 +676,245 @@ static wim_lookup_entry * ventoy_find_look_entry(wim_header *header, wim_lookup_ return NULL; } +static int parse_registry_setup_cmdline +( + grub_file_t file, + wim_header *head, + wim_lookup_entry *lookup, + void *meta_data, + wim_directory_entry *dir, + char *buf, + grub_uint32_t buflen +) +{ + char c; + int ret = 0; + grub_uint32_t i = 0; + grub_uint32_t reglen = 0; + wim_hash zerohash; + reg_vk *regvk = NULL; + wim_lookup_entry *look = NULL; + wim_directory_entry *wim_dirent = NULL; + char *decompress_data = NULL; + const char *reg_path[] = { "Windows", "System32", "config", "SYSTEM", NULL }; + + wim_dirent = search_full_wim_dirent(meta_data, dir, reg_path); + debug("search reg SYSTEM %p\n", wim_dirent); + if (!wim_dirent) + { + return 1; + } + + grub_memset(&zerohash, 0, sizeof(zerohash)); + if (grub_memcmp(&zerohash, wim_dirent->hash.sha1, sizeof(wim_hash)) == 0) + { + return 2; + } + + look = ventoy_find_look_entry(head, lookup, &wim_dirent->hash); + if (!look) + { + return 3; + } + + reglen = (grub_uint32_t)look->resource.raw_size; + debug("find system lookup entry_id:%ld raw_size:%u\n", + ((long)look - (long)lookup) / sizeof(wim_lookup_entry), reglen); + + if (0 != ventoy_read_resource(file, head, &(look->resource), (void **)&(decompress_data))) + { + return 4; + } + + if (grub_strncmp(decompress_data + 0x1000, "hbin", 4)) + { + ret_goto_end(5); + } + + for (i = 0x1000; i + sizeof(reg_vk) < reglen; i += 8) + { + regvk = (reg_vk *)(decompress_data + i); + if (regvk->sig == 0x6B76 && regvk->namesize == 7 && + regvk->datatype == 1 && regvk->flag == 1) + { + if (grub_strncasecmp((char *)(regvk + 1), "cmdline", 7) == 0) + { + debug("find registry cmdline i:%u offset:(0x%x)%u size:(0x%x)%u\n", + i, regvk->dataoffset, regvk->dataoffset, regvk->datasize, regvk->datasize); + break; + } + } + } + + if (i + sizeof(reg_vk) >= reglen || regvk == NULL) + { + ret_goto_end(6); + } + + if (regvk->datasize == 0 || (regvk->datasize & 0x80000000) > 0 || + regvk->dataoffset == 0 || regvk->dataoffset == 0xFFFFFFFF) + { + ret_goto_end(7); + } + + if (regvk->datasize / 2 >= buflen) + { + ret_goto_end(8); + } + + debug("start offset is 0x%x(%u)\n", 0x1000 + regvk->dataoffset + 4, 0x1000 + regvk->dataoffset + 4); + + for (i = 0; i < regvk->datasize; i+=2) + { + c = (char)(*(grub_uint16_t *)(decompress_data + 0x1000 + regvk->dataoffset + 4 + i)); + *buf++ = c; + } + + ret = 0; + +end: + grub_check_free(decompress_data); + return ret; +} + +static int parse_custom_setup_path(char *cmdline, const char **path, char *exefile) +{ + int i = 0; + int len = 0; + char *pos1 = NULL; + char *pos2 = NULL; + + if ((cmdline[0] == 'x' || cmdline[0] == 'X') && cmdline[1] == ':') + { + pos1 = pos2 = cmdline + 3; + + while (i < VTOY_MAX_DIR_DEPTH && *pos2) + { + while (*pos2 && *pos2 != '\\' && *pos2 != '/') + { + pos2++; + } + + path[i++] = pos1; + + if (*pos2 == 0) + { + break; + } + + *pos2 = 0; + pos1 = pos2 + 1; + pos2 = pos1; + } + + if (i == 0 || i >= VTOY_MAX_DIR_DEPTH) + { + return 1; + } + } + else + { + path[i++] = "Windows"; + path[i++] = "System32"; + path[i++] = cmdline; + } + + pos1 = (char *)path[i - 1]; + while (*pos1 != ' ' && *pos1 != '\t' && *pos1) + { + pos1++; + } + *pos1 = 0; + + len = (int)grub_strlen(path[i - 1]); + if (len < 4 || grub_strcasecmp(path[i - 1] + len - 4, ".exe") != 0) + { + grub_snprintf(exefile, 256, "%s.exe", path[i - 1]); + path[i - 1] = exefile; + } + + + debug("custom setup: %d <%s>\n", i, path[i - 1]); + return 0; +} + +static wim_directory_entry * search_replace_wim_dirent +( + grub_file_t file, + wim_header *head, + wim_lookup_entry *lookup, + void *meta_data, + wim_directory_entry *dir +) +{ + int ret; + char exefile[256] = {0}; + char cmdline[256] = {0}; + wim_directory_entry *wim_dirent = NULL; + wim_directory_entry *pecmd_dirent = NULL; + const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL }; + const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL }; + const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL }; + const char *custom_path[VTOY_MAX_DIR_DEPTH + 1] = { NULL }; + + pecmd_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path); + debug("search pecmd.exe %p\n", pecmd_dirent); + + if (pecmd_dirent) + { + ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline) - 1); + if (0 == ret) + { + debug("registry setup cmdline:<%s>\n", cmdline); + + if (grub_strncasecmp(cmdline, "PECMD", 5) == 0) + { + wim_dirent = pecmd_dirent; + } + else if (grub_strncasecmp(cmdline, "PESET", 5) == 0) + { + wim_dirent = search_full_wim_dirent(meta_data, dir, peset_path); + debug("search peset.exe %p\n", wim_dirent); + } + else if (grub_strncasecmp(cmdline, "WINPESHL", 8) == 0) + { + wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); + debug("search winpeshl.exe %p\n", wim_dirent); + } + else if (0 == parse_custom_setup_path(cmdline, custom_path, exefile)) + { + wim_dirent = search_full_wim_dirent(meta_data, dir, custom_path); + debug("search custom path %p\n", wim_dirent); + } + + if (wim_dirent) + { + return wim_dirent; + } + } + else + { + debug("registry setup cmdline failed : %d\n", ret); + } + } + + wim_dirent = pecmd_dirent; + if (wim_dirent) + { + return wim_dirent; + } + + wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); + debug("search winpeshl.exe %p\n", wim_dirent); + if (wim_dirent) + { + return wim_dirent; + } + + return NULL; +} + + static wim_lookup_entry * ventoy_find_meta_entry(wim_header *header, wim_lookup_entry *lookup) { grub_uint32_t i = 0; @@ -735,6 +955,27 @@ static grub_uint64_t ventoy_get_stream_len(wim_directory_entry *dir) return offset; } +static int ventoy_update_stream_hash(wim_patch *patch, wim_directory_entry *dir) +{ + grub_uint16_t i; + grub_uint64_t offset = 0; + wim_stream_entry *stream = (wim_stream_entry *)((char *)dir + dir->len); + + for (i = 0; i < dir->streams; i++) + { + if (grub_memcmp(stream->hash.sha1, patch->old_hash.sha1, sizeof(wim_hash)) == 0) + { + debug("find target stream %u, name_len:%u upadte hash\n", i, stream->name_len); + grub_memcpy(stream->hash.sha1, &(patch->wim_data.bin_hash), sizeof(wim_hash)); + } + + offset += stream->len; + stream = (wim_stream_entry *)((char *)stream + stream->len); + } + + return offset; +} + static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directory_entry *dir) { if ((meta_data == NULL) || (dir == NULL)) @@ -762,6 +1003,7 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo if (dir->streams) { + ventoy_update_stream_hash(patch, dir); dir = (wim_directory_entry *)((char *)dir + dir->len + ventoy_get_stream_len(dir)); } else @@ -808,6 +1050,7 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath) { char *pos = NULL; char *script = NULL; + const char *env = NULL; ventoy_windows_data *data = (ventoy_windows_data *)buf; grub_memset(data, 0, sizeof(ventoy_windows_data)); @@ -846,7 +1089,13 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath) { debug("injection archive not configed %s\n", pos); } - + + env = grub_env_get("VTOY_WIN11_BYPASS_CHECK"); + if (env && env[0] == '1' && env[1] == 0) + { + data->windows11_bypass_check = 1; + } + return 0; } @@ -882,7 +1131,14 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath) grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len); security = (wim_security_header *)wim_data->new_meta_data; - rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U)); + if (security->len > 0) + { + rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U)); + } + else + { + rootdir = (wim_directory_entry *)(wim_data->new_meta_data + 8); + } /* update all winpeshl.exe dirent entry's hash */ ventoy_update_all_hash(node, wim_data->new_meta_data, rootdir); @@ -915,6 +1171,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath) static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) { int rc; + grub_uint16_t i; grub_file_t file; grub_uint32_t exe_len; grub_uint8_t *exe_data = NULL; @@ -923,6 +1180,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) wim_security_header *security = NULL; wim_directory_entry *rootdir = NULL; wim_directory_entry *search = NULL; + wim_stream_entry *stream = NULL; wim_header *head = &(patch->wim_data.wim_header); wim_tail *wim_data = &patch->wim_data; @@ -975,8 +1233,16 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) rootdir = (wim_directory_entry *)(decompress_data + 8); } + + debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size); + lookup = grub_malloc(head->lookup.raw_size); + grub_file_seek(file, head->lookup.offset); + grub_file_read(file, lookup, head->lookup.raw_size); + + + /* search winpeshl.exe dirent entry */ - search = search_replace_wim_dirent(decompress_data, rootdir); + search = search_replace_wim_dirent(file, head, lookup, decompress_data, rootdir); if (!search) { debug("Failed to find replace file %p\n", search); @@ -985,14 +1251,30 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) } debug("find replace file at %p\n", search); + + grub_memset(&patch->old_hash, 0, sizeof(wim_hash)); + if (grub_memcmp(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)) == 0) + { + debug("search hash all 0, now do deep search\n"); + stream = (wim_stream_entry *)((char *)search + search->len); + for (i = 0; i < search->streams; i++) + { + if (stream->name_len == 0) + { + grub_memcpy(&patch->old_hash, stream->hash.sha1, sizeof(wim_hash)); + debug("new search hash: %02x %02x %02x %02x %02x %02x %02x %02x\n", + ventoy_varg_8(patch->old_hash.sha1)); + break; + } + stream = (wim_stream_entry *)((char *)stream + stream->len); + } + } + else + { + grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)); + } + - grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)); - - debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size); - lookup = grub_malloc(head->lookup.raw_size); - grub_file_seek(file, head->lookup.offset); - grub_file_read(file, lookup, head->lookup.raw_size); - /* find and extact winpeshl.exe */ patch->replace_look = ventoy_find_look_entry(head, lookup, &patch->old_hash); if (patch->replace_look) @@ -1013,8 +1295,8 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) } else { - debug("failed to find lookup entry for replace file 0x%02x 0x%02x\n", - patch->old_hash.sha1[0], patch->old_hash.sha1[1]); + debug("failed to find lookup entry for replace file %02x %02x %02x %02x\n", + ventoy_varg_4(patch->old_hash.sha1)); } wim_data->wim_raw_size = (grub_uint32_t)file->size; @@ -1167,7 +1449,48 @@ static void ventoy_windows_fill_override_data_iso9660( grub_uint64_t isosize, return; } -static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, void *override) +static int ventoy_windows_fill_udf_short_ad(grub_file_t isofile, grub_uint32_t curpos, + wim_tail *wim_data, grub_uint32_t new_wim_size) +{ + int i; + grub_uint32_t total = 0; + grub_uint32_t left_size = 0; + ventoy_udf_override *udf = NULL; + ventoy_udf_override tmp[4]; + + grub_memset(tmp, 0, sizeof(tmp)); + grub_file_seek(isofile, wim_data->override_offset); + grub_file_read(isofile, tmp, sizeof(tmp)); + + left_size = new_wim_size; + udf = (ventoy_udf_override *)wim_data->override_data; + + for (i = 0; i < 4; i++) + { + total += tmp[i].length; + if (total >= wim_data->wim_raw_size) + { + udf->length = left_size; + udf->position = curpos; + return 0; + } + else + { + udf->length = tmp[i].length; + udf->position = curpos; + } + + left_size -= tmp[i].length; + curpos += udf->length / 2048; + udf++; + wim_data->override_len += sizeof(ventoy_udf_override); + } + + debug("######## Too many udf ad ######\n"); + return 1; +} + +static void ventoy_windows_fill_override_data_udf(grub_file_t isofile, void *override) { grub_uint32_t data32; grub_uint64_t data64; @@ -1178,9 +1501,8 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi ventoy_override_chunk *cur; wim_patch *node = NULL; wim_tail *wim_data = NULL; - ventoy_udf_override *udf = NULL; - sector = (isosize + 2047) / 2048; + sector = (isofile->size + 2047) / 2048; cur = (ventoy_override_chunk *)override; @@ -1190,7 +1512,7 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi cur++; } - debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isosize); + debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isofile->size); for (node = g_wim_patch_head; node; node = node->next) { @@ -1231,13 +1553,11 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi data64 = new_wim_size; grub_memcpy(cur->override_data, &(data64), 8); - udf = (ventoy_udf_override *)wim_data->override_data; - udf->length = new_wim_size; - udf->position = (grub_uint32_t)sector - udf_start_block; + /* override 3: position and length in extend data */ + ventoy_windows_fill_udf_short_ad(isofile, (grub_uint32_t)sector - udf_start_block, wim_data, new_wim_size); sector += (new_wim_size / 2048); - - /* override 3: position and length in extend data */ + cur++; cur->img_offset = wim_data->override_offset; cur->override_size = wim_data->override_len; @@ -1631,7 +1951,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c } else { - ventoy_windows_fill_override_data_udf(isosize, (char *)chain + chain->override_chunk_offset); + ventoy_windows_fill_override_data_udf(file, (char *)chain + chain->override_chunk_offset); } /* part 5: virt chunk */ diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h new file mode 100644 index 00000000..639f1e61 --- /dev/null +++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/partition.h @@ -0,0 +1,141 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 1999,2000,2001,2002,2004,2006,2007 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#ifndef GRUB_PART_HEADER +#define GRUB_PART_HEADER 1 + +#include +#include + +struct grub_disk; + +typedef struct grub_partition *grub_partition_t; + +#ifdef GRUB_UTIL +typedef enum +{ + GRUB_EMBED_PCBIOS +} grub_embed_type_t; +#endif + +typedef int (*grub_partition_iterate_hook_t) (struct grub_disk *disk, + const grub_partition_t partition, + void *data); + +/* Partition map type. */ +struct grub_partition_map +{ + /* The next partition map type. */ + struct grub_partition_map *next; + struct grub_partition_map **prev; + + /* The name of the partition map type. */ + const char *name; + + /* Call HOOK with each partition, until HOOK returns non-zero. */ + grub_err_t (*iterate) (struct grub_disk *disk, + grub_partition_iterate_hook_t hook, void *hook_data); +#ifdef GRUB_UTIL + /* Determine sectors available for embedding. */ + grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors, + unsigned int max_nsectors, + grub_embed_type_t embed_type, + grub_disk_addr_t **sectors); +#endif +}; +typedef struct grub_partition_map *grub_partition_map_t; + +/* Partition description. */ +struct grub_partition +{ + /* The partition number. */ + int number; + + /* The start sector (relative to parent). */ + grub_disk_addr_t start; + + /* The length in sector units. */ + grub_uint64_t len; + + /* The offset of the partition table. */ + grub_disk_addr_t offset; + + /* The index of this partition in the partition table. */ + int index; + + /* Parent partition (physically contains this partition). */ + struct grub_partition *parent; + + /* The type partition map. */ + grub_partition_map_t partmap; + + /* The type of partition whne it's on MSDOS. + Used for embedding detection. */ + grub_uint8_t msdostype; + + /* The attrib field for GPT. Needed for priority detection. */ + grub_uint64_t gpt_attrib; +}; + +grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk, + const char *str); +int EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk, + grub_partition_iterate_hook_t hook, + void *hook_data); +char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition); + + +extern grub_partition_map_t EXPORT_VAR(grub_partition_map_list); + +#ifndef GRUB_LST_GENERATOR +static inline void +grub_partition_map_register (grub_partition_map_t partmap) +{ + grub_list_push (GRUB_AS_LIST_P (&grub_partition_map_list), + GRUB_AS_LIST (partmap)); +} +#endif + +static inline void +grub_partition_map_unregister (grub_partition_map_t partmap) +{ + grub_list_remove (GRUB_AS_LIST (partmap)); +} + +#define FOR_PARTITION_MAPS(var) FOR_LIST_ELEMENTS((var), (grub_partition_map_list)) + + +static inline grub_disk_addr_t +grub_partition_get_start (const grub_partition_t p) +{ + grub_partition_t part; + grub_uint64_t part_start = 0; + + for (part = p; part; part = part->parent) + part_start += part->start; + + return part_start; +} + +static inline grub_uint64_t +grub_partition_get_len (const grub_partition_t p) +{ + return p->len; +} + +#endif /* ! GRUB_PART_HEADER */ diff --git a/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h b/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h index 56f357db..5cb04d8b 100644 --- a/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h +++ b/GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h @@ -135,7 +135,8 @@ typedef struct ventoy_windows_data { char auto_install_script[384]; char injection_archive[384]; - grub_uint8_t reserved[256]; + grub_uint8_t windows11_bypass_check; + grub_uint8_t reserved[255]; }ventoy_windows_data; @@ -241,6 +242,7 @@ typedef struct ventoy_img_chunk_list #pragma pack(1) #define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF +#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF typedef const char * (*grub_env_get_pf)(const char *name); typedef int (*grub_env_set_pf)(const char *name, const char *val); @@ -259,6 +261,7 @@ typedef struct ventoy_grub_param grub_env_get_pf grub_env_get; grub_env_set_pf grub_env_set; ventoy_grub_param_file_replace file_replace; + ventoy_grub_param_file_replace img_replace; grub_env_printf_pf grub_env_printf; }ventoy_grub_param; @@ -267,6 +270,7 @@ typedef struct ventoy_grub_param int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list); int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list); void grub_iso9660_set_nojoliet(int nojoliet); +int grub_iso9660_is_joliet(void); grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file); grub_uint64_t grub_iso9660_get_last_file_dirent_pos(grub_file_t file); grub_uint64_t grub_udf_get_file_offset(grub_file_t file); diff --git a/GRUB2/MOD_SRC/grub-2.04/install.sh b/GRUB2/MOD_SRC/grub-2.04/install.sh index 59d7d0ba..5b7175b4 100644 --- a/GRUB2/MOD_SRC/grub-2.04/install.sh +++ b/GRUB2/MOD_SRC/grub-2.04/install.sh @@ -97,6 +97,8 @@ elif [ "$1" = "arm64" ]; then if ! echo $all_modules | grep -q " ${line%.mod} "; then echo "Copy $line ..." cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi/$line $VT_DIR/INSTALL/grub/arm64-efi/ + xz $VT_DIR/INSTALL/grub/arm64-efi/$line + mv $VT_DIR/INSTALL/grub/arm64-efi/${line}.xz $VT_DIR/INSTALL/grub/arm64-efi/${line} fi done elif [ "$1" = "mips64el" ]; then diff --git a/IMG/cpio/sbin/init b/IMG/cpio/sbin/init index 2696bc80..17be33fb 100644 --- a/IMG/cpio/sbin/init +++ b/IMG/cpio/sbin/init @@ -121,6 +121,11 @@ elif [ "$VTOY_ARCH" = "i386" ]; then ln -s $VTOY_PATH/tool/dmsetup32 $VTOY_PATH/tool/dmsetup ln -s $VTOY_PATH/tool/lunzip32 $VTOY_PATH/tool/lunzip + if uname -a | egrep -q 'x86_64|amd64'; then + echo "zstdcat use 64bit ..." >>$VTLOG + rm -f $VTOY_PATH/tool/zstdcat + ln -s $VTOY_PATH/tool/zstdcat64 $VTOY_PATH/tool/zstdcat + fi elif [ "$VTOY_ARCH" = "mips64el" ]; then echo "Use MIPS64 busybox toolkit ..." >>$VTLOG ln -s $BUSYBOX_PATH/xzminidecm64e $BUSYBOX_PATH/xzminidec diff --git a/IMG/cpio/ventoy/hook/crux/disk_hook.sh b/IMG/cpio/ventoy/hook/crux/disk_hook.sh index a4a6ed0a..70d31b4d 100644 --- a/IMG/cpio/ventoy/hook/crux/disk_hook.sh +++ b/IMG/cpio/ventoy/hook/crux/disk_hook.sh @@ -29,13 +29,21 @@ for i in 0 1 2 3 4 5 6 7 8 9; do fi done -ventoy_extract_vtloopex ${vtdiskname}2 crux +# no need since 3.6.1 +$BUSYBOX_PATH/modprobe dax > /dev/null 2>&1 +$BUSYBOX_PATH/modprobe dm-mod > /dev/null 2>&1 +if $GREP -q 'device-mapper' /proc/devices; then + vtlog "dm-mod module check success ..." +else + vtlog "Need to load dm-mod module ..." + ventoy_extract_vtloopex ${vtdiskname}2 crux -vtKver=$(uname -r) -vtLoopExDir=$VTOY_PATH/vtloopex/crux/vtloopex + vtKver=$(uname -r) + vtLoopExDir=$VTOY_PATH/vtloopex/crux/vtloopex -ventoy_check_install_module_xz $vtLoopExDir/dm-mod/$vtKver/64/dax.ko -ventoy_check_install_module_xz $vtLoopExDir/dm-mod/$vtKver/64/dm-mod.ko + ventoy_check_install_module_xz $vtLoopExDir/dm-mod/$vtKver/64/dax.ko + ventoy_check_install_module_xz $vtLoopExDir/dm-mod/$vtKver/64/dm-mod.ko +fi ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" diff --git a/IMG/cpio/ventoy/hook/debian/mocaccino-disk.sh b/IMG/cpio/ventoy/hook/debian/mocaccino-disk.sh new file mode 100644 index 00000000..7d876549 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/mocaccino-disk.sh @@ -0,0 +1,47 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +if is_ventoy_hook_finished; then + exit 0 +fi + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +wait_for_usb_disk_ready + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + PATH=$VTPATH_OLD + exit 0 +fi + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/') +vtDM=$(ventoy_find_dm_id ${blkdev_num}) +vtlog "/dev/$vtDM" + +PATH=$VTPATH_OLD + +set_ventoy_hook_finish diff --git a/IMG/cpio/ventoy/hook/debian/mocaccino-hook.sh b/IMG/cpio/ventoy/hook/debian/mocaccino-hook.sh new file mode 100644 index 00000000..31143c32 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/mocaccino-hook.sh @@ -0,0 +1,20 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +$SED "/mount_system *$/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/mocaccino-disk.sh" -i /loader diff --git a/IMG/cpio/ventoy/hook/debian/porteus-hook.sh b/IMG/cpio/ventoy/hook/debian/porteus-hook.sh index 689460ce..287e6309 100644 --- a/IMG/cpio/ventoy/hook/debian/porteus-hook.sh +++ b/IMG/cpio/ventoy/hook/debian/porteus-hook.sh @@ -22,19 +22,46 @@ porteus_hook() { $SED "/searching *for *\$CFG *file/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-disk.sh" -i $1 } -if $GREP -q exfat /proc/filesystems; then - vtPath=$($VTOY_PATH/tool/vtoydump -p $VTOY_PATH/ventoy_os_param) - +vtPath=$($VTOY_PATH/tool/vtoydump -p $VTOY_PATH/ventoy_os_param) +echo $vtPath | $GREP -q " " +_vtRet1=$? + +$GREP -q exfat /proc/filesystems +_vtRet2=$? + +echo "_vtRet1=$_vtRet1 _vtRet2=$_vtRet2 ..." >> $VTLOG + +if [ $_vtRet1 -ne 0 -a $_vtRet2 -eq 0 ]; then + vtFindFlag=0 $GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' | while read vtline; do echo "hooking $vtline ..." >> $VTLOG $SED "s#\`value from\`#$vtPath#g" -i $vtline + vtFindFlag=1 done + if [ $vtFindFlag -eq 0 ]; then + if $GREP -q '`value from`' /linuxrc; then + if $GREP -q "searching *for *\$CFG *file" /linuxrc; then + echo "hooking linuxrc CFG..." >> $VTLOG + $SED "/searching *for *\$CFG *file/i$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-path.sh" -i /linuxrc + $SED "/searching *for *\$CFG *file/iFROM=\$(cat /porteus-from)" -i /linuxrc + $SED "/searching *for *\$CFG *file/iISO=\$(cat /porteus-from)" -i /linuxrc + vtFindFlag=1 + else + echo "hooking linuxrc SGN..." >> $VTLOG + $SED "/searching *for *\$SGN *file/i$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-path.sh" -i /linuxrc + $SED "/searching *for *\$SGN *file/iFROM=\$(cat /porteus-from)" -i /linuxrc + $SED "/searching *for *\$SGN *file/iISO=\$(cat /porteus-from)" -i /linuxrc + vtFindFlag=1 + fi + fi + fi + else - for vtfile in '/init' '/linuxrc' ; do + for vtfile in '/linuxrc' '/init'; do if [ -e $vtfile ]; then if ! $GREP -q ventoy $vtfile; then - echo "hooking $vtfile ..." >> $VTLOG + echo "hooking disk $vtfile ..." >> $VTLOG porteus_hook $vtfile fi fi diff --git a/IMG/cpio/ventoy/hook/debian/porteus-path.sh b/IMG/cpio/ventoy/hook/debian/porteus-path.sh new file mode 100644 index 00000000..16297de8 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/porteus-path.sh @@ -0,0 +1,38 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +wait_for_usb_disk_ready + +vtdiskname=$(get_ventoy_disk_name) + +vtPath=$(vtoydump -p $VTOY_PATH/ventoy_os_param) + +if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then + echo ${vtdiskname}p1${vtPath} > /porteus-from +else + echo ${vtdiskname}1${vtPath} > /porteus-from +fi + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/hook/debian/puppy-disk.sh b/IMG/cpio/ventoy/hook/debian/puppy-disk.sh index 7f987223..600088a2 100644 --- a/IMG/cpio/ventoy/hook/debian/puppy-disk.sh +++ b/IMG/cpio/ventoy/hook/debian/puppy-disk.sh @@ -27,6 +27,33 @@ vtlog "####### $0 $* ########" VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH +ventoy_os_install_dmsetup_by_fuse() { + vtlog "ventoy_os_install_dmsetup_by_fuse $*" + + mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs + + vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table + vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse + + mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso + + sfsfile=$(ls $VTOY_PATH/mnt/iso/*.sfs) + + mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs + + kVer=$(uname -r) + KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$kVer/kernel/drivers/md/dm-mod.ko*) + vtlog "insmod $KoName" + insmod $KoName + + umount $VTOY_PATH/mnt/squashfs + umount $VTOY_PATH/mnt/iso + umount $VTOY_PATH/mnt/fuse +} + + + + wait_for_usb_disk_ready vtdiskname=$(get_ventoy_disk_name) @@ -36,6 +63,12 @@ if [ "$vtdiskname" = "unknown" ]; then exit 0 fi +if grep -q 'device-mapper' /proc/devices; then + vtlog "device-mapper module exist" +else + ventoy_os_install_dmsetup_by_fuse $vtdiskname +fi + ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" if ! [ -e $VTOY_DM_PATH ]; then diff --git a/IMG/cpio/ventoy/hook/debian/puppy-hook.sh b/IMG/cpio/ventoy/hook/debian/puppy-hook.sh index cbb5a20b..d2e15638 100644 --- a/IMG/cpio/ventoy/hook/debian/puppy-hook.sh +++ b/IMG/cpio/ventoy/hook/debian/puppy-hook.sh @@ -18,8 +18,15 @@ #************************************************************************************ $SED '1 apmedia=usbhd' -i /init -$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init -$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'" -i /init + +if $GREP -q 'HAVE_PARTS=' /init; then + $SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init + $SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'" -i /init +elif $GREP -q 'LESSPARTS=' /init; then + $SED "/^ *LESSPARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init + $SED "/^ *LESSPARTS=/a\ LESSPARTS='ventoy|iso9660'" -i /init +fi + if [ -f /DISTRO_SPECS ]; then if ! [ -d /dev ]; then diff --git a/IMG/cpio/ventoy/hook/debian/pyabr-disk.sh b/IMG/cpio/ventoy/hook/debian/pyabr-disk.sh new file mode 100644 index 00000000..993b4d22 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/pyabr-disk.sh @@ -0,0 +1,91 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +if is_ventoy_hook_finished; then + exit 0 +fi + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +ventoy_os_install_dmsetup_by_fuse() { + vtlog "ventoy_os_install_dmsetup_by_fuse $*" + + mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs + + vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table + vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse + + mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso + mount -t squashfs $VTOY_PATH/mnt/iso/pyabr/01-core.sb $VTOY_PATH/mnt/squashfs + + KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*) + vtlog "insmod $KoName" + insmod $KoName + + umount $VTOY_PATH/mnt/squashfs + umount $VTOY_PATH/mnt/iso + umount $VTOY_PATH/mnt/fuse +} + +while [ -n "Y" ]; do + vtdiskname=$(get_ventoy_disk_name) + if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + if [ -r /proc/sys/kernel/hotplug ]; then + echo /sbin/mdev > /proc/sys/kernel/hotplug + fi + mdev -s + sleep 1 + else + if check_usb_disk_ready "$vtdiskname"; then + vtlog "check_usb_disk_ready $vtdiskname ok" + break + else + vtlog "check_usb_disk_ready $vtdiskname error" + if [ -r /proc/sys/kernel/hotplug ]; then + echo /sbin/mdev > /proc/sys/kernel/hotplug + fi + mdev -s + sleep 1 + fi + fi +done + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + PATH=$VTPATH_OLD + exit 0 +fi + +modprobe fuse +modprobe cuse + +vtKver=$(uname -r) +ventoy_os_install_dmsetup_by_fuse $vtdiskname $vtKver + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +PATH=$VTPATH_OLD + +set_ventoy_hook_finish diff --git a/IMG/cpio/ventoy/hook/debian/pyabr-hook.sh b/IMG/cpio/ventoy/hook/debian/pyabr-hook.sh new file mode 100644 index 00000000..25a79781 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/pyabr-hook.sh @@ -0,0 +1,20 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +$SED "/find_data/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/pyabr-disk.sh" -i /init diff --git a/IMG/cpio/ventoy/hook/debian/tails-hook.sh b/IMG/cpio/ventoy/hook/debian/tails-hook.sh index 54a3e822..34ef31df 100644 --- a/IMG/cpio/ventoy/hook/debian/tails-hook.sh +++ b/IMG/cpio/ventoy/hook/debian/tails-hook.sh @@ -23,6 +23,11 @@ $SED "s#.*livefs_root=.*find_livefs.*#$BUSYBOX_PATH/mount -t iso9660 /dev/mapper if [ -e /init ] && $GREP -q '^mountroot$' /init; then echo "Here before mountroot ..." >> $VTLOG $SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i /init + + if [ -f /scripts/init-premount/ORDER ]; then + $SED "/\/scripts\/init-premount\/partitioning/,+1d" -i /scripts/init-premount/ORDER + fi + else echo "Use default hook ..." >> $VTLOG ventoy_systemd_udevd_work_around diff --git a/IMG/cpio/ventoy/hook/debian/udev_disk_hook.sh b/IMG/cpio/ventoy/hook/debian/udev_disk_hook.sh index 84e87709..c46f85b4 100644 --- a/IMG/cpio/ventoy/hook/debian/udev_disk_hook.sh +++ b/IMG/cpio/ventoy/hook/debian/udev_disk_hook.sh @@ -41,18 +41,18 @@ ventoy_os_install_dmsetup() { fi # install md-modules - LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) + LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) if [ $? -eq 0 ]; then - LINTCNT=$($GREP -c ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) + LINTCNT=$($GREP -i -c ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) if [ $LINTCNT -gt 1 ]; then vtlog "more than one pkgs, need to filter..." VER=$($BUSYBOX_PATH/uname -r) - LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP $VER) - LINTCNT=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -c $VER) + LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i $VER) + LINTCNT=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -c $VER) if [ $LINTCNT -gt 1 ]; then vtlog "Still more than one pkgs, use the first one..." - LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -m1 $VER) + LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -m1 $VER) fi fi install_udeb_from_line "$LINE" ${vt_usb_disk} diff --git a/IMG/cpio/ventoy/hook/debian/ventoy-hook.sh b/IMG/cpio/ventoy/hook/debian/ventoy-hook.sh index 2af8bd17..6f7aec05 100644 --- a/IMG/cpio/ventoy/hook/debian/ventoy-hook.sh +++ b/IMG/cpio/ventoy/hook/debian/ventoy-hook.sh @@ -35,7 +35,7 @@ ventoy_get_debian_distro() { fi if [ -e /init ]; then - if $GREP -q PUPPYSFS /init; then + if $EGREP -q 'PUPPYSFS|PUPPYFILE' /init; then if $GREP -q VEKETSFS /init; then echo 'veket'; return else @@ -90,6 +90,13 @@ ventoy_get_debian_distro() { echo 'kerio'; return fi + if $GREP -q 'mocaccino' /proc/version; then + echo 'mocaccino'; return + fi + + if $GREP -q '/pyabr/' /proc/cmdline; then + echo 'pyabr'; return + fi echo 'default' } diff --git a/IMG/cpio/ventoy/hook/default/export.list b/IMG/cpio/ventoy/hook/default/export.list new file mode 100644 index 00000000..821a574d --- /dev/null +++ b/IMG/cpio/ventoy/hook/default/export.list @@ -0,0 +1,7 @@ +preseed/file +debian-installer/locale +console-keymaps-at/keymap +keyboard-configuration/xkb-keymap +keyboard-configuration/layout +simple-cdd/profiles +vga diff --git a/IMG/cpio/ventoy/hook/easystartup/disk_hook.sh b/IMG/cpio/ventoy/hook/easystartup/disk_hook.sh new file mode 100644 index 00000000..d9b3d48b --- /dev/null +++ b/IMG/cpio/ventoy/hook/easystartup/disk_hook.sh @@ -0,0 +1,83 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +get_rhel_ver() { + if uname -m | grep -q '64'; then + machine='_X64' + fi + + if grep -q '6[.]1' /etc/redhat-release; then + echo "RHAS6U1$machine"; return + fi + + echo "RHAS6U1$machine" +} + +install_dm_mod_ko() { + # dump iso file location + vtoydm -i -f $VTOY_PATH/ventoy_image_map -d ${vtdiskname} > $VTOY_PATH/iso_file_list + + sysver=$(get_rhel_ver) + vtlog "sysver=$sysver" + + LINE=$(grep "$sysver" -n -m1 $VTOY_PATH/iso_file_list | awk -F: '{print $1}') + vtlog "LINE=$LINE" + + LINE=$(sed -n "$LINE,\$p" $VTOY_PATH/iso_file_list | grep -m1 'initrd.img') + vtlog "LINE=$LINE" + + sector=$(echo $LINE | $AWK '{print $(NF-1)}') + length=$(echo $LINE | $AWK '{print $NF}') + vtlog "sector=$sector length=$length" + + mkdir xxx + vtoydm -e -f $VTOY_PATH/ventoy_image_map -d ${vtdiskname} -s $sector -l $length -o ./xxx.img + + cd xxx/ + zcat ../xxx.img | cpio -idmu + ko=$(find -name dm-mod.ko*) + vtlog "ko=$ko ..." + insmod $ko + + cd ../ + rm -f xxx.img + rm -rf xxx +} + +vtdiskname=$(get_ventoy_disk_name) +vtlog "vtdiskname=$vtdiskname ..." +if [ "$vtdiskname" = "unknown" ]; then + exit 0 +fi + +if grep -q 'device-mapper' /proc/devices; then + vtlog "device-mapper module check ko" +else + install_dm_mod_ko +fi + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +ln -s /dev/dm-0 /dev/root + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/hook/easystartup/ventoy-hook.sh b/IMG/cpio/ventoy/hook/easystartup/ventoy-hook.sh new file mode 100644 index 00000000..39658c44 --- /dev/null +++ b/IMG/cpio/ventoy/hook/easystartup/ventoy-hook.sh @@ -0,0 +1,23 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. $VTOY_PATH/hook/ventoy-os-lib.sh + +$SED "s#^CDROM=.*#CDROM=/dev/dm-0#" -i /init +$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/easystartup/ventoy-initqueue.sh /initqueue/ventoy.sh diff --git a/IMG/cpio/ventoy/hook/easystartup/ventoy-initqueue.sh b/IMG/cpio/ventoy/hook/easystartup/ventoy-initqueue.sh new file mode 100644 index 00000000..d4c8b5f0 --- /dev/null +++ b/IMG/cpio/ventoy/hook/easystartup/ventoy-initqueue.sh @@ -0,0 +1,20 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +/ventoy/busybox/sh /ventoy/hook/easystartup/disk_hook.sh $* diff --git a/IMG/cpio/ventoy/hook/suse/udev_setup_hook.sh b/IMG/cpio/ventoy/hook/suse/udev_setup_hook.sh new file mode 100644 index 00000000..ff796664 --- /dev/null +++ b/IMG/cpio/ventoy/hook/suse/udev_setup_hook.sh @@ -0,0 +1,42 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +wait_for_usb_disk_ready + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + exit 0 +fi + +vtlog "wait_for_usb_disk_ready $vtdiskname ..." + +if echo $vtdiskname | $EGREP -q "nvme|mmc|nbd"; then + vtpart2=${vtdiskname}p2 +else + vtpart2=${vtdiskname}2 +fi + +/ventoy/busybox/sh /ventoy/hook/suse/udev_disk_hook.sh "${vtpart2#/dev/}" + +if $GREP -q 'mediacheck=1' /proc/cmdline; then + ventoy_copy_device_mapper "${vtdiskname}" +fi diff --git a/IMG/cpio/ventoy/hook/suse/ventoy-hook.sh b/IMG/cpio/ventoy/hook/suse/ventoy-hook.sh index 47aa0504..da1eb2c6 100644 --- a/IMG/cpio/ventoy/hook/suse/ventoy-hook.sh +++ b/IMG/cpio/ventoy/hook/suse/ventoy-hook.sh @@ -63,6 +63,9 @@ if [ -e /etc/initrd.functions ] && $GREP -q 'HPIP' /etc/initrd.functions; then $BUSYBOX_PATH/mknod -m 660 /dev/console b 5 1 $SED "/CD_DEVICES=/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/suse/disk_hook.sh" -i /etc/initrd.functions $SED "/CD_DEVICES=/a CD_DEVICES=\"/dev/ventoy \$CD_DEVICES\"" -i /etc/initrd.functions +elif [ -f /scripts/udev_setup ]; then + echo "udev_setup" >> $VTLOG + echo "/ventoy/busybox/sh /ventoy/hook/suse/udev_setup_hook.sh" >> /scripts/udev_setup else echo "SUSE" >> $VTLOG ventoy_systemd_udevd_work_around diff --git a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh index 8b50cc61..881daef5 100644 --- a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh +++ b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh @@ -562,6 +562,31 @@ ventoy_create_dev_ventoy_part() { fi } + +ventoy_create_chromeos_ventoy_part() { + blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/') + $BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num + + if [ -e /vtoy_dm_table ]; then + vtPartid=1 + + $CAT /vtoy_dm_table | while read vtline; do + echo $vtline > /ventoy/dm_table_part${vtPartid} + + if [ $vtPartid -eq $1 ]; then + $VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid} --readonly + else + $VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid} + fi + + blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy${vtPartid} | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/') + $BUSYBOX_PATH/mknod -m 0666 /dev/ventoy${vtPartid} b $blkdev_num + + vtPartid=$(expr $vtPartid + 1) + done + fi +} + is_inotify_ventoy_part() { if echo $1 | $GREP -q "2$"; then if ! [ -e /sys/block/$1 ]; then diff --git a/IMG/cpio/ventoy/init_chain b/IMG/cpio/ventoy/init_chain index 18dba2c5..6f87a5d2 100644 --- a/IMG/cpio/ventoy/init_chain +++ b/IMG/cpio/ventoy/init_chain @@ -185,7 +185,7 @@ ventoy_unpack_injection() { if [ -e $VTOY_PATH/ventoy_injection ]; then echo "### decompress injection ... ###" >>$VTLOG - ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1 + ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1 fi diff --git a/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh b/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh new file mode 100644 index 00000000..2cf658ba --- /dev/null +++ b/IMG/cpio/ventoy/loop/cloudready/ventoy-hook.sh @@ -0,0 +1,201 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +mkdir /sys +mount -t sysfs sys /sys +mdev -s +sleep 2 + +while [ -n "Y" ]; do + usb_disk=$(get_ventoy_disk_name) + + if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then + vtpart2=${usb_disk}p2 + else + vtpart2=${usb_disk}2 + fi + + if [ -e "${vtpart2}" ]; then + break + else + sleep 2 + mdev -s + fi +done + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + PATH=$VTPATH_OLD + exit 0 +fi + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/') +vtDM=$(ventoy_find_dm_id ${blkdev_num}) +echo -n $vtDM > /ventoy/vtDM + +ventoy_create_chromeos_ventoy_part 3 +mdev -s + +vtlog "copy out the e2fsck program ..." + +copy_lib() { + cp -a /ventoy_rdroot/usr/lib64/$1 /usr/lib64/ + cp -a /ventoy_rdroot/lib64/$1 /lib64/ +} + +mkdir /ventoy_rdroot +mkdir -p /lib /lib64 /usr/lib64 /sbin + +mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1 +cp -a /ventoy_rdroot/sbin/e2fsck /sbin/ +cp -a /ventoy_rdroot/sbin/dmsetup /sbin/ + +copy_lib libext2fs* +copy_lib libcom_err* +copy_lib libe2p* +copy_lib libblk* +copy_lib libuuid* +copy_lib libdl.* +copy_lib libdl-* +copy_lib libc.* +copy_lib libc-* +copy_lib libpthread* +copy_lib ld-* +copy_lib libdevmapper* +copy_lib libudev* +copy_lib libm.* +copy_lib libm-* +copy_lib librt* +copy_lib libpopt* +copy_lib libgpg-error* +copy_lib libselinux* +copy_lib libsepol* +copy_lib libpcre* +copy_lib libcap* +copy_lib libdw* +copy_lib libgcc_s* +copy_lib libattr* +copy_lib libelf* +copy_lib libz.* +copy_lib libbz2* +copy_lib libgcrypt* +copy_lib liblvm* + +ln -s /lib64/libdevmapper.so.1.02 /lib64/libdevmapper.so.1.02.1 + +umount /ventoy_rdroot + +vtlog "=========================================" +vtlog "===== e2fsck -y -v /dev/ventoy1 =====" +e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1 +#vtlog "===== e2fsck -y -v /dev/ventoy3 =====" +#e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy8 =====" +e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1 +vtlog "=========================================" + +/sbin/dmsetup --version >>$VTLOG 2>&1 +veritysetup --version >>$VTLOG 2>&1 + +vtlog "proc devtmpfs ..." +mkdir /newdev +mount -t devtmpfs dev /newdev + +cp -a /dev/mapper/ventoy* /newdev/mapper/ +cp -a /dev/ventoy* /newdev/ + + +vtshortname="${vtdiskname#/dev/}" +mv /newdev/${vtshortname} /newdev/backup_${vtshortname} +cp -a /dev/ventoy /newdev/${vtshortname} + +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + if [ -e /dev/ventoy${i} ]; then + if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then + vtpart=p$i + else + vtpart=$i + fi + + if [ -e /newdev/${vtshortname}${vtpart} ]; then + mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart} + fi + + cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart} + + if [ $i -eq 3 ]; then + [ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart} + cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart} + vt_root_dev="/dev/${vtshortname}${vtpart}" + vtlog "vt_root_dev=$vt_root_dev" + fi + fi +done + + +# if grep -q 'DM=' /proc/cmdline; then + # vtlog "Boot verified image ..." + + # dmP1=$(sed "s/.*\(0 [0-9]* verity\).*/\1/" /proc/cmdline) + # alg=$(sed "s/.*alg=\([^ ]*\).*/\1/" /proc/cmdline) + # hexdigest=$(sed "s/.*root_hexdigest=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline) + # salt=$(sed "s/.*salt=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline) + # hashstart=$(sed "s/.*hashstart=\([0-9][0-9]*\).*/\1/" /proc/cmdline) + + #512 to 4096 + # blocknum=$(expr $hashstart / 8) + # hashoffset=$(expr $hashstart \* 512) + + # vtlog "veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0" + # veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0 + # sleep 1 + # mdev -s + + # blkdev_num=$(dmsetup ls | grep vroot | sed 's/.*(\([0-9][0-9]*\),[^0-9]*\([0-9][0-9]*\).*/\1:\2/') + # vtDM=$(ventoy_find_dm_id ${blkdev_num}) + # vtlog "blkdev_num=$blkdev_num vtDM=$vtDM" + + # if [ -b /dev/$vtDM ]; then + # veritysetup status vroot >> $VTLOG 2>&1 + # mount -o ro /dev/$vtDM /ventoy_rdroot + # else + # mount -o ro $vt_root_dev /ventoy_rdroot + # fi +# else + # vtlog "Boot normal image ..." + # mount -o ro $vt_root_dev /ventoy_rdroot +# fi + +vtlog "Boot normal image ..." +mount -o ro $vt_root_dev /ventoy_rdroot + +cp -a $VTLOG /newdev/ventoy.log +umount /newdev +mount -t devtmpfs dev /ventoy_rdroot/dev + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/loop/esysrescue/ventoy-disk.sh b/IMG/cpio/ventoy/loop/esysrescue/ventoy-disk.sh new file mode 100644 index 00000000..f50c7d48 --- /dev/null +++ b/IMG/cpio/ventoy/loop/esysrescue/ventoy-disk.sh @@ -0,0 +1,47 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +if is_ventoy_hook_finished; then + exit 0 +fi + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +wait_for_usb_disk_ready + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + PATH=$VTPATH_OLD + exit 0 +fi + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +ventoy_create_dev_ventoy_part + +ln -s "../../ventoy1" /dev/disk/by-label/ESYSRESCUE + +PATH=$VTPATH_OLD + +set_ventoy_hook_finish diff --git a/IMG/cpio/ventoy/loop/esysrescue/ventoy-hook.sh b/IMG/cpio/ventoy/loop/esysrescue/ventoy-hook.sh new file mode 100644 index 00000000..5420f8cb --- /dev/null +++ b/IMG/cpio/ventoy/loop/esysrescue/ventoy-hook.sh @@ -0,0 +1,26 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. $VTOY_PATH/hook/ventoy-os-lib.sh + +$SED "/maybe_break premount/i\ $BUSYBOX_PATH/sh $VTOY_PATH/loop/esysrescue/ventoy-disk.sh" -i /init + +if [ -f /scripts/casper-bottom/09format_esr_data_partition ]; then + $SED '/mkfs.vfat.*edev.3/icp -a /dev/dm-3 /dev/ventoy3' -i /scripts/casper-bottom/09format_esr_data_partition +fi diff --git a/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh b/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh new file mode 100644 index 00000000..2cf658ba --- /dev/null +++ b/IMG/cpio/ventoy/loop/fydeos/ventoy-hook.sh @@ -0,0 +1,201 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2021, longpanda +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +#************************************************************************************ + +. /ventoy/hook/ventoy-hook-lib.sh + +vtlog "####### $0 $* ########" + +VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH + +mkdir /sys +mount -t sysfs sys /sys +mdev -s +sleep 2 + +while [ -n "Y" ]; do + usb_disk=$(get_ventoy_disk_name) + + if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then + vtpart2=${usb_disk}p2 + else + vtpart2=${usb_disk}2 + fi + + if [ -e "${vtpart2}" ]; then + break + else + sleep 2 + mdev -s + fi +done + +vtdiskname=$(get_ventoy_disk_name) +if [ "$vtdiskname" = "unknown" ]; then + vtlog "ventoy disk not found" + PATH=$VTPATH_OLD + exit 0 +fi + +ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" + +blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/') +vtDM=$(ventoy_find_dm_id ${blkdev_num}) +echo -n $vtDM > /ventoy/vtDM + +ventoy_create_chromeos_ventoy_part 3 +mdev -s + +vtlog "copy out the e2fsck program ..." + +copy_lib() { + cp -a /ventoy_rdroot/usr/lib64/$1 /usr/lib64/ + cp -a /ventoy_rdroot/lib64/$1 /lib64/ +} + +mkdir /ventoy_rdroot +mkdir -p /lib /lib64 /usr/lib64 /sbin + +mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1 +cp -a /ventoy_rdroot/sbin/e2fsck /sbin/ +cp -a /ventoy_rdroot/sbin/dmsetup /sbin/ + +copy_lib libext2fs* +copy_lib libcom_err* +copy_lib libe2p* +copy_lib libblk* +copy_lib libuuid* +copy_lib libdl.* +copy_lib libdl-* +copy_lib libc.* +copy_lib libc-* +copy_lib libpthread* +copy_lib ld-* +copy_lib libdevmapper* +copy_lib libudev* +copy_lib libm.* +copy_lib libm-* +copy_lib librt* +copy_lib libpopt* +copy_lib libgpg-error* +copy_lib libselinux* +copy_lib libsepol* +copy_lib libpcre* +copy_lib libcap* +copy_lib libdw* +copy_lib libgcc_s* +copy_lib libattr* +copy_lib libelf* +copy_lib libz.* +copy_lib libbz2* +copy_lib libgcrypt* +copy_lib liblvm* + +ln -s /lib64/libdevmapper.so.1.02 /lib64/libdevmapper.so.1.02.1 + +umount /ventoy_rdroot + +vtlog "=========================================" +vtlog "===== e2fsck -y -v /dev/ventoy1 =====" +e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1 +#vtlog "===== e2fsck -y -v /dev/ventoy3 =====" +#e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1 +vtlog "===== e2fsck -y -v /dev/ventoy8 =====" +e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1 +vtlog "=========================================" + +/sbin/dmsetup --version >>$VTLOG 2>&1 +veritysetup --version >>$VTLOG 2>&1 + +vtlog "proc devtmpfs ..." +mkdir /newdev +mount -t devtmpfs dev /newdev + +cp -a /dev/mapper/ventoy* /newdev/mapper/ +cp -a /dev/ventoy* /newdev/ + + +vtshortname="${vtdiskname#/dev/}" +mv /newdev/${vtshortname} /newdev/backup_${vtshortname} +cp -a /dev/ventoy /newdev/${vtshortname} + +for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + if [ -e /dev/ventoy${i} ]; then + if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then + vtpart=p$i + else + vtpart=$i + fi + + if [ -e /newdev/${vtshortname}${vtpart} ]; then + mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart} + fi + + cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart} + + if [ $i -eq 3 ]; then + [ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart} + cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart} + vt_root_dev="/dev/${vtshortname}${vtpart}" + vtlog "vt_root_dev=$vt_root_dev" + fi + fi +done + + +# if grep -q 'DM=' /proc/cmdline; then + # vtlog "Boot verified image ..." + + # dmP1=$(sed "s/.*\(0 [0-9]* verity\).*/\1/" /proc/cmdline) + # alg=$(sed "s/.*alg=\([^ ]*\).*/\1/" /proc/cmdline) + # hexdigest=$(sed "s/.*root_hexdigest=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline) + # salt=$(sed "s/.*salt=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline) + # hashstart=$(sed "s/.*hashstart=\([0-9][0-9]*\).*/\1/" /proc/cmdline) + + #512 to 4096 + # blocknum=$(expr $hashstart / 8) + # hashoffset=$(expr $hashstart \* 512) + + # vtlog "veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0" + # veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0 + # sleep 1 + # mdev -s + + # blkdev_num=$(dmsetup ls | grep vroot | sed 's/.*(\([0-9][0-9]*\),[^0-9]*\([0-9][0-9]*\).*/\1:\2/') + # vtDM=$(ventoy_find_dm_id ${blkdev_num}) + # vtlog "blkdev_num=$blkdev_num vtDM=$vtDM" + + # if [ -b /dev/$vtDM ]; then + # veritysetup status vroot >> $VTLOG 2>&1 + # mount -o ro /dev/$vtDM /ventoy_rdroot + # else + # mount -o ro $vt_root_dev /ventoy_rdroot + # fi +# else + # vtlog "Boot normal image ..." + # mount -o ro $vt_root_dev /ventoy_rdroot +# fi + +vtlog "Boot normal image ..." +mount -o ro $vt_root_dev /ventoy_rdroot + +cp -a $VTLOG /newdev/ventoy.log +umount /newdev +mount -t devtmpfs dev /ventoy_rdroot/dev + +PATH=$VTPATH_OLD diff --git a/IMG/cpio/ventoy/ventoy_chain.sh b/IMG/cpio/ventoy/ventoy_chain.sh index 10fcc426..e135e1b8 100644 --- a/IMG/cpio/ventoy/ventoy_chain.sh +++ b/IMG/cpio/ventoy/ventoy_chain.sh @@ -52,12 +52,30 @@ ventoy_get_os_type() { fi fi + # Debian : + if $GREP -q '[Dd]ebian' /proc/version; then + echo 'debian'; return + + # Ubuntu : do the same process with debian + elif $GREP -q '[Uu]buntu' /proc/version; then + echo 'debian'; return + + # Deepin : do the same process with debian + elif $GREP -q '[Dd]eepin' /proc/version; then + echo 'debian'; return + # rhel5/CentOS5 and all other distributions based on them - if $GREP -q 'el5' /proc/version; then + elif $GREP -q 'el5' /proc/version; then echo 'rhel5'; return # rhel6/CentOS6 and all other distributions based on them elif $GREP -q 'el6' /proc/version; then + if [ -f /sbin/detectcd ]; then + if $GREP -q -i 'LENOVO-EasyStartup' /sbin/detectcd; then + echo 'easystartup'; return + fi + fi + echo 'rhel6'; return # rhel7/CentOS7/rhel8/CentOS8 and all other distributions based on them @@ -72,18 +90,6 @@ ventoy_get_os_type() { elif $GREP -q '\.fc[0-9][0-9]\.' /proc/version; then echo 'rhel7'; return - # Debian : - elif $GREP -q '[Dd]ebian' /proc/version; then - echo 'debian'; return - - # Ubuntu : do the same process with debian - elif $GREP -q '[Uu]buntu' /proc/version; then - echo 'debian'; return - - # Deepin : do the same process with debian - elif $GREP -q '[Dd]eepin' /proc/version; then - echo 'debian'; return - # SUSE elif $GREP -q 'SUSE' /proc/version; then echo 'suse'; return @@ -154,7 +160,11 @@ ventoy_get_os_type() { elif $GREP -q 'openEuler' /etc/os-release; then echo 'openEuler'; return elif $GREP -q 'fuyu' /etc/os-release; then - echo 'openEuler'; return + echo 'openEuler'; return + elif $GREP -q 'deepin' /etc/os-release; then + echo 'debian'; return + elif $GREP -q 'chinauos' /etc/os-release; then + echo 'debian'; return fi fi @@ -338,9 +348,36 @@ if [ -e "$VTOY_PATH/hook/$VTOS/ventoy-hook.sh" ]; then fi + +if $GREP -q -i Untangle /proc/version; then + for vtPara in $($CAT /proc/cmdline); do + vtItemkey=$(echo $vtPara | $AWK -F= '{print $1}') + vtItemVal=$(echo $vtPara | $AWK -F= '{print $2}') + if $GREP -q -m1 "^$vtItemkey\$" $VTOY_PATH/hook/default/export.list; then + vtEnvExport="$vtEnvExport $vtItemkey=$vtItemVal" + fi + done + + echo "================ env export ================" >> $VTLOG + echo $vtEnvExport >> $VTLOG + echo "============================================" >> $VTLOG +fi + + + #################################################################### # # -# Step 3 : Check for debug break # +# Step 3 : Run LiveInjection Hook # +# # +#################################################################### +if [ -f "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" ]; then + $BUSYBOX_PATH/sh "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" $VTOS +fi + + +#################################################################### +# # +# Step 4 : Check for debug break # # # #################################################################### if [ "$VTOY_BREAK_LEVEL" = "03" ] || [ "$VTOY_BREAK_LEVEL" = "13" ]; then @@ -357,7 +394,7 @@ fi #################################################################### # # -# Step 4 : Hand over to real init # +# Step 5 : Hand over to real init # # # #################################################################### $BUSYBOX_PATH/umount /proc @@ -386,7 +423,12 @@ for vtinit in $user_rdinit /init /sbin/init /linuxrc; do if [ -f "$VTOY_PATH/hook/$VTOS/ventoy-before-init.sh" ]; then $BUSYBOX_PATH/sh "$VTOY_PATH/hook/$VTOS/ventoy-before-init.sh" fi - exec "$vtinit" + + if [ -z "$vtEnvExport" ]; then + exec "$vtinit" + else + exec env $vtEnvExport "$vtinit" + fi fi fi done diff --git a/IMG/cpio/ventoy/ventoy_loop.sh b/IMG/cpio/ventoy/ventoy_loop.sh index bf67ec47..0c69ec13 100644 --- a/IMG/cpio/ventoy/ventoy_loop.sh +++ b/IMG/cpio/ventoy/ventoy_loop.sh @@ -127,8 +127,8 @@ ventoy_get_os_type() { # Deepin : do the same process with debian elif $GREP -q '[Dd]eepin' /proc/version; then - echo 'debian'; return - + echo 'debian'; return + # SUSE elif $GREP -q 'SUSE' /proc/version; then echo 'suse'; return @@ -200,6 +200,10 @@ ventoy_get_os_type() { echo 'openEuler'; return elif $GREP -q 'fuyu' /etc/os-release; then echo 'openEuler'; return + elif $GREP -q 'deepin' /etc/os-release; then + echo 'debian'; return + elif $GREP -q 'chinauos' /etc/os-release; then + echo 'debian'; return fi fi diff --git a/IMG/cpio_x86/ventoy/tool/vtoytool_install.sh b/IMG/cpio_x86/ventoy/tool/vtoytool_install.sh index d6b34706..1ccadd16 100644 --- a/IMG/cpio_x86/ventoy/tool/vtoytool_install.sh +++ b/IMG/cpio_x86/ventoy/tool/vtoytool_install.sh @@ -81,6 +81,18 @@ else echo "use unsquashfs_32" >>$VTLOG $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs fi - + + if $GREP -q 64 $VTOY_PATH/ventoy_arch; then + echo "use veritysetup64" >>$VTLOG + if [ -f $VTOY_PATH/tool/veritysetup64 ]; then + $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/veritysetup64 $VTOY_PATH/tool/veritysetup + fi + else + echo "use veritysetup32" >>$VTLOG + + if [ -f $VTOY_PATH/tool/veritysetup32 ]; then + $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/veritysetup32 $VTOY_PATH/tool/veritysetup + fi + fi fi diff --git a/IMG/mkcpio.sh b/IMG/mkcpio.sh index 0fc88baf..c2043365 100644 --- a/IMG/mkcpio.sh +++ b/IMG/mkcpio.sh @@ -21,19 +21,19 @@ ln -s sbin/init linuxrc cd ventoy -find ./loop | cpio -o -H newc>loop.cpio +find ./loop | cpio -o -H newc --owner=root:root >loop.cpio xz loop.cpio rm -rf loop xz ventoy_chain.sh xz ventoy_loop.sh -find ./hook | cpio -o -H newc>hook.cpio +find ./hook | cpio -o -H newc --owner=root:root >hook.cpio xz hook.cpio rm -rf hook cd .. -find .| cpio -o -H newc>../ventoy.cpio +find .| cpio -o -H newc --owner=root:root >../ventoy.cpio cd .. rm -rf cpio_tmp @@ -62,14 +62,17 @@ cp -a $VENTOY_PATH/VBLADE/vblade-master/vblade_64 tool/ cp -a $VENTOY_PATH/LZIP/lunzip32 tool/ cp -a $VENTOY_PATH/LZIP/lunzip64 tool/ +cp -a $VENTOY_PATH/cryptsetup/veritysetup32 tool/ +cp -a $VENTOY_PATH/cryptsetup/veritysetup64 tool/ + chmod -R 777 ./tool -find ./tool | cpio -o -H newc>tool.cpio +find ./tool | cpio -o -H newc --owner=root:root >tool.cpio xz tool.cpio rm -rf tool cd .. -find .| cpio -o -H newc>../ventoy_x86.cpio +find .| cpio -o -H newc --owner=root:root >../ventoy_x86.cpio cd .. rm -rf cpio_tmp @@ -95,12 +98,12 @@ cp -a $VENTOY_PATH/LZIP/lunzipaa64 tool/ chmod -R 777 ./tool -find ./tool | cpio -o -H newc>tool.cpio +find ./tool | cpio -o -H newc --owner=root:root >tool.cpio xz tool.cpio rm -rf tool cd .. -find .| cpio -o -H newc>../ventoy_arm64.cpio +find .| cpio -o -H newc --owner=root:root >../ventoy_arm64.cpio cd .. rm -rf cpio_tmp @@ -127,12 +130,12 @@ rm -f tool/vtoytool/00/vtoytool_aa64 chmod -R 777 ./tool -find ./tool | cpio -o -H newc>tool.cpio +find ./tool | cpio -o -H newc --owner=root:root >tool.cpio xz tool.cpio rm -rf tool cd .. -find .| cpio -o -H newc>../ventoy_mips64.cpio +find .| cpio -o -H newc --owner=root:root >../ventoy_mips64.cpio cd .. rm -rf cpio_tmp diff --git a/IMG/mkloopex.sh b/IMG/mkloopex.sh index 6b605b45..1a87dec6 100644 --- a/IMG/mkloopex.sh +++ b/IMG/mkloopex.sh @@ -14,7 +14,7 @@ for dir in $(ls); do cd .. done -find . | cpio -o -H newc>../vtloopex.cpio +find . | cpio -o -H newc --owner=root:root >../vtloopex.cpio cd .. diff --git a/IMG/vtloopex/LibreELEC/vtloopex/dm-mod/5.10.76/64/dm-mod.ko.xz b/IMG/vtloopex/LibreELEC/vtloopex/dm-mod/5.10.76/64/dm-mod.ko.xz new file mode 100644 index 00000000..5b078cf3 Binary files /dev/null and b/IMG/vtloopex/LibreELEC/vtloopex/dm-mod/5.10.76/64/dm-mod.ko.xz differ diff --git a/INSTALL/CreatePersistentImg.sh b/INSTALL/CreatePersistentImg.sh index 8a4480db..3041873f 100644 --- a/INSTALL/CreatePersistentImg.sh +++ b/INSTALL/CreatePersistentImg.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash size=1024 fstype=ext4 @@ -7,13 +7,14 @@ config='' outputfile=persistence.dat print_usage() { - echo 'Usage: CreatePersistentImg.sh [ -s size ] [ -t fstype ] [ -l LABEL ] [ -c CFG ]' + echo 'Usage: sudo ./CreatePersistentImg.sh [ -s size ] [ -t fstype ] [ -l LABEL ] [ -c CFG ] [ -e ]' echo ' OPTION: (optional)' echo ' -s size in MB, default is 1024' echo ' -t filesystem type, default is ext4 ext2/ext3/ext4/xfs are supported now' echo ' -l label, default is casper-rw' echo ' -c configfile name inside the persistence file. File content is "/ union"' echo ' -o outputfile name, default is persistence.dat' + echo ' -e enable encryption, disabled by default (only few distros support this)' echo '' } @@ -33,6 +34,9 @@ while [ -n "$1" ]; do elif [ "$1" = "-o" ]; then shift outputfile=$1 + elif [ "$1" = "-e" ]; then + read -s -p "Encryption passphrase: " passphrase + echo elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then print_usage exit 0 @@ -86,6 +90,13 @@ freeloop=$(losetup -f) losetup $freeloop "$outputfile" +if [ ! -z "$passphrase" ]; then + printf "$passphrase" | cryptsetup -q --verbose luksFormat $freeloop - + printf "$passphrase" | cryptsetup -q --verbose luksOpen $freeloop persist_decrypted - + _freeloop=$freeloop + freeloop="/dev/mapper/persist_decrypted" +fi + mkfs -t $fstype $fsopt -L $label $freeloop sync @@ -104,4 +115,9 @@ if [ -n "$config" ]; then rm -rf ./persist_tmp_mnt fi +if [ ! -z "$passphrase" ]; then + cryptsetup luksClose $freeloop + freeloop=$_freeloop +fi + losetup -d $freeloop diff --git a/INSTALL/ExtendPersistentImg.sh b/INSTALL/ExtendPersistentImg.sh index 21c8435a..bd51912c 100644 --- a/INSTALL/ExtendPersistentImg.sh +++ b/INSTALL/ExtendPersistentImg.sh @@ -27,6 +27,13 @@ if [ ! -f "$file" ]; then exit 1 fi +if echo $size | grep -q "^-"; then + mode="Shrink" + size=${size:1} +else + mode="Extend" +fi + if echo $size | grep -q "[^0-9]"; then print_usage exit 1 @@ -42,10 +49,25 @@ fi fsMB=$(expr $fsize / 1024 / 1024) -total=$(expr $fsMB + $size) + +if [ "$mode" = "Extend" ]; then + total=$(expr $fsMB + $size) +else + if [ $fsMB -le $size ]; then + echo "File size of $file is less than ${size}MB." + exit 1 + fi + total=$(expr $fsMB - $size) +fi + magic=$(hexdump -n3 -e '3/1 "%02X"' $file) if [ "$magic" = "584653" ]; then + if [ "$mode" = "Shrink" ]; then + echo "Shrink is not supported for XFS filesystem." + exit 1 + fi + if which xfs_growfs >/dev/null 2>&1; then cmd=xfs_growfs else @@ -61,23 +83,26 @@ else fi fi +if [ "$mode" = "Extend" ]; then + echo "$mode dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)" + dd if=/dev/zero bs=1M count=$size status=none >> "$file" + sync +else + echo "$mode dat file... (current is ${fsMB}MB, reduce ${size}MB, finally ${total}MB)" +fi -echo "Extend dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)" -dd if=/dev/zero bs=1M count=$size status=none >> "$file" -sync freeloop=$(losetup -f) losetup $freeloop "$file" if [ "$cmd" = "resize2fs" ]; then - echo "Extend ext filesystem by resize2fs ..." + echo "$mode ext filesystem by resize2fs ..." echo "resize2fs $freeloop ${total}M" e2fsck -f $freeloop resize2fs $freeloop ${total}M ret=$? else - echo "Extend xfs filesystem by xfs_growfs ..." - + echo "$mode xfs filesystem by xfs_growfs ..." tmpdir=$(mktemp -d) mount $freeloop $tmpdir xfs_growfs $freeloop @@ -87,6 +112,12 @@ fi losetup -d $freeloop +if [ $ret -eq 0 -a "$mode" = "Shrink" ]; then + echo "truncate persistent file ..." + truncate "$file" -s ${total}M + ret=$? +fi + echo "" if [ $ret -eq 0 ]; then echo "======= SUCCESS =========" @@ -94,4 +125,3 @@ else echo "======= FAILED =========" fi echo "" - diff --git a/INSTALL/FOR_X64_ARM.txt b/INSTALL/FOR_X64_ARM.txt new file mode 100644 index 00000000..d1b82aeb --- /dev/null +++ b/INSTALL/FOR_X64_ARM.txt @@ -0,0 +1,12 @@ +============ Ventoy2Disk.exe for x86_64/ARM/ARM64 ================= +Ventoy2Disk.exe is a x86_32 application and supports both 32-bit and 64-bit Windows PC with intel/amd processor. +Since 1.0.58, Ventoy also provides Ventoy2Disk_X64.exe/Ventoy2Disk_ARM.exe/Ventoy2Disk_ARM64.exe you can use them if needed. +These exe files are in altexe directory of the installation package. +You must copy them to the upper directory to use them. (The same location with Ventoy2Disk.exe) + + +============ x86_64/ARM/ARM64 版本 Ventoy2Disk.exe ================= +默认的 Ventoy2Disk.exe 是32ä½x86程åºï¼ŒåŒæ—¶æ”¯æŒæœ€å¸¸è§çš„32ä½å’Œ64ä½Windows系统,ç»å¤§éƒ¨åˆ†æƒ…况下使用它就å¯ä»¥ã€‚ +从1.0.58版本开始,Ventoy还åŒæ—¶æ供了 Ventoy2Disk_X64.exe/Ventoy2Disk_ARM.exe/Ventoy2Disk_ARM64.exe å¯ä»¥æ ¹æ®éœ€è¦ä½¿ç”¨ã€‚ +这些文件ä½äºŽå®‰è£…包内的altexe目录下,使用时需è¦å°†å…¶æ‹·è´åˆ°ä¸Šä¸€å±‚目录(å³å’Œ Ventoy2Disk.exe åŒä¸€ä½ç½®ï¼‰ã€‚ + diff --git a/INSTALL/README b/INSTALL/README index 645703eb..a435d567 100644 --- a/INSTALL/README +++ b/INSTALL/README @@ -21,8 +21,16 @@ Please refer https://www.ventoy.net/en/doc_start.html for details. 1. sudo sh VentoyWeb.sh 2. open your browser and visit http://127.0.0.1:24680 -========== VentoyWebDeepin.sh =============== -1. sudo sh VentoyWebDeepin.sh + +========== VentoyPlugson.sh =============== +1. sudo sh VentoyPlugson.sh +2. open your browser and visit http://127.0.0.1:24681 + + +========= VentoyGUI =================== +VentoyGUI is native GUI program for Linux (GTK/QT) +1. Just double-click the file (e.g. VentoyGUI.x86_64) +2. If it can not startup after double-click, you can open the terminal and just execute the file (e.g. ./VentoyGUI.x86_64) ========== CreatePersistentImg.sh =============== diff --git a/INSTALL/Ventoy2Disk.exe b/INSTALL/Ventoy2Disk.exe index 04b1a893..e829df70 100644 Binary files a/INSTALL/Ventoy2Disk.exe and b/INSTALL/Ventoy2Disk.exe differ diff --git a/INSTALL/Ventoy2Disk.sh b/INSTALL/Ventoy2Disk.sh index 5b1d6f4c..dac5c2f5 100644 --- a/INSTALL/Ventoy2Disk.sh +++ b/INSTALL/Ventoy2Disk.sh @@ -21,7 +21,7 @@ elif uname -m | egrep -q 'mips64'; then else export TOOLDIR=i386 fi -export PATH=./tool/$TOOLDIR:$PATH +export PATH="./tool/$TOOLDIR:$PATH" echo '' @@ -46,23 +46,25 @@ echo "############# Ventoy2Disk $* [$TOOLDIR] ################" >> ./log.txt date >> ./log.txt #decompress tool -if [ -f ./tool/$TOOLDIR/ash ]; then - echo "no need to decompress tools" >> ./log.txt -else - cd ./tool/$TOOLDIR - +echo "decompress tools" >> ./log.txt +cd ./tool/$TOOLDIR + +ls *.xz > /dev/null 2>&1 +if [ $? -eq 0 ]; then [ -f ./xzcat ] && chmod +x ./xzcat - + for file in $(ls *.xz); do + echo "decompress $file" >> ./log.txt xzcat $file > ${file%.xz} [ -f ./${file%.xz} ] && chmod +x ./${file%.xz} [ -f ./$file ] && rm -f ./$file done - cd ../../ - - chmod +x -R ./tool/$TOOLDIR fi +cd ../../ +chmod +x -R ./tool/$TOOLDIR + + if [ -f /bin/bash ]; then /bin/bash ./tool/VentoyWorker.sh $* else diff --git a/INSTALL/Ventoy2Disk_ARM.exe b/INSTALL/Ventoy2Disk_ARM.exe new file mode 100644 index 00000000..1240a42b Binary files /dev/null and b/INSTALL/Ventoy2Disk_ARM.exe differ diff --git a/INSTALL/Ventoy2Disk_ARM64.exe b/INSTALL/Ventoy2Disk_ARM64.exe new file mode 100644 index 00000000..fe3f100d Binary files /dev/null and b/INSTALL/Ventoy2Disk_ARM64.exe differ diff --git a/INSTALL/Ventoy2Disk_X64.exe b/INSTALL/Ventoy2Disk_X64.exe new file mode 100644 index 00000000..45e8e595 Binary files /dev/null and b/INSTALL/Ventoy2Disk_X64.exe differ diff --git a/INSTALL/VentoyGUI.aarch64 b/INSTALL/VentoyGUI.aarch64 new file mode 100644 index 00000000..6b1f5dcd Binary files /dev/null and b/INSTALL/VentoyGUI.aarch64 differ diff --git a/INSTALL/VentoyGUI.i386 b/INSTALL/VentoyGUI.i386 new file mode 100644 index 00000000..0824dd49 Binary files /dev/null and b/INSTALL/VentoyGUI.i386 differ diff --git a/INSTALL/VentoyGUI.mips64el b/INSTALL/VentoyGUI.mips64el new file mode 100644 index 00000000..46e88287 Binary files /dev/null and b/INSTALL/VentoyGUI.mips64el differ diff --git a/INSTALL/VentoyGUI.x86_64 b/INSTALL/VentoyGUI.x86_64 new file mode 100644 index 00000000..71b6b4bd Binary files /dev/null and b/INSTALL/VentoyGUI.x86_64 differ diff --git a/INSTALL/VentoyPlugson.sh b/INSTALL/VentoyPlugson.sh new file mode 100644 index 00000000..c398432c --- /dev/null +++ b/INSTALL/VentoyPlugson.sh @@ -0,0 +1,218 @@ +#!/bin/sh + +. ./tool/ventoy_lib.sh + +print_usage() { + echo 'Usage: sudo sh VentoyPlugson.sh [OPTION] /dev/sdX' + echo ' OPTION: (optional)' + echo ' -H x.x.x.x http server IP address (default is 127.0.0.1)' + echo ' -P PORT http server PORT (default is 24681)' + echo ' -h print this help' + echo '' +} + +uid=$(id -u) +if [ $uid -ne 0 ]; then + echo "Please use sudo or run the script as root." + exit 1 +fi + + +OLDDIR=$(pwd) + +machine=$(uname -m) +if echo $machine | egrep -q 'aarch64|arm64'; then + TOOLDIR=aarch64 +elif echo $machine | egrep -q 'x86_64|amd64'; then + TOOLDIR=x86_64 +elif echo $machine | egrep -q 'mips64'; then + TOOLDIR=mips64el +elif echo $machine | egrep -q 'i[3-6]86'; then + TOOLDIR=i386 +else + echo "Unsupported machine type $machine" + exit 1 +fi + + +if ! [ -f "$OLDDIR/tool/plugson.tar.xz" ]; then + echo "Please run under the correct directory!" + exit 1 +fi + +echo "############# VentoyPlugson $* [$TOOLDIR] ################" >> ./VentoyPlugson.log +date >> ./VentoyPlugson.log + +echo "decompress tools" >> ./VentoyPlugson.log +cd ./tool/$TOOLDIR + +ls *.xz > /dev/null 2>&1 +if [ $? -eq 0 ]; then + [ -f ./xzcat ] && chmod +x ./xzcat + + for file in $(ls *.xz); do + echo "decompress $file" >> ./VentoyPlugson.log + xzcat $file > ${file%.xz} + [ -f ./${file%.xz} ] && chmod +x ./${file%.xz} + [ -f ./$file ] && rm -f ./$file + done +fi + +cd ../../ +chmod +x -R ./tool/$TOOLDIR + +if ! [ -f "$OLDDIR/tool/$TOOLDIR/Plugson" ]; then + echo "$OLDDIR/tool/$TOOLDIR/Plugson does not exist!" + exit 1 +fi + + +PATH=./tool/$TOOLDIR:$PATH + +HOST="127.0.0.1" +PORT=24681 + +while [ -n "$1" ]; do + if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + print_usage + exit 0 + elif [ "$1" = "-H" ]; then + shift + if echo $1 | grep -q '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'; then + HOST="$1" + else + echo "Invalid host $1" + exit 1 + fi + elif [ "$1" = "-P" ]; then + shift + if [ $1 -gt 0 -a $1 -le 65535 ]; then + PORT="$1" + else + echo "Invalid port $1" + exit 1 + fi + else + DISK=$1 + fi + + shift +done + +if [ -z "$DISK" ]; then + print_usage + exit 0 +fi + +if ps -ef | grep "tool/$TOOLDIR/Plugson.*$HOST.*$PORT" | grep -q -v grep; then + echo "Another ventoy server is running now, please close it first." + exit 1 +fi + +if echo $DISK | grep -q "[a-z]d[a-z][1-9]"; then + DISK=${DISK:0:-1} +fi + +if echo $DISK | egrep -q "/dev/nvme|/dev/mmcblk/dev/nbd"; then + if echo $DISK | grep -q "p[1-9]$"; then + DISK=${DISK:0:-2} + fi +fi + + +if [ ! -b "$DISK" ]; then + echo "$DISK does NOT exist." + exit 1 +fi + + +version=$(get_disk_ventoy_version $DISK) +if [ $? -eq 0 ]; then + echo "Ventoy version in Disk: $version" + + vtPart1Type=$(dd if=$DISK bs=1 count=1 skip=450 status=none | hexdump -n1 -e '1/1 "%02X"') + if [ "$vtPart1Type" = "EE" ]; then + echo "Disk Partition Style : GPT" + partstyle=1 + else + echo "Disk Partition Style : MBR" + partstyle=0 + fi + + if check_disk_secure_boot $DISK; then + echo "Secure Boot Support : YES" + secureboot=1 + else + echo "Secure Boot Support : NO" + secureboot=0 + fi +else + echo "$DISK is NOT Ventoy disk." + exit 1 +fi + +PART1=$(get_disk_part_name $DISK 1) + +if grep -q "^$PART1 " /proc/mounts; then + mtpnt=$(grep "^$PART1 " /proc/mounts | awk '{print $2}') + fstype=$(grep "^$PART1 " /proc/mounts | awk '{print $3}') + + if echo $fstype | grep -q -i 'fuse'; then + if hexdump -C -n 16 $PART1 | grep -q -i "EXFAT"; then + fstype="exFAT" + elif hexdump -C -n 16 $PART1 | grep -q -i "NTFS"; then + fstype="NTFS" + fi + fi + + echo "$PART1 is mounted at $mtpnt $fstype" +else + echo "$PART1 is NOT mounted, please mount it first!" + exit 1 +fi + +if [ -d "$mtpnt/ventoy" ]; then + echo "ventoy directory exist OK" +else + echo "create ventoy directory" + mkdir -p "$mtpnt/ventoy" + if [ -d "$mtpnt/ventoy" ]; then + chmod -R 0755 "$mtpnt/ventoy" + else + echo "Failed to create directory $mtpnt/ventoy" + exit 1 + fi +fi + + +#change current directory to Ventoy disk +cd "$mtpnt" +$OLDDIR/tool/$TOOLDIR/Plugson "$HOST" "$PORT" "$OLDDIR" "$DISK" $version "$fstype" $partstyle $secureboot & +wID=$! +sleep 1 + +if [ -f /proc/$wID/maps ]; then + echo "" + echo "===============================================================" + if [ "$LANG" = "zh_CN.UTF-8" ]; then + echo " Ventoy Plugson Server å·²ç»å¯åŠ¨ ..." + echo " 请打开æµè§ˆå™¨ï¼Œè®¿é—® http://${HOST}:${PORT}" + else + echo " Ventoy Plugson Server is running ..." + echo " Please open your browser and visit http://${HOST}:${PORT}" + fi + echo "===============================================================" + echo "" + echo "################## Press Ctrl + C to exit #####################" + echo "" + + wait $wID +fi + + +if [ -n "$OLDDIR" ]; then + CURDIR=$(pwd) + if [ "$CURDIR" != "$OLDDIR" ]; then + cd "$OLDDIR" + fi +fi diff --git a/INSTALL/VentoyWeb.sh b/INSTALL/VentoyWeb.sh index 061120b8..76ed0d56 100644 --- a/INSTALL/VentoyWeb.sh +++ b/INSTALL/VentoyWeb.sh @@ -45,6 +45,7 @@ if [ ! -f ./boot/boot.img ]; then if [ -d ./grub ]; then echo "Don't run VentoyWeb.sh here, please download the released install package, and run the script in it." else + echo "Current directory is $PWD" echo "Please run under the correct directory!" fi exit 1 diff --git a/INSTALL/VentoyWebDeepin.sh b/INSTALL/VentoyWebDeepin.sh deleted file mode 100644 index 1bcaf2b9..00000000 --- a/INSTALL/VentoyWebDeepin.sh +++ /dev/null @@ -1,109 +0,0 @@ -#!/bin/sh - -if echo "$*" | grep -q '[-]v'; then - set -x -fi - -print_usage() { - echo 'Usage: VentoyWebDeepin.sh [ OPTION ]' - echo ' OPTION: (optional)' - echo ' -H x.x.x.x http server IP address (default is 127.0.0.1)' - echo ' -p PORT http server PORT (default is 24680)' - echo ' -h print this help' - echo ' -v print verbose info' - echo '' -} - -print_err() { - echo "" - echo "$*" - echo "" -} - -get_user() { - name=$(logname) - if [ -n "$name" -a "$name" != "root" ]; then - echo $name; return - fi - - name=${HOME#/home/} - if [ -n "$name" -a "$name" != "root" ]; then - echo $name; return - fi -} - -uid=$(id -u) -if [ $uid -ne 0 ]; then - exec sudo sh $0 $* -fi - -OLDDIR=$(pwd) - -if uname -m | egrep -q 'aarch64|arm64'; then - TOOLDIR=aarch64 -elif uname -m | egrep -q 'x86_64|amd64'; then - TOOLDIR=x86_64 -elif uname -m | egrep -q 'mips64'; then - TOOLDIR=mips64el -else - TOOLDIR=i386 -fi - -if [ ! -f ./tool/$TOOLDIR/V2DServer ]; then - if [ -f ${0%VentoyWebDeepin.sh}/tool/$TOOLDIR/V2DServer ]; then - cd ${0%VentoyWebDeepin.sh} - fi -fi - -PATH=./tool/$TOOLDIR:$PATH - -if [ ! -f ./boot/boot.img ]; then - if [ -d ./grub ]; then - echo "Don't run VentoyWebDeepin.sh here, please download the released install package, and run the script in it." - else - echo "Please run under the correct directory!" - fi - exit 1 -fi - -HOST="127.0.0.1" -PORT=24680 - -while [ -n "$1" ]; do - if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then - print_usage - exit 0 - elif [ "$1" = "-v" ]; then - VERBOSE=1 - elif [ "$1" = "-H" ]; then - shift - if echo $1 | grep -q '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'; then - HOST="$1" - else - print_err "Invalid host $1" - exit 1 - fi - elif [ "$1" = "-p" ]; then - shift - if [ $1 -gt 0 -a $1 -le 65535 ]; then - PORT="$1" - else - print_err "Invalid port $1" - exit 1 - fi - fi - - shift -done - - -if ps -ef | grep "V2DServer.*$HOST.*$PORT" | grep -q -v grep; then - print_err "Another ventoy server is running now, please close it first." - exit 1 -fi - -if grep -q -i uos /etc/os-release; then - . ./tool/WebUos.sh -else - . ./tool/WebDeepin.sh -fi diff --git a/INSTALL/all_in_one.sh b/INSTALL/all_in_one.sh index 14163f38..827c80ba 100644 --- a/INSTALL/all_in_one.sh +++ b/INSTALL/all_in_one.sh @@ -38,13 +38,10 @@ sh buildedk.sh >> $LOG 2>&1 || exit 1 #cd $VTOY_PATH/VtoyTool #sh build.sh || exit 1 -#cd $VTOY_PATH/vtoyfat/fat_io_lib +#cd $VTOY_PATH/vtoycli/fat_io_lib #sh buildlib.sh -#cd $VTOY_PATH/vtoyfat -#sh build.sh || exit 1 - -#cd $VTOY_PATH/vtoygpt +#cd $VTOY_PATH/vtoycli #sh build.sh || exit 1 #cd $VTOY_PATH/FUSEISO diff --git a/INSTALL/grub/arm64-efi/adler32.mod b/INSTALL/grub/arm64-efi/adler32.mod index 17937684..806c5da0 100644 Binary files a/INSTALL/grub/arm64-efi/adler32.mod and b/INSTALL/grub/arm64-efi/adler32.mod differ diff --git a/INSTALL/grub/arm64-efi/affs.mod b/INSTALL/grub/arm64-efi/affs.mod index b41d87d7..4656e87a 100644 Binary files a/INSTALL/grub/arm64-efi/affs.mod and b/INSTALL/grub/arm64-efi/affs.mod differ diff --git a/INSTALL/grub/arm64-efi/afs.mod b/INSTALL/grub/arm64-efi/afs.mod index d84f2d23..e8982a9f 100644 Binary files a/INSTALL/grub/arm64-efi/afs.mod and b/INSTALL/grub/arm64-efi/afs.mod differ diff --git a/INSTALL/grub/arm64-efi/archelp.mod b/INSTALL/grub/arm64-efi/archelp.mod index 30241dfa..c4729bac 100644 Binary files a/INSTALL/grub/arm64-efi/archelp.mod and b/INSTALL/grub/arm64-efi/archelp.mod differ diff --git a/INSTALL/grub/arm64-efi/bfs.mod b/INSTALL/grub/arm64-efi/bfs.mod index db600866..e24a0998 100644 Binary files a/INSTALL/grub/arm64-efi/bfs.mod and b/INSTALL/grub/arm64-efi/bfs.mod differ diff --git a/INSTALL/grub/arm64-efi/blscfg.mod b/INSTALL/grub/arm64-efi/blscfg.mod index 9b42d3d9..26112ee6 100644 Binary files a/INSTALL/grub/arm64-efi/blscfg.mod and b/INSTALL/grub/arm64-efi/blscfg.mod differ diff --git a/INSTALL/grub/arm64-efi/bswap_test.mod b/INSTALL/grub/arm64-efi/bswap_test.mod index fd5ab451..94350149 100644 Binary files a/INSTALL/grub/arm64-efi/bswap_test.mod and b/INSTALL/grub/arm64-efi/bswap_test.mod differ diff --git a/INSTALL/grub/arm64-efi/btrfs.mod b/INSTALL/grub/arm64-efi/btrfs.mod index 16692055..6dbb181b 100644 Binary files a/INSTALL/grub/arm64-efi/btrfs.mod and b/INSTALL/grub/arm64-efi/btrfs.mod differ diff --git a/INSTALL/grub/arm64-efi/cbfs.mod b/INSTALL/grub/arm64-efi/cbfs.mod index f700ae6e..a59d1c0f 100644 Binary files a/INSTALL/grub/arm64-efi/cbfs.mod and b/INSTALL/grub/arm64-efi/cbfs.mod differ diff --git a/INSTALL/grub/arm64-efi/cmdline_cat_test.mod b/INSTALL/grub/arm64-efi/cmdline_cat_test.mod index 3b0f38a0..cbdca10b 100644 Binary files a/INSTALL/grub/arm64-efi/cmdline_cat_test.mod and b/INSTALL/grub/arm64-efi/cmdline_cat_test.mod differ diff --git a/INSTALL/grub/arm64-efi/cmp.mod b/INSTALL/grub/arm64-efi/cmp.mod index a7d9210d..d392b473 100644 Binary files a/INSTALL/grub/arm64-efi/cmp.mod and b/INSTALL/grub/arm64-efi/cmp.mod differ diff --git a/INSTALL/grub/arm64-efi/cmp_test.mod b/INSTALL/grub/arm64-efi/cmp_test.mod index f70cca2b..51164f43 100644 Binary files a/INSTALL/grub/arm64-efi/cmp_test.mod and b/INSTALL/grub/arm64-efi/cmp_test.mod differ diff --git a/INSTALL/grub/arm64-efi/command.lst b/INSTALL/grub/arm64-efi/command.lst index 23f101cd..743d2559 100644 Binary files a/INSTALL/grub/arm64-efi/command.lst and b/INSTALL/grub/arm64-efi/command.lst differ diff --git a/INSTALL/grub/arm64-efi/cpio.mod b/INSTALL/grub/arm64-efi/cpio.mod index f7d966c5..541fe71b 100644 Binary files a/INSTALL/grub/arm64-efi/cpio.mod and b/INSTALL/grub/arm64-efi/cpio.mod differ diff --git a/INSTALL/grub/arm64-efi/cpio_be.mod b/INSTALL/grub/arm64-efi/cpio_be.mod index 5e90c17a..db0c096a 100644 Binary files a/INSTALL/grub/arm64-efi/cpio_be.mod and b/INSTALL/grub/arm64-efi/cpio_be.mod differ diff --git a/INSTALL/grub/arm64-efi/crc64.mod b/INSTALL/grub/arm64-efi/crc64.mod index 8b084f15..57c0e178 100644 Binary files a/INSTALL/grub/arm64-efi/crc64.mod and b/INSTALL/grub/arm64-efi/crc64.mod differ diff --git a/INSTALL/grub/arm64-efi/crypto.lst b/INSTALL/grub/arm64-efi/crypto.lst index 77d9efc0..bd0a97c6 100644 Binary files a/INSTALL/grub/arm64-efi/crypto.lst and b/INSTALL/grub/arm64-efi/crypto.lst differ diff --git a/INSTALL/grub/arm64-efi/cryptodisk.mod b/INSTALL/grub/arm64-efi/cryptodisk.mod index 1eac1a0e..ec574a2f 100644 Binary files a/INSTALL/grub/arm64-efi/cryptodisk.mod and b/INSTALL/grub/arm64-efi/cryptodisk.mod differ diff --git a/INSTALL/grub/arm64-efi/ctz_test.mod b/INSTALL/grub/arm64-efi/ctz_test.mod index 626f0c3b..f1a6a7e9 100644 Binary files a/INSTALL/grub/arm64-efi/ctz_test.mod and b/INSTALL/grub/arm64-efi/ctz_test.mod differ diff --git a/INSTALL/grub/arm64-efi/date.mod b/INSTALL/grub/arm64-efi/date.mod index 16ec0642..aaf92481 100644 Binary files a/INSTALL/grub/arm64-efi/date.mod and b/INSTALL/grub/arm64-efi/date.mod differ diff --git a/INSTALL/grub/arm64-efi/datehook.mod b/INSTALL/grub/arm64-efi/datehook.mod index c8479fa2..9817cbe5 100644 Binary files a/INSTALL/grub/arm64-efi/datehook.mod and b/INSTALL/grub/arm64-efi/datehook.mod differ diff --git a/INSTALL/grub/arm64-efi/disk.mod b/INSTALL/grub/arm64-efi/disk.mod index 493ae1ea..bdc2c8bb 100644 Binary files a/INSTALL/grub/arm64-efi/disk.mod and b/INSTALL/grub/arm64-efi/disk.mod differ diff --git a/INSTALL/grub/arm64-efi/div.mod b/INSTALL/grub/arm64-efi/div.mod index 07f9731d..281406f8 100644 Binary files a/INSTALL/grub/arm64-efi/div.mod and b/INSTALL/grub/arm64-efi/div.mod differ diff --git a/INSTALL/grub/arm64-efi/div_test.mod b/INSTALL/grub/arm64-efi/div_test.mod index c30473ff..d79e6cfa 100644 Binary files a/INSTALL/grub/arm64-efi/div_test.mod and b/INSTALL/grub/arm64-efi/div_test.mod differ diff --git a/INSTALL/grub/arm64-efi/dm_nv.mod b/INSTALL/grub/arm64-efi/dm_nv.mod index 0da01507..089b613e 100644 Binary files a/INSTALL/grub/arm64-efi/dm_nv.mod and b/INSTALL/grub/arm64-efi/dm_nv.mod differ diff --git a/INSTALL/grub/arm64-efi/efinet.mod b/INSTALL/grub/arm64-efi/efinet.mod index 941db7d1..6aa4d866 100644 Binary files a/INSTALL/grub/arm64-efi/efinet.mod and b/INSTALL/grub/arm64-efi/efinet.mod differ diff --git a/INSTALL/grub/arm64-efi/elf.mod b/INSTALL/grub/arm64-efi/elf.mod index 22959145..88ce4ab9 100644 Binary files a/INSTALL/grub/arm64-efi/elf.mod and b/INSTALL/grub/arm64-efi/elf.mod differ diff --git a/INSTALL/grub/arm64-efi/eval.mod b/INSTALL/grub/arm64-efi/eval.mod index 3cd9d098..370f3a4e 100644 Binary files a/INSTALL/grub/arm64-efi/eval.mod and b/INSTALL/grub/arm64-efi/eval.mod differ diff --git a/INSTALL/grub/arm64-efi/exfctest.mod b/INSTALL/grub/arm64-efi/exfctest.mod index 62278bd9..a8b3cd27 100644 Binary files a/INSTALL/grub/arm64-efi/exfctest.mod and b/INSTALL/grub/arm64-efi/exfctest.mod differ diff --git a/INSTALL/grub/arm64-efi/f2fs.mod b/INSTALL/grub/arm64-efi/f2fs.mod index 73dc88bb..eb62b755 100644 Binary files a/INSTALL/grub/arm64-efi/f2fs.mod and b/INSTALL/grub/arm64-efi/f2fs.mod differ diff --git a/INSTALL/grub/arm64-efi/fdt.lst b/INSTALL/grub/arm64-efi/fdt.lst index e69de29b..ea28d9e0 100644 Binary files a/INSTALL/grub/arm64-efi/fdt.lst and b/INSTALL/grub/arm64-efi/fdt.lst differ diff --git a/INSTALL/grub/arm64-efi/fdt.mod b/INSTALL/grub/arm64-efi/fdt.mod index d295efe7..1c8029ec 100644 Binary files a/INSTALL/grub/arm64-efi/fdt.mod and b/INSTALL/grub/arm64-efi/fdt.mod differ diff --git a/INSTALL/grub/arm64-efi/fs.lst b/INSTALL/grub/arm64-efi/fs.lst index 0acd240b..12c6c9d1 100644 Binary files a/INSTALL/grub/arm64-efi/fs.lst and b/INSTALL/grub/arm64-efi/fs.lst differ diff --git a/INSTALL/grub/arm64-efi/functional_test.mod b/INSTALL/grub/arm64-efi/functional_test.mod index 2db96334..bab2b83d 100644 Binary files a/INSTALL/grub/arm64-efi/functional_test.mod and b/INSTALL/grub/arm64-efi/functional_test.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_arcfour.mod b/INSTALL/grub/arm64-efi/gcry_arcfour.mod index e78d0716..fa6a1464 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_arcfour.mod and b/INSTALL/grub/arm64-efi/gcry_arcfour.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_blowfish.mod b/INSTALL/grub/arm64-efi/gcry_blowfish.mod index fe2c3a98..71c1e561 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_blowfish.mod and b/INSTALL/grub/arm64-efi/gcry_blowfish.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_camellia.mod b/INSTALL/grub/arm64-efi/gcry_camellia.mod index 6c259ae5..ff60824f 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_camellia.mod and b/INSTALL/grub/arm64-efi/gcry_camellia.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_cast5.mod b/INSTALL/grub/arm64-efi/gcry_cast5.mod index cb0f5de7..779c31ec 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_cast5.mod and b/INSTALL/grub/arm64-efi/gcry_cast5.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_crc.mod b/INSTALL/grub/arm64-efi/gcry_crc.mod index ae0a4619..072c4840 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_crc.mod and b/INSTALL/grub/arm64-efi/gcry_crc.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_des.mod b/INSTALL/grub/arm64-efi/gcry_des.mod index 49e0723d..1d12ed04 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_des.mod and b/INSTALL/grub/arm64-efi/gcry_des.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_dsa.mod b/INSTALL/grub/arm64-efi/gcry_dsa.mod index cfceba77..4288cd4d 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_dsa.mod and b/INSTALL/grub/arm64-efi/gcry_dsa.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_idea.mod b/INSTALL/grub/arm64-efi/gcry_idea.mod index 8a1e4928..03b17d8b 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_idea.mod and b/INSTALL/grub/arm64-efi/gcry_idea.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_md4.mod b/INSTALL/grub/arm64-efi/gcry_md4.mod index 514efcf5..b84b1f3c 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_md4.mod and b/INSTALL/grub/arm64-efi/gcry_md4.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_rfc2268.mod b/INSTALL/grub/arm64-efi/gcry_rfc2268.mod index 8f2bd3e3..633ee22f 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_rfc2268.mod and b/INSTALL/grub/arm64-efi/gcry_rfc2268.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_rijndael.mod b/INSTALL/grub/arm64-efi/gcry_rijndael.mod index 272b6bbb..721eaa03 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_rijndael.mod and b/INSTALL/grub/arm64-efi/gcry_rijndael.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_rmd160.mod b/INSTALL/grub/arm64-efi/gcry_rmd160.mod index 04827ec0..3688d8b3 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_rmd160.mod and b/INSTALL/grub/arm64-efi/gcry_rmd160.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_rsa.mod b/INSTALL/grub/arm64-efi/gcry_rsa.mod index 50ffc9d2..e33a0fe9 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_rsa.mod and b/INSTALL/grub/arm64-efi/gcry_rsa.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_seed.mod b/INSTALL/grub/arm64-efi/gcry_seed.mod index 95611c1e..636bc991 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_seed.mod and b/INSTALL/grub/arm64-efi/gcry_seed.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_serpent.mod b/INSTALL/grub/arm64-efi/gcry_serpent.mod index abfe5718..70c3257d 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_serpent.mod and b/INSTALL/grub/arm64-efi/gcry_serpent.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_sha1.mod b/INSTALL/grub/arm64-efi/gcry_sha1.mod index 60c1aab0..55eeb123 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_sha1.mod and b/INSTALL/grub/arm64-efi/gcry_sha1.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_sha256.mod b/INSTALL/grub/arm64-efi/gcry_sha256.mod index b592e9e0..b00f7998 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_sha256.mod and b/INSTALL/grub/arm64-efi/gcry_sha256.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_tiger.mod b/INSTALL/grub/arm64-efi/gcry_tiger.mod index 8795df34..ec6a9835 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_tiger.mod and b/INSTALL/grub/arm64-efi/gcry_tiger.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_twofish.mod b/INSTALL/grub/arm64-efi/gcry_twofish.mod index fb2a6c92..1ce7bb28 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_twofish.mod and b/INSTALL/grub/arm64-efi/gcry_twofish.mod differ diff --git a/INSTALL/grub/arm64-efi/gcry_whirlpool.mod b/INSTALL/grub/arm64-efi/gcry_whirlpool.mod index e77346ed..885a3cee 100644 Binary files a/INSTALL/grub/arm64-efi/gcry_whirlpool.mod and b/INSTALL/grub/arm64-efi/gcry_whirlpool.mod differ diff --git a/INSTALL/grub/arm64-efi/geli.mod b/INSTALL/grub/arm64-efi/geli.mod index 6aeb5bf8..74835b12 100644 Binary files a/INSTALL/grub/arm64-efi/geli.mod and b/INSTALL/grub/arm64-efi/geli.mod differ diff --git a/INSTALL/grub/arm64-efi/gfxterm_menu.mod b/INSTALL/grub/arm64-efi/gfxterm_menu.mod index 0a2f103c..36084369 100644 Binary files a/INSTALL/grub/arm64-efi/gfxterm_menu.mod and b/INSTALL/grub/arm64-efi/gfxterm_menu.mod differ diff --git a/INSTALL/grub/arm64-efi/gptsync.mod b/INSTALL/grub/arm64-efi/gptsync.mod index 17924d5b..7a2f95f0 100644 Binary files a/INSTALL/grub/arm64-efi/gptsync.mod and b/INSTALL/grub/arm64-efi/gptsync.mod differ diff --git a/INSTALL/grub/arm64-efi/hello.mod b/INSTALL/grub/arm64-efi/hello.mod index 459aaa3d..cd60a488 100644 Binary files a/INSTALL/grub/arm64-efi/hello.mod and b/INSTALL/grub/arm64-efi/hello.mod differ diff --git a/INSTALL/grub/arm64-efi/help.mod b/INSTALL/grub/arm64-efi/help.mod index 81c4bb5a..a12f6e20 100644 Binary files a/INSTALL/grub/arm64-efi/help.mod and b/INSTALL/grub/arm64-efi/help.mod differ diff --git a/INSTALL/grub/arm64-efi/hexdump.mod b/INSTALL/grub/arm64-efi/hexdump.mod index 65c48830..3018a844 100644 Binary files a/INSTALL/grub/arm64-efi/hexdump.mod and b/INSTALL/grub/arm64-efi/hexdump.mod differ diff --git a/INSTALL/grub/arm64-efi/hfs.mod b/INSTALL/grub/arm64-efi/hfs.mod index a0c1c314..728d2593 100644 Binary files a/INSTALL/grub/arm64-efi/hfs.mod and b/INSTALL/grub/arm64-efi/hfs.mod differ diff --git a/INSTALL/grub/arm64-efi/hfspluscomp.mod b/INSTALL/grub/arm64-efi/hfspluscomp.mod index ebc5b18e..bbeca9df 100644 Binary files a/INSTALL/grub/arm64-efi/hfspluscomp.mod and b/INSTALL/grub/arm64-efi/hfspluscomp.mod differ diff --git a/INSTALL/grub/arm64-efi/jfs.mod b/INSTALL/grub/arm64-efi/jfs.mod index b48ca1c3..aebbdd18 100644 Binary files a/INSTALL/grub/arm64-efi/jfs.mod and b/INSTALL/grub/arm64-efi/jfs.mod differ diff --git a/INSTALL/grub/arm64-efi/keystatus.mod b/INSTALL/grub/arm64-efi/keystatus.mod index 24e97080..a2284431 100644 Binary files a/INSTALL/grub/arm64-efi/keystatus.mod and b/INSTALL/grub/arm64-efi/keystatus.mod differ diff --git a/INSTALL/grub/arm64-efi/ldm.mod b/INSTALL/grub/arm64-efi/ldm.mod index 95e626ba..d7ba3012 100644 Binary files a/INSTALL/grub/arm64-efi/ldm.mod and b/INSTALL/grub/arm64-efi/ldm.mod differ diff --git a/INSTALL/grub/arm64-efi/loadenv.mod b/INSTALL/grub/arm64-efi/loadenv.mod index 996730c8..8c6a2a88 100644 Binary files a/INSTALL/grub/arm64-efi/loadenv.mod and b/INSTALL/grub/arm64-efi/loadenv.mod differ diff --git a/INSTALL/grub/arm64-efi/lsacpi.mod b/INSTALL/grub/arm64-efi/lsacpi.mod index 9915a649..841862fa 100644 Binary files a/INSTALL/grub/arm64-efi/lsacpi.mod and b/INSTALL/grub/arm64-efi/lsacpi.mod differ diff --git a/INSTALL/grub/arm64-efi/lsefi.mod b/INSTALL/grub/arm64-efi/lsefi.mod index 56e709d2..3d48f26f 100644 Binary files a/INSTALL/grub/arm64-efi/lsefi.mod and b/INSTALL/grub/arm64-efi/lsefi.mod differ diff --git a/INSTALL/grub/arm64-efi/lsefimmap.mod b/INSTALL/grub/arm64-efi/lsefimmap.mod index 815e3da8..2fe11267 100644 Binary files a/INSTALL/grub/arm64-efi/lsefimmap.mod and b/INSTALL/grub/arm64-efi/lsefimmap.mod differ diff --git a/INSTALL/grub/arm64-efi/lsefisystab.mod b/INSTALL/grub/arm64-efi/lsefisystab.mod index 64831e1d..571f4ae2 100644 Binary files a/INSTALL/grub/arm64-efi/lsefisystab.mod and b/INSTALL/grub/arm64-efi/lsefisystab.mod differ diff --git a/INSTALL/grub/arm64-efi/lsmmap.mod b/INSTALL/grub/arm64-efi/lsmmap.mod index 98b8499b..813af7fa 100644 Binary files a/INSTALL/grub/arm64-efi/lsmmap.mod and b/INSTALL/grub/arm64-efi/lsmmap.mod differ diff --git a/INSTALL/grub/arm64-efi/lssal.mod b/INSTALL/grub/arm64-efi/lssal.mod index 435c5a95..e80f9ae7 100644 Binary files a/INSTALL/grub/arm64-efi/lssal.mod and b/INSTALL/grub/arm64-efi/lssal.mod differ diff --git a/INSTALL/grub/arm64-efi/luks.mod b/INSTALL/grub/arm64-efi/luks.mod index 24c39745..8f9e6c48 100644 Binary files a/INSTALL/grub/arm64-efi/luks.mod and b/INSTALL/grub/arm64-efi/luks.mod differ diff --git a/INSTALL/grub/arm64-efi/lvm.mod b/INSTALL/grub/arm64-efi/lvm.mod index dd087446..ab681fec 100644 Binary files a/INSTALL/grub/arm64-efi/lvm.mod and b/INSTALL/grub/arm64-efi/lvm.mod differ diff --git a/INSTALL/grub/arm64-efi/macbless.mod b/INSTALL/grub/arm64-efi/macbless.mod index 970030b9..ce130c89 100644 Binary files a/INSTALL/grub/arm64-efi/macbless.mod and b/INSTALL/grub/arm64-efi/macbless.mod differ diff --git a/INSTALL/grub/arm64-efi/macho.mod b/INSTALL/grub/arm64-efi/macho.mod index 2b09206a..109f49fd 100644 Binary files a/INSTALL/grub/arm64-efi/macho.mod and b/INSTALL/grub/arm64-efi/macho.mod differ diff --git a/INSTALL/grub/arm64-efi/mdraid09.mod b/INSTALL/grub/arm64-efi/mdraid09.mod index 82044c87..250059d4 100644 Binary files a/INSTALL/grub/arm64-efi/mdraid09.mod and b/INSTALL/grub/arm64-efi/mdraid09.mod differ diff --git a/INSTALL/grub/arm64-efi/mdraid09_be.mod b/INSTALL/grub/arm64-efi/mdraid09_be.mod index ec9e183a..85a250a2 100644 Binary files a/INSTALL/grub/arm64-efi/mdraid09_be.mod and b/INSTALL/grub/arm64-efi/mdraid09_be.mod differ diff --git a/INSTALL/grub/arm64-efi/mdraid1x.mod b/INSTALL/grub/arm64-efi/mdraid1x.mod index dc3c11ca..7c32dedb 100644 Binary files a/INSTALL/grub/arm64-efi/mdraid1x.mod and b/INSTALL/grub/arm64-efi/mdraid1x.mod differ diff --git a/INSTALL/grub/arm64-efi/memdisk.mod b/INSTALL/grub/arm64-efi/memdisk.mod index 6e48df2f..c2b769ec 100644 Binary files a/INSTALL/grub/arm64-efi/memdisk.mod and b/INSTALL/grub/arm64-efi/memdisk.mod differ diff --git a/INSTALL/grub/arm64-efi/memrw.mod b/INSTALL/grub/arm64-efi/memrw.mod index b7d77511..760d6446 100644 Binary files a/INSTALL/grub/arm64-efi/memrw.mod and b/INSTALL/grub/arm64-efi/memrw.mod differ diff --git a/INSTALL/grub/arm64-efi/minix.mod b/INSTALL/grub/arm64-efi/minix.mod index a22a811b..b6959460 100644 Binary files a/INSTALL/grub/arm64-efi/minix.mod and b/INSTALL/grub/arm64-efi/minix.mod differ diff --git a/INSTALL/grub/arm64-efi/minix2.mod b/INSTALL/grub/arm64-efi/minix2.mod index b5e18f4d..01775e8d 100644 Binary files a/INSTALL/grub/arm64-efi/minix2.mod and b/INSTALL/grub/arm64-efi/minix2.mod differ diff --git a/INSTALL/grub/arm64-efi/minix2_be.mod b/INSTALL/grub/arm64-efi/minix2_be.mod index 56066e88..f8cf8f79 100644 Binary files a/INSTALL/grub/arm64-efi/minix2_be.mod and b/INSTALL/grub/arm64-efi/minix2_be.mod differ diff --git a/INSTALL/grub/arm64-efi/minix3.mod b/INSTALL/grub/arm64-efi/minix3.mod index f6e3337b..0c61d0ba 100644 Binary files a/INSTALL/grub/arm64-efi/minix3.mod and b/INSTALL/grub/arm64-efi/minix3.mod differ diff --git a/INSTALL/grub/arm64-efi/minix3_be.mod b/INSTALL/grub/arm64-efi/minix3_be.mod index df5f6da4..91843b86 100644 Binary files a/INSTALL/grub/arm64-efi/minix3_be.mod and b/INSTALL/grub/arm64-efi/minix3_be.mod differ diff --git a/INSTALL/grub/arm64-efi/minix_be.mod b/INSTALL/grub/arm64-efi/minix_be.mod index f3e4eebd..0dc4c2a1 100644 Binary files a/INSTALL/grub/arm64-efi/minix_be.mod and b/INSTALL/grub/arm64-efi/minix_be.mod differ diff --git a/INSTALL/grub/arm64-efi/moddep.lst b/INSTALL/grub/arm64-efi/moddep.lst index bc26700b..1a4cafca 100644 Binary files a/INSTALL/grub/arm64-efi/moddep.lst and b/INSTALL/grub/arm64-efi/moddep.lst differ diff --git a/INSTALL/grub/arm64-efi/mpi.mod b/INSTALL/grub/arm64-efi/mpi.mod index 10dea4d9..d862e7cc 100644 Binary files a/INSTALL/grub/arm64-efi/mpi.mod and b/INSTALL/grub/arm64-efi/mpi.mod differ diff --git a/INSTALL/grub/arm64-efi/msdospart.mod b/INSTALL/grub/arm64-efi/msdospart.mod index a3f545e6..cafa47e0 100644 Binary files a/INSTALL/grub/arm64-efi/msdospart.mod and b/INSTALL/grub/arm64-efi/msdospart.mod differ diff --git a/INSTALL/grub/arm64-efi/mul_test.mod b/INSTALL/grub/arm64-efi/mul_test.mod index 0c554df4..7d274034 100644 Binary files a/INSTALL/grub/arm64-efi/mul_test.mod and b/INSTALL/grub/arm64-efi/mul_test.mod differ diff --git a/INSTALL/grub/arm64-efi/nilfs2.mod b/INSTALL/grub/arm64-efi/nilfs2.mod index 51f727a3..0742bc81 100644 Binary files a/INSTALL/grub/arm64-efi/nilfs2.mod and b/INSTALL/grub/arm64-efi/nilfs2.mod differ diff --git a/INSTALL/grub/arm64-efi/normal.mod b/INSTALL/grub/arm64-efi/normal.mod index 3eabbc40..a2557d46 100644 Binary files a/INSTALL/grub/arm64-efi/normal.mod and b/INSTALL/grub/arm64-efi/normal.mod differ diff --git a/INSTALL/grub/arm64-efi/ntfscomp.mod b/INSTALL/grub/arm64-efi/ntfscomp.mod index 28f7fd43..1d197b7d 100644 Binary files a/INSTALL/grub/arm64-efi/ntfscomp.mod and b/INSTALL/grub/arm64-efi/ntfscomp.mod differ diff --git a/INSTALL/grub/arm64-efi/odc.mod b/INSTALL/grub/arm64-efi/odc.mod index e5ad8c65..c7c13fbd 100644 Binary files a/INSTALL/grub/arm64-efi/odc.mod and b/INSTALL/grub/arm64-efi/odc.mod differ diff --git a/INSTALL/grub/arm64-efi/offsetio.mod b/INSTALL/grub/arm64-efi/offsetio.mod index a6a9b17b..e9eba9fc 100644 Binary files a/INSTALL/grub/arm64-efi/offsetio.mod and b/INSTALL/grub/arm64-efi/offsetio.mod differ diff --git a/INSTALL/grub/arm64-efi/part_acorn.mod b/INSTALL/grub/arm64-efi/part_acorn.mod index 00f1bcf8..eddef743 100644 Binary files a/INSTALL/grub/arm64-efi/part_acorn.mod and b/INSTALL/grub/arm64-efi/part_acorn.mod differ diff --git a/INSTALL/grub/arm64-efi/part_amiga.mod b/INSTALL/grub/arm64-efi/part_amiga.mod index 6efa51fe..eb054706 100644 Binary files a/INSTALL/grub/arm64-efi/part_amiga.mod and b/INSTALL/grub/arm64-efi/part_amiga.mod differ diff --git a/INSTALL/grub/arm64-efi/part_bsd.mod b/INSTALL/grub/arm64-efi/part_bsd.mod index 67303ffd..e9fa701d 100644 Binary files a/INSTALL/grub/arm64-efi/part_bsd.mod and b/INSTALL/grub/arm64-efi/part_bsd.mod differ diff --git a/INSTALL/grub/arm64-efi/part_dfly.mod b/INSTALL/grub/arm64-efi/part_dfly.mod index fe8deac8..f88550b3 100644 Binary files a/INSTALL/grub/arm64-efi/part_dfly.mod and b/INSTALL/grub/arm64-efi/part_dfly.mod differ diff --git a/INSTALL/grub/arm64-efi/part_dvh.mod b/INSTALL/grub/arm64-efi/part_dvh.mod index 46c5d032..48da6429 100644 Binary files a/INSTALL/grub/arm64-efi/part_dvh.mod and b/INSTALL/grub/arm64-efi/part_dvh.mod differ diff --git a/INSTALL/grub/arm64-efi/part_plan.mod b/INSTALL/grub/arm64-efi/part_plan.mod index 3e719ffe..b88e4323 100644 Binary files a/INSTALL/grub/arm64-efi/part_plan.mod and b/INSTALL/grub/arm64-efi/part_plan.mod differ diff --git a/INSTALL/grub/arm64-efi/part_sun.mod b/INSTALL/grub/arm64-efi/part_sun.mod index 6ca0dd5a..6937d36b 100644 Binary files a/INSTALL/grub/arm64-efi/part_sun.mod and b/INSTALL/grub/arm64-efi/part_sun.mod differ diff --git a/INSTALL/grub/arm64-efi/part_sunpc.mod b/INSTALL/grub/arm64-efi/part_sunpc.mod index 45ad50e4..c86ec82d 100644 Binary files a/INSTALL/grub/arm64-efi/part_sunpc.mod and b/INSTALL/grub/arm64-efi/part_sunpc.mod differ diff --git a/INSTALL/grub/arm64-efi/partmap.lst b/INSTALL/grub/arm64-efi/partmap.lst index 761233aa..720c55e3 100644 Binary files a/INSTALL/grub/arm64-efi/partmap.lst and b/INSTALL/grub/arm64-efi/partmap.lst differ diff --git a/INSTALL/grub/arm64-efi/parttool.lst b/INSTALL/grub/arm64-efi/parttool.lst index 68b4b5c4..bfa2d4a8 100644 Binary files a/INSTALL/grub/arm64-efi/parttool.lst and b/INSTALL/grub/arm64-efi/parttool.lst differ diff --git a/INSTALL/grub/arm64-efi/parttool.mod b/INSTALL/grub/arm64-efi/parttool.mod index 0ca0e5f9..bbf25f46 100644 Binary files a/INSTALL/grub/arm64-efi/parttool.mod and b/INSTALL/grub/arm64-efi/parttool.mod differ diff --git a/INSTALL/grub/arm64-efi/password.mod b/INSTALL/grub/arm64-efi/password.mod index c9640fce..79ea75e6 100644 Binary files a/INSTALL/grub/arm64-efi/password.mod and b/INSTALL/grub/arm64-efi/password.mod differ diff --git a/INSTALL/grub/arm64-efi/pbkdf2_test.mod b/INSTALL/grub/arm64-efi/pbkdf2_test.mod index 846ea5ca..74067c9b 100644 Binary files a/INSTALL/grub/arm64-efi/pbkdf2_test.mod and b/INSTALL/grub/arm64-efi/pbkdf2_test.mod differ diff --git a/INSTALL/grub/arm64-efi/pgp.mod b/INSTALL/grub/arm64-efi/pgp.mod index bc605698..05a1eec9 100644 Binary files a/INSTALL/grub/arm64-efi/pgp.mod and b/INSTALL/grub/arm64-efi/pgp.mod differ diff --git a/INSTALL/grub/arm64-efi/probe.mod b/INSTALL/grub/arm64-efi/probe.mod index 85d414da..ee3a926f 100644 Binary files a/INSTALL/grub/arm64-efi/probe.mod and b/INSTALL/grub/arm64-efi/probe.mod differ diff --git a/INSTALL/grub/arm64-efi/procfs.mod b/INSTALL/grub/arm64-efi/procfs.mod index 0c9d57f0..fb59fcc7 100644 Binary files a/INSTALL/grub/arm64-efi/procfs.mod and b/INSTALL/grub/arm64-efi/procfs.mod differ diff --git a/INSTALL/grub/arm64-efi/progress.mod b/INSTALL/grub/arm64-efi/progress.mod index a33cc651..86a5baeb 100644 Binary files a/INSTALL/grub/arm64-efi/progress.mod and b/INSTALL/grub/arm64-efi/progress.mod differ diff --git a/INSTALL/grub/arm64-efi/raid5rec.mod b/INSTALL/grub/arm64-efi/raid5rec.mod index 7d879ac9..efff74e6 100644 Binary files a/INSTALL/grub/arm64-efi/raid5rec.mod and b/INSTALL/grub/arm64-efi/raid5rec.mod differ diff --git a/INSTALL/grub/arm64-efi/raid6rec.mod b/INSTALL/grub/arm64-efi/raid6rec.mod index c9bc6bab..15dc7e54 100644 Binary files a/INSTALL/grub/arm64-efi/raid6rec.mod and b/INSTALL/grub/arm64-efi/raid6rec.mod differ diff --git a/INSTALL/grub/arm64-efi/reiserfs.mod b/INSTALL/grub/arm64-efi/reiserfs.mod index a1d3de69..46a19bc5 100644 Binary files a/INSTALL/grub/arm64-efi/reiserfs.mod and b/INSTALL/grub/arm64-efi/reiserfs.mod differ diff --git a/INSTALL/grub/arm64-efi/romfs.mod b/INSTALL/grub/arm64-efi/romfs.mod index 807776f5..b861540c 100644 Binary files a/INSTALL/grub/arm64-efi/romfs.mod and b/INSTALL/grub/arm64-efi/romfs.mod differ diff --git a/INSTALL/grub/arm64-efi/scsi.mod b/INSTALL/grub/arm64-efi/scsi.mod index bf5e14bd..533d0747 100644 Binary files a/INSTALL/grub/arm64-efi/scsi.mod and b/INSTALL/grub/arm64-efi/scsi.mod differ diff --git a/INSTALL/grub/arm64-efi/search_fs_file.mod b/INSTALL/grub/arm64-efi/search_fs_file.mod index 9467d97b..abedb33f 100644 Binary files a/INSTALL/grub/arm64-efi/search_fs_file.mod and b/INSTALL/grub/arm64-efi/search_fs_file.mod differ diff --git a/INSTALL/grub/arm64-efi/search_fs_uuid.mod b/INSTALL/grub/arm64-efi/search_fs_uuid.mod index 2fe64d64..f17b8548 100644 Binary files a/INSTALL/grub/arm64-efi/search_fs_uuid.mod and b/INSTALL/grub/arm64-efi/search_fs_uuid.mod differ diff --git a/INSTALL/grub/arm64-efi/search_label.mod b/INSTALL/grub/arm64-efi/search_label.mod index 536e2e7d..0f6cc292 100644 Binary files a/INSTALL/grub/arm64-efi/search_label.mod and b/INSTALL/grub/arm64-efi/search_label.mod differ diff --git a/INSTALL/grub/arm64-efi/setjmp.mod b/INSTALL/grub/arm64-efi/setjmp.mod index 8104cc7f..b7e78774 100644 Binary files a/INSTALL/grub/arm64-efi/setjmp.mod and b/INSTALL/grub/arm64-efi/setjmp.mod differ diff --git a/INSTALL/grub/arm64-efi/setjmp_test.mod b/INSTALL/grub/arm64-efi/setjmp_test.mod index a7290efc..d003e850 100644 Binary files a/INSTALL/grub/arm64-efi/setjmp_test.mod and b/INSTALL/grub/arm64-efi/setjmp_test.mod differ diff --git a/INSTALL/grub/arm64-efi/sfs.mod b/INSTALL/grub/arm64-efi/sfs.mod index 680d753f..299ed04a 100644 Binary files a/INSTALL/grub/arm64-efi/sfs.mod and b/INSTALL/grub/arm64-efi/sfs.mod differ diff --git a/INSTALL/grub/arm64-efi/shift_test.mod b/INSTALL/grub/arm64-efi/shift_test.mod index 4d7c7626..cb252501 100644 Binary files a/INSTALL/grub/arm64-efi/shift_test.mod and b/INSTALL/grub/arm64-efi/shift_test.mod differ diff --git a/INSTALL/grub/arm64-efi/signature_test.mod b/INSTALL/grub/arm64-efi/signature_test.mod index 781758ca..95eb0f1f 100644 Binary files a/INSTALL/grub/arm64-efi/signature_test.mod and b/INSTALL/grub/arm64-efi/signature_test.mod differ diff --git a/INSTALL/grub/arm64-efi/sleep_test.mod b/INSTALL/grub/arm64-efi/sleep_test.mod index 56269434..b5a9fe36 100644 Binary files a/INSTALL/grub/arm64-efi/sleep_test.mod and b/INSTALL/grub/arm64-efi/sleep_test.mod differ diff --git a/INSTALL/grub/arm64-efi/strtoull_test.mod b/INSTALL/grub/arm64-efi/strtoull_test.mod index 0463d252..3b9136c5 100644 Binary files a/INSTALL/grub/arm64-efi/strtoull_test.mod and b/INSTALL/grub/arm64-efi/strtoull_test.mod differ diff --git a/INSTALL/grub/arm64-efi/syslinuxcfg.mod b/INSTALL/grub/arm64-efi/syslinuxcfg.mod index b2fd45a9..f9331a60 100644 Binary files a/INSTALL/grub/arm64-efi/syslinuxcfg.mod and b/INSTALL/grub/arm64-efi/syslinuxcfg.mod differ diff --git a/INSTALL/grub/arm64-efi/terminal.lst b/INSTALL/grub/arm64-efi/terminal.lst index 6743731b..b2cfb3ff 100644 Binary files a/INSTALL/grub/arm64-efi/terminal.lst and b/INSTALL/grub/arm64-efi/terminal.lst differ diff --git a/INSTALL/grub/arm64-efi/test_blockarg.mod b/INSTALL/grub/arm64-efi/test_blockarg.mod index c5aaaff8..c1c8b21d 100644 Binary files a/INSTALL/grub/arm64-efi/test_blockarg.mod and b/INSTALL/grub/arm64-efi/test_blockarg.mod differ diff --git a/INSTALL/grub/arm64-efi/testload.mod b/INSTALL/grub/arm64-efi/testload.mod index be494eb4..7aa0eaf4 100644 Binary files a/INSTALL/grub/arm64-efi/testload.mod and b/INSTALL/grub/arm64-efi/testload.mod differ diff --git a/INSTALL/grub/arm64-efi/testspeed.mod b/INSTALL/grub/arm64-efi/testspeed.mod index 4206de50..35e64895 100644 Binary files a/INSTALL/grub/arm64-efi/testspeed.mod and b/INSTALL/grub/arm64-efi/testspeed.mod differ diff --git a/INSTALL/grub/arm64-efi/tga.mod b/INSTALL/grub/arm64-efi/tga.mod index b0930b85..8698d99b 100644 Binary files a/INSTALL/grub/arm64-efi/tga.mod and b/INSTALL/grub/arm64-efi/tga.mod differ diff --git a/INSTALL/grub/arm64-efi/time.mod b/INSTALL/grub/arm64-efi/time.mod index ecf0c3d9..0bcbc037 100644 Binary files a/INSTALL/grub/arm64-efi/time.mod and b/INSTALL/grub/arm64-efi/time.mod differ diff --git a/INSTALL/grub/arm64-efi/tr.mod b/INSTALL/grub/arm64-efi/tr.mod index e13edc9f..e39da7c5 100644 Binary files a/INSTALL/grub/arm64-efi/tr.mod and b/INSTALL/grub/arm64-efi/tr.mod differ diff --git a/INSTALL/grub/arm64-efi/ufs1.mod b/INSTALL/grub/arm64-efi/ufs1.mod index 98104e66..54480205 100644 Binary files a/INSTALL/grub/arm64-efi/ufs1.mod and b/INSTALL/grub/arm64-efi/ufs1.mod differ diff --git a/INSTALL/grub/arm64-efi/ufs1_be.mod b/INSTALL/grub/arm64-efi/ufs1_be.mod index 0e3c0e4e..68c17887 100644 Binary files a/INSTALL/grub/arm64-efi/ufs1_be.mod and b/INSTALL/grub/arm64-efi/ufs1_be.mod differ diff --git a/INSTALL/grub/arm64-efi/ufs2.mod b/INSTALL/grub/arm64-efi/ufs2.mod index df0db5ff..c65ea874 100644 Binary files a/INSTALL/grub/arm64-efi/ufs2.mod and b/INSTALL/grub/arm64-efi/ufs2.mod differ diff --git a/INSTALL/grub/arm64-efi/verifiers.mod b/INSTALL/grub/arm64-efi/verifiers.mod index a2f6231b..0b389c4a 100644 Binary files a/INSTALL/grub/arm64-efi/verifiers.mod and b/INSTALL/grub/arm64-efi/verifiers.mod differ diff --git a/INSTALL/grub/arm64-efi/video.lst b/INSTALL/grub/arm64-efi/video.lst index 9f0892c6..ad1dbd09 100644 Binary files a/INSTALL/grub/arm64-efi/video.lst and b/INSTALL/grub/arm64-efi/video.lst differ diff --git a/INSTALL/grub/arm64-efi/videoinfo.mod b/INSTALL/grub/arm64-efi/videoinfo.mod index 7d6bcd57..f3f88b06 100644 Binary files a/INSTALL/grub/arm64-efi/videoinfo.mod and b/INSTALL/grub/arm64-efi/videoinfo.mod differ diff --git a/INSTALL/grub/arm64-efi/videotest.mod b/INSTALL/grub/arm64-efi/videotest.mod index a742213b..f8383a06 100644 Binary files a/INSTALL/grub/arm64-efi/videotest.mod and b/INSTALL/grub/arm64-efi/videotest.mod differ diff --git a/INSTALL/grub/arm64-efi/videotest_checksum.mod b/INSTALL/grub/arm64-efi/videotest_checksum.mod index 9eccebb9..bb4a3254 100644 Binary files a/INSTALL/grub/arm64-efi/videotest_checksum.mod and b/INSTALL/grub/arm64-efi/videotest_checksum.mod differ diff --git a/INSTALL/grub/arm64-efi/xen_boot.mod b/INSTALL/grub/arm64-efi/xen_boot.mod index 117f648e..ae21ef0d 100644 Binary files a/INSTALL/grub/arm64-efi/xen_boot.mod and b/INSTALL/grub/arm64-efi/xen_boot.mod differ diff --git a/INSTALL/grub/arm64-efi/xnu_uuid.mod b/INSTALL/grub/arm64-efi/xnu_uuid.mod index 5ceebfe4..d3f711b3 100644 Binary files a/INSTALL/grub/arm64-efi/xnu_uuid.mod and b/INSTALL/grub/arm64-efi/xnu_uuid.mod differ diff --git a/INSTALL/grub/arm64-efi/xnu_uuid_test.mod b/INSTALL/grub/arm64-efi/xnu_uuid_test.mod index 95ed9f61..0d84ebd0 100644 Binary files a/INSTALL/grub/arm64-efi/xnu_uuid_test.mod and b/INSTALL/grub/arm64-efi/xnu_uuid_test.mod differ diff --git a/INSTALL/grub/arm64-efi/zfs.mod b/INSTALL/grub/arm64-efi/zfs.mod index 67c4b2de..f83071a8 100644 Binary files a/INSTALL/grub/arm64-efi/zfs.mod and b/INSTALL/grub/arm64-efi/zfs.mod differ diff --git a/INSTALL/grub/arm64-efi/zfscrypt.mod b/INSTALL/grub/arm64-efi/zfscrypt.mod index 8afa990e..59c516ef 100644 Binary files a/INSTALL/grub/arm64-efi/zfscrypt.mod and b/INSTALL/grub/arm64-efi/zfscrypt.mod differ diff --git a/INSTALL/grub/arm64-efi/zfsinfo.mod b/INSTALL/grub/arm64-efi/zfsinfo.mod index 7a7db525..afe286fc 100644 Binary files a/INSTALL/grub/arm64-efi/zfsinfo.mod and b/INSTALL/grub/arm64-efi/zfsinfo.mod differ diff --git a/INSTALL/grub/arm64-efi/zstd.mod b/INSTALL/grub/arm64-efi/zstd.mod index 38314532..aeef1572 100644 Binary files a/INSTALL/grub/arm64-efi/zstd.mod and b/INSTALL/grub/arm64-efi/zstd.mod differ diff --git a/INSTALL/grub/checksum.cfg b/INSTALL/grub/checksum.cfg new file mode 100644 index 00000000..21dd0de0 --- /dev/null +++ b/INSTALL/grub/checksum.cfg @@ -0,0 +1,117 @@ + +if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" ]; then + set default=0 + menuentry "Calculate and check md5sum" --class=checksum_md5 { + md5sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" vtReadChecksum + + if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then + echo -e "\n\nCheck MD5 value with .md5 file. [ OK ]" + else + echo -e "\n\nCheck MD5 value with .md5 file. [ FAIL ]" + echo "The MD5 value in .md5 file is:" + echo "$vtReadChecksum" + fi + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +else + menuentry "Calculate md5sum" --class=checksum_md5 { + md5sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +fi + +if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" ]; then + set default=1 + menuentry "Calculate and check sha1sum" --class=checksum_sha1 { + sha1sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" vtReadChecksum + + if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then + echo -e "\n\nCheck SHA1 value with .sha1 file. [ OK ]" + else + echo -e "\n\nCheck SHA1 value with .sha1 file. [ FAIL ]" + echo "The SHA1 value in .sha1 file is:" + echo "$vtReadChecksum" + fi + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +else + menuentry "Calculate sha1sum" --class=checksum_sha1 { + sha1sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +fi + + + +if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" ]; then + set default=2 + menuentry "Calculate and check sha256sum" --class=checksum_sha256 { + sha256sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" vtReadChecksum + + if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then + echo -e "\n\nCheck SHA256 value with .sha256 file. [ OK ]" + else + echo -e "\n\nCheck SHA256 value with .sha256 file. [ FAIL ]" + echo "The SHA256 value in .sha256 file is:" + echo "$vtReadChecksum" + fi + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +else + menuentry "Calculate sha256sum" --class=checksum_sha256 { + sha256sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +fi + + + +if [ -e "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" ]; then + set default=3 + menuentry "Calculate and check sha512sum" --class=checksum_sha512{ + sha512sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + vt_1st_line "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" vtReadChecksum + + if vt_str_casebegin "$vtReadChecksum" "$VT_LAST_CHECK_SUM"; then + echo -e "\n\nCheck SHA512 value with .sha512 file. [ OK ]" + else + echo -e "\n\nCheck SHA512 value with .sha512 file. [ FAIL ]" + echo "The SHA512 value in .sha512 file is:" + echo "$vtReadChecksum" + fi + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +else + menuentry "Calculate sha512sum" --class=checksum_sha512{ + sha512sum "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" + + echo -e "\n\npress ENTER to exit ..." + read vtInputKey + } +fi + + +menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET { + echo 'Return ...' +} diff --git a/INSTALL/grub/debug.cfg b/INSTALL/grub/debug.cfg index 87d887e8..9ccf3387 100644 --- a/INSTALL/grub/debug.cfg +++ b/INSTALL/grub/debug.cfg @@ -38,8 +38,23 @@ submenu "Screen Display Mode" --class=debug_screen_mode --class=F5tool { } } +if [ $VTOY_THEME_COUNT -gt 1 ]; then + submenu "Theme Select" --class=debug_theme_select --class=F5tool { + vt_select_theme_cfg + } +fi + if [ "$grub_platform" != "pc" ]; then submenu 'Ventoy UEFI Utilities' --class=debug_util --class=F5tool { + menuentry 'Show EFI Drivers' --class=debug_util_efidrv --class=debug_util --class=F5tool { + vt_push_pager + chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=show_efi_drivers + boot + vt_pop_pager + echo -e "\npress ENTER to exit ..." + read vtInputKey + } + menuentry 'Fixup Windows BlinitializeLibrary Failure' --class=debug_util_blinit --class=debug_util --class=F5tool { chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=fix_windows_mmap boot @@ -103,6 +118,15 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json --cla unset pager } + menuentry 'Check menu tip plugin configuration' --class=debug_menutip --class=debug_json --class=F5tool { + set pager=1 + vt_check_plugin_json $vt_plugin_path menu_tip $vtoy_iso_part + + echo -e "\npress ENTER to exit ..." + read vtInputKey + unset pager + } + menuentry 'Check menu class plugin configuration' --class=debug_menuclass --class=debug_json --class=F5tool { set pager=1 vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 6c3c10d4..2d4e1b3e 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -90,6 +90,28 @@ function ventoy_ext_menu { fi } +function ventoy_checksum { + if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}" ]; then + configfile $prefix/checksum.cfg + fi +} + +function ventoy_show_help { + if [ -f $prefix/help.tar.gz ]; then + if [ -z "$vtoy_help_txt_mem_addr" ]; then + vt_load_file_to_mem "auto" $prefix/help.tar.gz vtoy_help_txt_mem + fi + + loopback vt_help_tarfs mem:${vtoy_help_txt_mem_addr}:size:${vtoy_help_txt_mem_size} + if [ -f "(vt_help_tarfs)/help/${VTOY_HELP_TXT_LANGUAGE}.txt" ]; then + cat "(vt_help_tarfs)/help/${VTOY_HELP_TXT_LANGUAGE}.txt" + else + cat "(vt_help_tarfs)/help/en_US.txt" + fi + loopback -d vt_help_tarfs + fi +} + function get_os_type { set vtoy_os=Linux @@ -107,6 +129,9 @@ function get_os_type { elif [ -e (loop)/bin/freebsd-version ]; then set vtoy_os=Unix set vt_unix_type=FreeBSD + elif [ -e (loop)/boot/kernel/geom_ventoy.ko ]; then + set vtoy_os=Unix + set vt_unix_type=FreeBSD elif vt_str_begin "$vt_system_id" "DragonFly"; then set vtoy_os=Unix set vt_unix_type=DragonFly @@ -130,9 +155,20 @@ function get_os_type { function vt_check_compatible_pe { #Check for PE without external tools - if [ -f "$1/HBCD_PE.ini" ]; then + #set compatible if ISO file is less than 80MB + if [ $vt_chosen_size -gt 33554432 -a $vt_chosen_size -le 83886080 ]; then + set ventoy_compatible=YES + fi + + return +} + +function vt_check_compatible_linux { + if vt_str_begin "$vt_volume_id" "embootkit"; then set ventoy_compatible=YES fi + + return } function locate_initrd { @@ -161,7 +197,11 @@ function distro_specify_wim_patch { vt_windows_collect_wim_patch wim /BOOT/H3_7PE.WIM vt_windows_collect_wim_patch wim /BOOT/H3_8PE.WIM vt_windows_collect_wim_patch wim /BOOT/H3_81PE.WIM - fi + elif [ -d (loop)/2k10/winpe ]; then + vt_windows_collect_wim_patch wim /2k10/winpe/w1086pe.wim + vt_windows_collect_wim_patch wim /2k10/winpe/w8x86pe.wim + vt_windows_collect_wim_patch wim /2k10/winpe/w7x86pe.wim + fi } function distro_specify_wim_patch_phase2 { @@ -208,7 +248,8 @@ function distro_specify_initrd_file { vt_linux_specify_initrd_file /boot/initramfs-x86_64.img elif [ -f (loop)/boot/isolinux/initramfs_data64.cpio.gz ]; then vt_linux_specify_initrd_file /boot/isolinux/initramfs_data64.cpio.gz - + elif [ -f (loop)/boot/initrd.img ]; then + vt_linux_specify_initrd_file /boot/initrd.img fi @@ -313,6 +354,10 @@ function distro_specify_initrd_file_phase2 { vt_linux_specify_initrd_file /360Disk/initrd.gz elif [ -f (loop)/porteus/initrd.xz ]; then vt_linux_specify_initrd_file /porteus/initrd.xz + elif [ -f (loop)/pyabr/boot/initrfs.img ]; then + vt_linux_specify_initrd_file /pyabr/boot/initrfs.img + elif [ -f (loop)/initrd0.img ]; then + vt_linux_specify_initrd_file /initrd0.img fi } @@ -374,6 +419,11 @@ function ventoy_freebsd_proc { set vtFreeBsdDistro=FreeBSD set vt_freebsd_ver=xx + if [ -e (loop)/boot/kernel/geom_ventoy.ko ]; then + vt_unix_ko_fillmap /boot/kernel/geom_ventoy.ko + return + fi + if vt_strstr "$vt_volume_id" "GHOSTBSD"; then ventoy_get_ghostbsd_ver "$1" "${chosen_path}" elif vt_strstr "$vt_volume_id" "FREENAS"; then @@ -550,6 +600,22 @@ function uefi_windows_menu_func { fi } +function uefi_find_replace_initrd { + if vt_get_efi_vdisk_offset "${1}${2}" vt_efivdisk_offset; then + loopback -s $vt_efivdisk_offset vtefivdisk "${1}${2}" + + unset vt_rp_initrd + vt_search_replace_initrd (vtefivdisk) vt_rp_initrd + + if [ -n "$vt_rp_initrd" ]; then + vt_add_replace_file $3 "$vt_rp_initrd" + fi + + loopback -d vtefivdisk + ventoy_debug_pause + fi +} + function uefi_linux_menu_func { if [ "$ventoy_compatible" = "NO" ]; then @@ -631,6 +697,11 @@ function uefi_linux_menu_func { elif [ -f (loop)/loader/entries/pisi-efi-x86_64.conf ]; then vt_add_replace_file $vtindex "EFI\\pisi\\initrd.img" fi + + vt_get_replace_file_cnt vt_replace_cnt + if [ $vt_replace_cnt -eq 0 ]; then + uefi_find_replace_initrd "$1" "$2" $vtindex + fi elif [ -d (loop)/EFI/boot/entries ]; then if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img" @@ -648,7 +719,9 @@ function uefi_linux_menu_func { elif [ -e (loop)/syslinux/alt0/full.cz ]; then vt_add_replace_file 0 "EFI\\BOOT\\full.cz" set FirstTryBootFile='@EFI@BOOT@grubx64.efi' - + + elif vt_str_begin "$vt_volume_id" "SolusLive"; then + vt_add_replace_file 0 "initrd" fi @@ -733,6 +806,8 @@ function ventoy_reset_nojoliet { else vt_iso9660_nojoliet 0 fi + + vt_append_extra_sector 0 } function uefi_iso_menu_func { @@ -759,6 +834,12 @@ function uefi_iso_menu_func { else set ventoy_fs_probe=iso9660 ventoy_reset_nojoliet + + # Lenovo EasyStartup need an addional sector for boundary check + if vt_str_begin "$vt_volume_id" "EasyStartup"; then + vt_skip_svd "${vtoy_iso_part}${vt_chosen_path}" + vt_append_extra_sector 1 + fi fi loopback loop "${1}${chosen_path}" @@ -793,6 +874,7 @@ function uefi_iso_menu_func { elif [ "$vtoy_os" = "Unix" ]; then uefi_unix_menu_func "$1" "${chosen_path}" else + vt_check_compatible_linux (loop) uefi_linux_menu_func "$1" "${chosen_path}" fi @@ -902,7 +984,7 @@ function legacy_windows_menu_func { loopback loop "$1$2" fi - for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; do + for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do vt_windows_collect_wim_patch bcd (loop)/$file done @@ -942,7 +1024,14 @@ function legacy_linux_menu_func { set ventoy_fs_probe=iso9660 loopback loop "$1$2" fi - + + + if vt_syslinux_need_nojoliet "$1$2"; then + vt_iso9660_nojoliet 1 + loopback -d loop + loopback loop "$1$2" + fi + vt_load_cpio $vtoy_path "$2" "$1" "busybox=$ventoy_busybox_ver" vt_linux_clear_initrd @@ -1022,7 +1111,7 @@ function legacy_linux_menu_func { ventoy_gui_console else ventoy_acpi_param ${vtoy_chain_mem_addr} 2048 - linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size} + linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size} boot fi else @@ -1089,6 +1178,7 @@ function legacy_iso_menu_func { elif [ "$vtoy_os" = "Unix" ]; then legacy_unix_menu_func "$1" "${chosen_path}" else + vt_check_compatible_linux (loop) legacy_linux_menu_func "$1" "${chosen_path}" fi } @@ -1171,9 +1261,8 @@ function iso_common_menuentry { echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n" echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n" echo -e " æ­¤ISOæ–‡ä»¶çš„å¤§å° \"$vt_chosen_size\" 有问题,请确认文件是å¦æŸå。\n" - echo -e "\n press ENTER to exit (请按 回车 键返回) ..." + echo -e "\n press ENTER to continue (请按 回车 键继续) ..." read vtInputKey - return fi fi @@ -1401,7 +1490,7 @@ function vtoyboot_common_func { ventoy_pause fi fi - + vt_img_sector "${1}" vt_raw_chain_data "${1}" @@ -1455,6 +1544,11 @@ function vtoy_unsupport_menuentry { #============================================================# # +function only_uefi_tip { + echo -e "\n This IMG file is only supported in UEFI mode. \n" + echo -e "\n press ENTER to exit ..." + read vtInputKey +} function ventoy_img_easyos { vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" @@ -1606,6 +1700,23 @@ function ventoy_img_recalbox { vt_unset_boot_opt } +function ventoy_img_esysrescue { + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" + vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + + ventoy_debug_pause + + #boot image file + vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=esysrescue + vt_img_hook_root + + set root=(vtimghd,1) + configfile (vtimghd,1)/boot/grub/grub.cfg + + vt_img_unhook_root + vt_unset_boot_opt +} + function ventoy_img_batocera { vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit @@ -1629,13 +1740,15 @@ function ventoy_img_openwrt { fi vt_fs_enum_1st_dir (vtimghd,2) /lib/modules/ vt_dir_name - + if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko ]; then + set openwrt_plugin_need=0 vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko ]; then vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko fi else + set openwrt_plugin_need=1 if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then ventoy_gui_console echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n" @@ -1659,12 +1772,14 @@ function ventoy_img_openwrt { return fi - vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit - vt_img_extra_initrd_append ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz - + if [ $openwrt_plugin_need -eq 1 ]; then + if [ -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then + vt_img_extra_initrd_append ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz + fi + fi #boot image file vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=openwrt @@ -1694,6 +1809,74 @@ function ventoy_img_tails { vt_unset_boot_opt } +function ventoy_img_fydeos { + if [ "$grub_platform" = "pc" ]; then + only_uefi_tip + return + fi + + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64" + vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + + ventoy_debug_pause + + #boot image file + vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=fydeos + vt_img_hook_root + + set grubdisk=vtimghd + set grubpartA=(vtimghd,3) + set grubpartB=(vtimghd,5) + set linuxpartA=(sda,3) + set linuxpartB=(sda,5) + + set root=(vtimghd,12) + configfile (vtimghd,12)/efi/boot/grub.cfg + + vt_img_unhook_root + vt_unset_boot_opt + + unset grubdisk + unset grubpartA + unset grubpartB + unset linuxpartA + unset linuxpartB +} + +function ventoy_img_cloudready { + if [ "$grub_platform" = "pc" ]; then + only_uefi_tip + return + fi + + vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64" + vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit + + ventoy_debug_pause + + #boot image file + vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=cloudready + vt_img_hook_root + + set grubdisk=vtimghd + set grubpartA=(vtimghd,3) + set grubpartB=(vtimghd,5) + set linuxpartA=(sda,3) + set linuxpartB=(sda,5) + + set root=(vtimghd,12) + configfile (vtimghd,12)/efi/boot/grub.cfg + + vt_img_unhook_root + vt_unset_boot_opt + + unset grubdisk + unset grubpartA + unset grubpartB + unset linuxpartA + unset linuxpartB +} + function ventoy_img_memtest86 { chainloader (vtimghd,1)/efi/boot/BOOTX64.efi boot @@ -1718,6 +1901,7 @@ function legacy_img_memdisk { function img_common_menuentry { set ventoy_compatible=YES set ventoy_busybox_ver=32 + unset LoadIsoEfiDriver vt_chosen_img_path vt_chosen_path vt_chosen_size @@ -1736,10 +1920,6 @@ function img_common_menuentry { fi fi - if [ -d (vtimghd)/ ]; then - loopback -d vtimghd - fi - loopback vtimghd "${vtoy_iso_part}${vt_chosen_path}" vt_img_sector "${vtoy_iso_part}${vt_chosen_path}" @@ -1755,19 +1935,26 @@ function img_common_menuentry { vt_get_fs_label (vtimghd,1) vtImgHd1Label - if [ -d (vtimghd,2)/lib ]; then + + if [ "$vtImgHd1Label" = "STATE" ]; then + vt_get_fs_label (vtimghd,3) vtImgHd3Label + elif [ -d (vtimghd,2)/lib ]; then vt_get_fs_label (vtimghd,2) vtImgHd2Label fi - + if [ -e (vtimghd,1)/etc/hostname ]; then vt_1st_line (vtimghd,1)/etc/hostname vtImgHostname fi - - - if [ -e (vtimghd,1)/easy.sfs ]; then - ventoy_img_easyos - elif [ -e (vtimghd,1)/volumio.initrd ]; then - ventoy_img_volumio + + if vt_str_begin "$vtImgHd3Label" "ROOT-"; then + if [ -f (vtimghd,3)/etc/os-release.d/ID ]; then + vt_1st_line (vtimghd,3)/etc/os-release.d/ID vt_release_line1 + if [ vt_str_begin "$vt_release_line1" "FydeOS" ]; then + ventoy_img_fydeos + fi + elif [ -f (vtimghd,3)/etc/cloudready-release ]; then + ventoy_img_cloudready + fi elif vt_str_begin "$vtImgHd1Label" "LAKKA"; then ventoy_img_openelec lakka elif vt_str_begin "$vtImgHd1Label" "LIBREELEC"; then @@ -1782,6 +1969,12 @@ function img_common_menuentry { ventoy_img_tails elif [ "$vtImgHd2Label" = "RECALBOX" ]; then ventoy_img_recalbox + elif [ "$vtImgHd1Label" = "ESYSRESCUE" ]; then + ventoy_img_esysrescue + elif [ -e (vtimghd,1)/easy.sfs ]; then + ventoy_img_easyos + elif [ -e (vtimghd,1)/volumio.initrd ]; then + ventoy_img_volumio elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then ventoy_img_ubos elif [ -f (vtimghd,2)/etc/openwrt_version ]; then @@ -1791,7 +1984,7 @@ function img_common_menuentry { img_unsupport_tip else ventoy_img_memtest86 - fi + fi else vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}" ventoy_acpi_param ${vtoy_chain_mem_addr} 512 @@ -1804,6 +1997,8 @@ function img_common_menuentry { fi fi + loopback -d vtimghd + set root=$vtback_root vt_pop_last_entry set theme=$vtback_theme @@ -1823,7 +2018,7 @@ function img_unsupport_menuentry { ############################################################# ############################################################# -set VENTOY_VERSION="1.0.46" +set VENTOY_VERSION="1.0.62" #ACPI not compatible with Window7/8, so disable by default set VTOY_PARAM_NO_ACPI=1 @@ -1843,6 +2038,11 @@ set VTOY_F2_CMD="ventoy_power" set VTOY_F4_CMD="ventoy_localboot" set VTOY_F5_CMD="ventoy_diagnosis" set VTOY_F6_CMD="ventoy_ext_menu" +set VTOY_HELP_CMD="ventoy_show_help" +set VTOY_CHKSUM_CMD="ventoy_checksum" +set VTOY_HELP_TXT_LANGUAGE="en_US" +set VTOY_CHKSUM_FILE_PATH="X" + if [ "$grub_platform" = "pc" ]; then set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION BIOS www.ventoy.net" @@ -1892,7 +2092,10 @@ else set vtoydev=$vtoy_dev set vtoy_iso_part=($vtoy_dev,1) set vtoy_efi_part=($vtoy_dev,2) - loadfont unicode + + vt_load_file_to_mem "auto" $prefix/fonts/unicode.pf2 vtoy_font_mem + loadfont mem:${vtoy_font_mem_addr}:size:${vtoy_font_mem_size} + set vt_plugin_path=$vtoy_iso_part fi @@ -1901,9 +2104,11 @@ vt_load_part_table $vtoydev #Load Plugin if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then - clear - vt_load_plugin $vtoy_iso_part - clear + clear + vt_load_plugin $vtoy_iso_part + clear +else + vt_check_json_path_case $vtoy_iso_part fi if [ -n "$VTOY_MENU_TIMEOUT" ]; then @@ -1927,10 +2132,10 @@ fi if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then set VTOY_F3_CMD="vt_dynamic_menu 1 1" - set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Tools F6:ExMenu" + set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Tools F6:ExMenu" else set VTOY_F3_CMD="vt_dynamic_menu 1 0" - set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Tools F6:ExMenu" + set VTOY_HOTKEY_TIP="h:Help F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Tools F6:ExMenu" fi @@ -1970,14 +2175,30 @@ if [ -n "$VTOY_DEFAULT_KBD_LAYOUT" ]; then set_keyboard_layout "$VTOY_DEFAULT_KBD_LAYOUT" fi +if [ -n "$VTOY_PLUGIN_PATH_CASE_MISMATCH" ]; then + clear + echo "$VTOY_PLUGIN_PATH_CASE_MISMATCH" + echo -e "\n\nPath case does not match! ventoy directory and ventoy.json MUST be all lowercase!" + echo -e "\n路径大å°å†™ä¸åŒ¹é…ï¼ventoy 目录和 ventoy.json 文件的å字必须是全部å°å†™ï¼Œè¯·ä¿®æ­£ï¼" + echo -e "\n\npress ENTER to continue (请按回车键继续) ..." + read vtInputKey +fi + if [ -n "$VTOY_PLUGIN_SYNTAX_ERROR" ]; then clear - echo -e "\n Syntax error detected in ventoy.json, please check! \n" - echo -e " ventoy.json 文件中有语法错误,所有é…置都ä¸ä¼šç”Ÿæ•ˆï¼Œè¯·æ£€æŸ¥ï¼\n" + if [ -n "$VTOY_PLUGIN_ENCODE_ERROR" ]; then + echo -e "\n Encoding type for ventoy.json is not supported, please convert to UTF-8.\n" + echo -e " ventoy.json 文件编ç æ ¼å¼ä¸æ”¯æŒï¼Œè¯·è½¬æ¢ä¸º UTF-8 ç¼–ç æ ¼å¼ï¼\n" + else + echo -e "\n Syntax error detected in ventoy.json, please check! \n" + echo -e " ventoy.json 文件中有语法错误,所有é…置都ä¸ä¼šç”Ÿæ•ˆï¼Œè¯·æ£€æŸ¥ï¼\n" + fi + echo -e "\n press ENTER to continue (请按 回车 键继续) ..." - read vtInputKey + read vtInputKey fi + for vtTFile in ventoy.json ventoy_grub.cfg; do if [ -f $vtoy_efi_part/ventoy/$vtTFile ]; then clear @@ -2009,6 +2230,14 @@ export VTOY_ISO_RAW_STR export VTOY_GRUB2_MODE_STR export VTOY_WIMBOOT_MODE_STR export VTOY_ISO_UEFI_DRV_STR +export VTOY_F2_CMD +export VTOY_F4_CMD +export VTOY_F5_CMD +export VTOY_F6_CMD +export VTOY_HELP_CMD +export VTOY_CHKSUM_CMD +export VTOY_HELP_TXT_LANGUAGE +export VTOY_CHKSUM_FILE_PATH #special VTOY_DEFAULT_IMAGE process diff --git a/INSTALL/grub/help/de_DE.txt b/INSTALL/grub/help/de_DE.txt new file mode 100644 index 00000000..a04d1034 --- /dev/null +++ b/INSTALL/grub/help/de_DE.txt @@ -0,0 +1,18 @@ + h - Zeigt dieses Hilfe Menu +F1 - Memdisk Modus (Nur für kleine WinPE/LiveCD ISO/IMG) +F2 - Neustarten/Herunterfahren +F3 - Menu wechsel zwischen Baum <-> Listen Ansicht +F4 - Windows/Linux vom lokalem Datenträger starten +F5 - Dienstprogramme +F6 - Benutzerdefiniertes Grub2-Menü laden +F7 - Wechseln zwischen GUI-Modus <-> TEXT-Modus + +m - Prüfsummencheck Image Dateien (md5/sha1/sha256/sha512) +Ctrl+w - WIMBOOT Modus (Nur für Standard Windows ISO) +Ctrl+r - Grub2 Modus (Nur für einige Linux distros) +Ctrl+i - Kompatibilitäts Modus (Nur für Fehleranalyse) +Ctrl+u - Lade ISO efi Treiber (Nur für Fehleranalyse, darf nicht offiziel benutzt werden) + + + +Drücke ESC für Zurück ...... diff --git a/INSTALL/grub/help/en_US.txt b/INSTALL/grub/help/en_US.txt new file mode 100644 index 00000000..f75c8109 --- /dev/null +++ b/INSTALL/grub/help/en_US.txt @@ -0,0 +1,18 @@ + h - Display this help information +F1 - Memdisk Mode (Only for small WinPE/LiveCD ISO/IMG) +F2 - Reboot/Power off +F3 - Switch menu mode between Treeview <-> ListView +F4 - Boot Windows/Linux in local disk +F5 - Utilities +F6 - Load Custom Grub2 Menu +F7 - Switch between GUI Mode <-> TEXT Mode + +m - Checksum image files (md5/sha1/sha256/sha512) +Ctrl+w - WIMBOOT Mode (Only for standard Windows ISO) +Ctrl+r - Grub2 Mode (Only for some Linux distros) +Ctrl+i - Compatible Mode (Just only for debug) +Ctrl+u - Load ISO efi driver (Just only for debug, can not be used officially) + + + +Press ESC to return ...... diff --git a/INSTALL/grub/help/fr_FR.txt b/INSTALL/grub/help/fr_FR.txt new file mode 100644 index 00000000..ece0d282 --- /dev/null +++ b/INSTALL/grub/help/fr_FR.txt @@ -0,0 +1,16 @@ + h - Afficher cette aide +F1 - Mode Memdisk (Seulement pour WinPE/LiveCD ISO/IMG) +F2 - Redémarrer/arrêter +F3 - Basculer l'affichage 'Vue en arbre' <-> 'Vue en liste' +F4 - Démarrer le système Windows/Linux local +F5 - Utilitaires +F6 - Charger le menu Grub2 personnalisé +F7 - Basculer entre le mode graphique <-> mode texte + +m - Somme de contrôle des images (md5/sha1/sha256/sha512) +Ctrl+w - Mode WIMBOOT (seulement pour les images standards Windows) +Ctrl+r - Mode Grub2 (seulement pour quelques Linux) +Ctrl+i - Mode Compatible (seulement à fins de tests) +Ctrl+u - Load ISO efi driver (Just only for debug, can not be used officially) + +Appuyer sur Echap pour sortir ...... diff --git a/INSTALL/grub/help/hr_HR.txt b/INSTALL/grub/help/hr_HR.txt new file mode 100644 index 00000000..04bd1ada --- /dev/null +++ b/INSTALL/grub/help/hr_HR.txt @@ -0,0 +1,17 @@ + h - Prikazuje ove informacije +F1 - Memdisk naÄin rada (samo za male WinPE/LiveCD imidž fajlove) +F2 - Ponovno pokretanje/iskljuÄivanje +F3 - Mijenja meni izmeÄ‘u TreeView <-> ListView +F4 - Pokreće Windows/Linux na lokalnom disku +F5 - Postavke +F6 - UÄitava prilagoÄ‘en GRUB2 meni +F7 - Mijenja izmeÄ‘u GUI naÄina rada <-> TEXT naÄina rada + +m - Generira kontrolnu sumu odabranog imidž fajla (md5/sha1/sha256/sha512) +Ctrl + w - WIMBOOT naÄin rada (samo za standardne Windows imidž fajlove) +Ctrl + r - GRUB2 naÄin rada (samo za neke Linux distribucije) +Ctrl + i - Kompatibilni naÄin rada (samo za testiranje) +Ctrl + u - Load ISO efi driver (Just only for debug, can not be used officially) + + +Pritisnite ESC za povratak... diff --git a/INSTALL/grub/help/id_ID.txt b/INSTALL/grub/help/id_ID.txt new file mode 100644 index 00000000..879e0e90 --- /dev/null +++ b/INSTALL/grub/help/id_ID.txt @@ -0,0 +1,18 @@ + h - Tampilkan bantuan informasi ini +F1 - Mode Memdisk (Hanya untuk ukuran WinPE/LiveCD ISO/IMG yang kecil) +F2 - Mulai ulang/Matikan +F3 - Beralih mode menu antara Treeview <-> ListView +F4 - Jalankan (boot) Windows/Linux pada disk lokal +F5 - Alat Utilitas +F6 - Memuat ubah suai Grub2 Menu +F7 - Beralih antara mode GUI <-> Mode TEXT + +m - Periksa berkas files (md5/sha1/sha256/sha512) +Ctrl+w - Mode WIMBOOT (Hanya untuk berkas ISO Windows standar) +Ctrl+r - Mode Grub2 (Hanya untuk distro Linux tertentu) +Ctrl+i - Mode Kompatibel/Compatible (Hanya untuk debug saja) +Ctrl+u - Memuat ISO efi driver (Hanya untuk debug saja, tidak dapat dipakai secara umum) + + + +Tekan ESC untuk kembali ...... diff --git a/INSTALL/grub/help/ja_JP.txt b/INSTALL/grub/help/ja_JP.txt new file mode 100644 index 00000000..c7febd52 --- /dev/null +++ b/INSTALL/grub/help/ja_JP.txt @@ -0,0 +1,18 @@ + h - ã“ã®ç”»é¢ã‚’表示ã™ã‚‹ +F1 - 主記憶装置上ã«è¨˜æ†¶åŸŸã‚’作æˆã™ã‚‹ï¼ˆå®¹é‡ã®å°ã•ãªWinPE・LiveCD専用) +F2 - å†èµ·å‹•ãƒ»é›»æºæ–­ +F3 - 表示形å¼ã‚’切り替ãˆã‚‹ï¼ˆä¸€è¦§ ↔ 階層) +F4 - 手元ã®è¨˜æ†¶è£…ç½®ã«ã‚ã‚‹OSã‚’èµ·å‹•ã™ã‚‹ +F5 - 諸機能 +F6 - Grub2ã®æ§‹æˆã‚’読ã¿è¾¼ã‚€ +F7 - æ“作形å¼ã‚’切り替ãˆã‚‹ï¼ˆGUI ↔ CUI) + +m - イメージã®æ¤œæŸ»åˆè¨ˆã‚’計算ã™ã‚‹ (md5/sha1/sha256/sha512) +Ctrl+w - WIMBOOTモード(標準的ãªWindows ISO専用) +Ctrl+r - Grub2モード(一部ã®Linuxディストリビューション専用) +Ctrl+i - 互æ›ãƒ¢ãƒ¼ãƒ‰ï¼ˆé–‹ç™ºç”¨ï¼‰ +Ctrl+u - ISO efiドライãƒãƒ¼ã‚’読ã¿å–る(開発用,éžå…¬å¼ï¼‰ + + + +ã“ã®ç”»é¢ã‚’é–‰ã˜ã‚‹ã«ã¯ESCを押ã—ã¦ãã ã•ã„ diff --git a/INSTALL/grub/help/pt_PT.txt b/INSTALL/grub/help/pt_PT.txt new file mode 100644 index 00000000..ee8f8f9e --- /dev/null +++ b/INSTALL/grub/help/pt_PT.txt @@ -0,0 +1,17 @@ + h - Mostra esta informação de ajuda +F1 - Modo Memdisk (Apenas para pequenos WinPE/LiveCD ISO/IMG) +F2 - Reiniciar/Desligar +F3 - Alternar o modo menu entre Vista de árvore <-> Vista de lista +F4 - Arrancar o Windows/Linux em disco local +F5 - Utilitários +F6 - Carregar menu Grub2 personalizado +F7 - Alternar entre Modo GUI <-> Modo TEXTO + +m - Checksum ficheiros de imagem (md5/sha1/sha256/sha512) +Ctrl+w - Modo WIMBOOT (Apenas para Windows ISO padrão) +Ctrl+r - Modo Grub2 (Apenas para algumas distros Linux) +Ctrl+i - Modo Compatível (Apenas para depuração) +Ctrl+u - Carregar o controlador ISO efi (Apenas para depuração, não pode ser utilizado oficialmente) + + +Prima ESC para voltar ...... diff --git a/INSTALL/grub/help/sr_CY.txt b/INSTALL/grub/help/sr_CY.txt new file mode 100644 index 00000000..b9fde242 --- /dev/null +++ b/INSTALL/grub/help/sr_CY.txt @@ -0,0 +1,17 @@ + h - Приказује ове информације +F1 - Memdisk начин рада (Ñамо за мале WinPE/LiveCD имиџ фајлове) +F2 - Поновно покретање/иÑкључивање +F3 - Мијења мени између TreeView <-> ListView +F4 - Покреће Windows/Linux на локалном диÑку +F5 - ПоÑтавке +F6 - Учитава прилагођен GRUB2 мени +F7 - Мијења између GUI начина рада <-> TEXT начина рада + +m - Генерира контролну Ñуму одабраног имиџ фајла (md5/sha1/sha256/sha512) +Ctrl + w - WIMBOOT начин рада (Ñамо за Ñтандардне Windows имиџ фајлове) +Ctrl + r - GRUB2 начин рада (Ñамо за неке Linux диÑтрибуције) +Ctrl + i - Компатибилни начин рада (Ñамо за теÑтиранје) +Ctrl + u - Load ISO efi driver (Just only for debug, can not be used officially) + + +ПритиÑните ESC за повратак... diff --git a/INSTALL/grub/help/sr_SR.txt b/INSTALL/grub/help/sr_SR.txt new file mode 100644 index 00000000..faf445e0 --- /dev/null +++ b/INSTALL/grub/help/sr_SR.txt @@ -0,0 +1,17 @@ + h - Prikazuje ove informacije +F1 - Memdisk naÄin rada (samo za male WinPE/LiveCD imidž fajlove) +F2 - Ponovno pokretanje/iskljuÄivanje +F3 - Mijenja meni izmeÄ‘u TreeView <-> ListView +F4 - Pokreće Windows/Linux na lokalnom disku +F5 - Postavke +F6 - UÄitava prilagoÄ‘en GRUB2 meni +F7 - Mijenja izmeÄ‘u GUI naÄina rada <-> TEXT naÄina rada + +m - Generira kontrolnu sumu odabranog imidž fajla (md5/sha1/sha256/sha512) +Ctrl + w - WIMBOOT naÄin rada (samo za standardne Windows imidž fajlove) +Ctrl + r - GRUB2 naÄin rada (samo za neke Linux distribucije) +Ctrl + i - Kompatibilni naÄin rada (samo za testiranje) +Ctrl+u - Load ISO efi driver (Just only for debug, can not be used officially) + + +Pritisnite ESC za povratak... diff --git a/INSTALL/grub/help/tr_TR.txt b/INSTALL/grub/help/tr_TR.txt new file mode 100644 index 00000000..d57d709e --- /dev/null +++ b/INSTALL/grub/help/tr_TR.txt @@ -0,0 +1,17 @@ + h - Yardım bilgilerini göster +F1 - Memdisk Modu baÅŸlatır(Yalnızca küçük WinPE/LiveCD ISO/IMG ler için bu modu kullanabilirsiniz) +F2 - Bilgisayarı Yeniden BaÅŸlat/Kapat +F3 - Ventoy Menü modu olarak,Klasör görünümü(Treeview) ile Liste görünümü(ListView) arasında geçiÅŸ yapmayı saÄŸlar. +F4 - Bilgisayarınızda yüklü olan Windows yada Linux iÅŸletim sistemini, sabit diskten baÅŸlatır. +F5 - Ventoy Araçlar menüsü +F6 - ÖzelleÅŸtirilmiÅŸ Grub2 menüsünü yükler +F7 - Grafik Modu(GUI Mode) ile Metin Modu(Text Mode) arasında geçiÅŸ yapmayı saÄŸlar + +m - Ä°ndirilen imaj dosyalarının hatasız indirildiÄŸini teyit etmek için "md5/sha1/sha256/sha512" deÄŸerlerini kontrol etmeyi saÄŸlar +Ctrl+w - WIMBOOT Modu çalıştırmayı saÄŸlar(Sadece normal Windows ISO ları için) +Ctrl+r - Grub2 Modu çalıştırmayı saÄŸlar (Sadece bazı Linux dağıtımları için) +Ctrl+i - Uyumluluk Modu'nu (Compatible Mode) çalıştırmayı saÄŸlar (Sadece hata ayıklama için bu modu kullanabilirsiniz) +Ctrl+u - ISO efi sürücüsünü yükler(Sadece hata ayıklama için bu mod kullanılabilir, resmi olarak kullanılamaz) + + +Geriye dönmek için ESC tuÅŸuna basınız...... diff --git a/INSTALL/grub/help/zh_CN.txt b/INSTALL/grub/help/zh_CN.txt new file mode 100644 index 00000000..49a2ec14 --- /dev/null +++ b/INSTALL/grub/help/zh_CN.txt @@ -0,0 +1,17 @@ + h - æ˜¾ç¤ºæœ¬å¸®åŠ©ä¿¡æ¯ +F1 - 把文件加载到内存å¯åŠ¨ï¼ˆåªé€‚用于文件很å°çš„ WinPE/LiveCD等) +F2 - 电æºæ“作 (é‡å¯ã€å…³æœºï¼‰ +F3 - èœå•æ˜¾ç¤ºæ¨¡å¼åˆ‡æ¢ã€‚å¯åœ¨åˆ—表模å¼å’Œç›®å½•æ¨¡å¼ä¹‹é—´è‡ªç”±åˆ‡æ¢ã€‚ +F4 - å¯åŠ¨æœ¬åœ°ç¡¬ç›˜ä¸Šçš„ Windows/Linux 等系统。 +F5 - å„类工具 +F6 - 加载自定义 GRUB2 èœå•ã€‚ +F7 - ç•Œé¢åœ¨æ–‡æœ¬æ¨¡å¼å’Œå›¾å½¢æ¨¡å¼ä¹‹é—´åˆ‡æ¢ã€‚ + +m - 计算文件校验值(md5/sha1/sha256/sha512) +Ctrl+w - WIMBOOT æ¨¡å¼ ï¼ˆåªé€‚用于标准的 Windows ISO文件) +Ctrl+r - Grub2 æ¨¡å¼ ï¼ˆåªé€‚用于常è§çš„一些 Linux 系统ISO文件) +Ctrl+i - å…¼å®¹æ¨¡å¼ ï¼ˆåªç”¨ä½œè°ƒè¯•ç›®çš„,ä¸èƒ½æ­£å¼ä½¿ç”¨ï¼‰ +Ctrl+u - 加载 ISO efi 驱动(åªç”¨ä½œè°ƒè¯•ç›®çš„,ä¸èƒ½æ­£å¼ä½¿ç”¨ï¼‰ + + +按 ESC 键返回 ...... diff --git a/INSTALL/grub/i386-efi/moddep.lst b/INSTALL/grub/i386-efi/moddep.lst index 970ddfd3..479d6bd5 100644 --- a/INSTALL/grub/i386-efi/moddep.lst +++ b/INSTALL/grub/i386-efi/moddep.lst @@ -26,7 +26,7 @@ sfs: fshelp reiserfs: fshelp part_sunpc: zstd: -gfxmenu: trig video_colors bitmap_scale gfxterm font normal bitmap video +gfxmenu: trig video_colors gfxterm bitmap_scale font normal video bitmap backtrace: jfs: help: extcmd normal diff --git a/INSTALL/grub/i386-efi/normal.mod b/INSTALL/grub/i386-efi/normal.mod index 1562ae8b..fe35b9c6 100644 Binary files a/INSTALL/grub/i386-efi/normal.mod and b/INSTALL/grub/i386-efi/normal.mod differ diff --git a/INSTALL/grub/i386-efi/part_amiga.mod b/INSTALL/grub/i386-efi/part_amiga.mod index eb4307c3..b4e502f4 100644 Binary files a/INSTALL/grub/i386-efi/part_amiga.mod and b/INSTALL/grub/i386-efi/part_amiga.mod differ diff --git a/INSTALL/grub/i386-efi/part_bsd.mod b/INSTALL/grub/i386-efi/part_bsd.mod index 0b5baf28..e4b45719 100644 Binary files a/INSTALL/grub/i386-efi/part_bsd.mod and b/INSTALL/grub/i386-efi/part_bsd.mod differ diff --git a/INSTALL/grub/i386-efi/part_dfly.mod b/INSTALL/grub/i386-efi/part_dfly.mod index 6bfe671a..bc4c9d9c 100644 Binary files a/INSTALL/grub/i386-efi/part_dfly.mod and b/INSTALL/grub/i386-efi/part_dfly.mod differ diff --git a/INSTALL/grub/i386-efi/part_dvh.mod b/INSTALL/grub/i386-efi/part_dvh.mod index 7f1e4389..c08b518c 100644 Binary files a/INSTALL/grub/i386-efi/part_dvh.mod and b/INSTALL/grub/i386-efi/part_dvh.mod differ diff --git a/INSTALL/grub/i386-efi/part_plan.mod b/INSTALL/grub/i386-efi/part_plan.mod index 95677425..e0763fcb 100644 Binary files a/INSTALL/grub/i386-efi/part_plan.mod and b/INSTALL/grub/i386-efi/part_plan.mod differ diff --git a/INSTALL/grub/i386-efi/part_sun.mod b/INSTALL/grub/i386-efi/part_sun.mod index 0dbb445d..54a8d502 100644 Binary files a/INSTALL/grub/i386-efi/part_sun.mod and b/INSTALL/grub/i386-efi/part_sun.mod differ diff --git a/INSTALL/grub/i386-efi/part_sunpc.mod b/INSTALL/grub/i386-efi/part_sunpc.mod index ec073466..09d5c60f 100644 Binary files a/INSTALL/grub/i386-efi/part_sunpc.mod and b/INSTALL/grub/i386-efi/part_sunpc.mod differ diff --git a/INSTALL/grub/i386-pc/core.img b/INSTALL/grub/i386-pc/core.img index 727246ff..2dabb509 100644 Binary files a/INSTALL/grub/i386-pc/core.img and b/INSTALL/grub/i386-pc/core.img differ diff --git a/INSTALL/grub/i386-pc/moddep.lst b/INSTALL/grub/i386-pc/moddep.lst index ce643787..df8a1864 100644 --- a/INSTALL/grub/i386-pc/moddep.lst +++ b/INSTALL/grub/i386-pc/moddep.lst @@ -26,7 +26,7 @@ sfs: fshelp reiserfs: fshelp part_sunpc: zstd: -gfxmenu: trig video_colors bitmap_scale gfxterm font normal bitmap video +gfxmenu: trig video_colors gfxterm bitmap_scale font normal video bitmap backtrace: jfs: help: extcmd normal @@ -123,7 +123,7 @@ crypto: part_bsd: part_msdos cs5536: pci biosdisk: -ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf datetime div extcmd normal video gcry_sha1 iso9660 acpi +ventoy: elf fshelp ext2 btrfs font crypto gcry_md5 exfat udf extcmd datetime div normal video gcry_sha1 iso9660 acpi lsapm: gcry_sha512: crypto password: crypto normal diff --git a/INSTALL/grub/i386-pc/part_amiga.mod b/INSTALL/grub/i386-pc/part_amiga.mod index a8411865..e56fd4aa 100644 Binary files a/INSTALL/grub/i386-pc/part_amiga.mod and b/INSTALL/grub/i386-pc/part_amiga.mod differ diff --git a/INSTALL/grub/i386-pc/part_apple.mod b/INSTALL/grub/i386-pc/part_apple.mod index a30a0a09..62400e3c 100644 Binary files a/INSTALL/grub/i386-pc/part_apple.mod and b/INSTALL/grub/i386-pc/part_apple.mod differ diff --git a/INSTALL/grub/i386-pc/part_bsd.mod b/INSTALL/grub/i386-pc/part_bsd.mod index 9c660b8f..37151c3f 100644 Binary files a/INSTALL/grub/i386-pc/part_bsd.mod and b/INSTALL/grub/i386-pc/part_bsd.mod differ diff --git a/INSTALL/grub/i386-pc/part_dfly.mod b/INSTALL/grub/i386-pc/part_dfly.mod index d59ec333..cead2651 100644 Binary files a/INSTALL/grub/i386-pc/part_dfly.mod and b/INSTALL/grub/i386-pc/part_dfly.mod differ diff --git a/INSTALL/grub/i386-pc/part_dvh.mod b/INSTALL/grub/i386-pc/part_dvh.mod index 21b6fec9..c812065f 100644 Binary files a/INSTALL/grub/i386-pc/part_dvh.mod and b/INSTALL/grub/i386-pc/part_dvh.mod differ diff --git a/INSTALL/grub/i386-pc/part_plan.mod b/INSTALL/grub/i386-pc/part_plan.mod index d074510b..7f448fdc 100644 Binary files a/INSTALL/grub/i386-pc/part_plan.mod and b/INSTALL/grub/i386-pc/part_plan.mod differ diff --git a/INSTALL/grub/i386-pc/part_sun.mod b/INSTALL/grub/i386-pc/part_sun.mod index 81edb5e0..7e9abf53 100644 Binary files a/INSTALL/grub/i386-pc/part_sun.mod and b/INSTALL/grub/i386-pc/part_sun.mod differ diff --git a/INSTALL/grub/i386-pc/part_sunpc.mod b/INSTALL/grub/i386-pc/part_sunpc.mod index 5c649b65..a9246af3 100644 Binary files a/INSTALL/grub/i386-pc/part_sunpc.mod and b/INSTALL/grub/i386-pc/part_sunpc.mod differ diff --git a/INSTALL/grub/localboot.cfg b/INSTALL/grub/localboot.cfg index 7abd3fec..9366b68c 100644 --- a/INSTALL/grub/localboot.cfg +++ b/INSTALL/grub/localboot.cfg @@ -76,6 +76,11 @@ else terminal_output console chainloader /EFI/Microsoft/Boot/bootmgfw.efi boot + elif [ -f ($vtoydev,$partid)/efi/Microsoft/Boot/bootmgfw.efi ]; then + set root=($vtoydev,$partid) + terminal_output console + chainloader /efi/Microsoft/Boot/bootmgfw.efi + boot fi else break @@ -87,6 +92,10 @@ else terminal_output console chainloader /EFI/Microsoft/Boot/bootmgfw.efi boot + elif search -n -s -f /efi/Microsoft/Boot/bootmgfw.efi; then + terminal_output console + chainloader /efi/Microsoft/Boot/bootmgfw.efi + boot else echo "Windows NOT found ..." fi @@ -105,6 +114,23 @@ else echo "BOOTIA32.EFI NOT found ..." fi } + + menuentry 'Search and boot xorboot' --class=boot_xorboot --class=F4boot { + set VTOY_SEARCH_NO_VTOYEFI=1 + if search -n -s -f /efi/xorboot/xorboot32.xor; then + unset VTOY_SEARCH_NO_VTOYEFI + terminal_output console + if [ -f /efi/xorboot/bootia32.efi ]; then + chainloader /efi/xorboot/bootia32.efi + elif [ -f /efi/xorboot/xorboot.efi ]; then + chainloader /efi/xorboot/xorboot.efi + fi + boot + else + unset VTOY_SEARCH_NO_VTOYEFI + echo "xorboot NOT found ..." + fi + } elif [ "$grub_cpu" = "arm64" ]; then menuentry 'Search and boot BOOTAA64.EFI' --class=boot_uefi --class=F4boot { set VTOY_SEARCH_NO_VTOYEFI=1 @@ -131,9 +157,25 @@ else echo "BOOTX64.EFI NOT found ..." fi } + + menuentry 'Search and boot xorboot' --class=boot_xorboot --class=F4boot { + set VTOY_SEARCH_NO_VTOYEFI=1 + if search -n -s -f /efi/xorboot/xorboot.xor; then + unset VTOY_SEARCH_NO_VTOYEFI + terminal_output console + if [ -f /efi/xorboot/bootx64.efi ]; then + chainloader /efi/xorboot/bootx64.efi + elif [ -f /efi/xorboot/xorboot.efi ]; then + chainloader /efi/xorboot/xorboot.efi + fi + boot + else + unset VTOY_SEARCH_NO_VTOYEFI + echo "xorboot NOT found ..." + fi + } fi - fi diff --git a/INSTALL/grub/mips64el-efi/moddep.lst b/INSTALL/grub/mips64el-efi/moddep.lst index 916d5bd4..b16abbf1 100644 Binary files a/INSTALL/grub/mips64el-efi/moddep.lst and b/INSTALL/grub/mips64el-efi/moddep.lst differ diff --git a/INSTALL/grub/mips64el-efi/normal.mod b/INSTALL/grub/mips64el-efi/normal.mod index 8723f43b..8236497c 100644 Binary files a/INSTALL/grub/mips64el-efi/normal.mod and b/INSTALL/grub/mips64el-efi/normal.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_amiga.mod b/INSTALL/grub/mips64el-efi/part_amiga.mod index af48dcfa..a705f8dd 100644 Binary files a/INSTALL/grub/mips64el-efi/part_amiga.mod and b/INSTALL/grub/mips64el-efi/part_amiga.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_bsd.mod b/INSTALL/grub/mips64el-efi/part_bsd.mod index c3c8d787..e4523e7a 100644 Binary files a/INSTALL/grub/mips64el-efi/part_bsd.mod and b/INSTALL/grub/mips64el-efi/part_bsd.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_dfly.mod b/INSTALL/grub/mips64el-efi/part_dfly.mod index 25f78f25..6b6dde08 100644 Binary files a/INSTALL/grub/mips64el-efi/part_dfly.mod and b/INSTALL/grub/mips64el-efi/part_dfly.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_dvh.mod b/INSTALL/grub/mips64el-efi/part_dvh.mod index 40974fa5..a3582cce 100644 Binary files a/INSTALL/grub/mips64el-efi/part_dvh.mod and b/INSTALL/grub/mips64el-efi/part_dvh.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_plan.mod b/INSTALL/grub/mips64el-efi/part_plan.mod index 4836bbcd..e7b9cc2b 100644 Binary files a/INSTALL/grub/mips64el-efi/part_plan.mod and b/INSTALL/grub/mips64el-efi/part_plan.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_sun.mod b/INSTALL/grub/mips64el-efi/part_sun.mod index a08f049c..4dcb3af2 100644 Binary files a/INSTALL/grub/mips64el-efi/part_sun.mod and b/INSTALL/grub/mips64el-efi/part_sun.mod differ diff --git a/INSTALL/grub/mips64el-efi/part_sunpc.mod b/INSTALL/grub/mips64el-efi/part_sunpc.mod index 74774174..7aea6492 100644 Binary files a/INSTALL/grub/mips64el-efi/part_sunpc.mod and b/INSTALL/grub/mips64el-efi/part_sunpc.mod differ diff --git a/INSTALL/grub/themes/ventoy/theme.txt b/INSTALL/grub/themes/ventoy/theme.txt index f8815065..88e8a21f 100644 --- a/INSTALL/grub/themes/ventoy/theme.txt +++ b/INSTALL/grub/themes/ventoy/theme.txt @@ -30,13 +30,15 @@ terminal-box: "terminal_box_*.png" scrollbar_thumb = "slider_*.png" } + + + progress_bar { id = "__timeout__" text = "@TIMEOUT_NOTIFICATION_SHORT@" - left = 20% - width = 60% - top = 85% + left = 90% + width = 10% + top = 90% text_color = "red" bar_style = "*" @@ -44,7 +46,7 @@ terminal-box: "terminal_box_*.png" } + hbox{ - left = 30% + left = 28% top = 95% width = 10% height = 25 @@ -93,4 +95,3 @@ terminal-box: "terminal_box_*.png" height = 25 + label {text = "@VTOY_ISO_UEFI_DRV@" color = "red" align = "left"} } - diff --git a/INSTALL/grub/x86_64-efi/moddep.lst b/INSTALL/grub/x86_64-efi/moddep.lst index 2f7f9af5..57059958 100644 --- a/INSTALL/grub/x86_64-efi/moddep.lst +++ b/INSTALL/grub/x86_64-efi/moddep.lst @@ -26,7 +26,7 @@ sfs: fshelp reiserfs: fshelp part_sunpc: zstd: -gfxmenu: trig video_colors bitmap_scale gfxterm font normal bitmap video +gfxmenu: trig video_colors gfxterm bitmap_scale font normal video bitmap backtrace: jfs: help: extcmd normal diff --git a/INSTALL/grub/x86_64-efi/normal.mod b/INSTALL/grub/x86_64-efi/normal.mod index 76065454..92839027 100644 Binary files a/INSTALL/grub/x86_64-efi/normal.mod and b/INSTALL/grub/x86_64-efi/normal.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_amiga.mod b/INSTALL/grub/x86_64-efi/part_amiga.mod index b16590fe..5bf5667e 100644 Binary files a/INSTALL/grub/x86_64-efi/part_amiga.mod and b/INSTALL/grub/x86_64-efi/part_amiga.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_bsd.mod b/INSTALL/grub/x86_64-efi/part_bsd.mod index d4bf05e2..9123c905 100644 Binary files a/INSTALL/grub/x86_64-efi/part_bsd.mod and b/INSTALL/grub/x86_64-efi/part_bsd.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_dfly.mod b/INSTALL/grub/x86_64-efi/part_dfly.mod index d7b1d8e4..cf7c46ef 100644 Binary files a/INSTALL/grub/x86_64-efi/part_dfly.mod and b/INSTALL/grub/x86_64-efi/part_dfly.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_dvh.mod b/INSTALL/grub/x86_64-efi/part_dvh.mod index 509c3a6e..37acae5d 100644 Binary files a/INSTALL/grub/x86_64-efi/part_dvh.mod and b/INSTALL/grub/x86_64-efi/part_dvh.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_plan.mod b/INSTALL/grub/x86_64-efi/part_plan.mod index 826f54dc..8825a81c 100644 Binary files a/INSTALL/grub/x86_64-efi/part_plan.mod and b/INSTALL/grub/x86_64-efi/part_plan.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_sun.mod b/INSTALL/grub/x86_64-efi/part_sun.mod index d054e878..3fd865f0 100644 Binary files a/INSTALL/grub/x86_64-efi/part_sun.mod and b/INSTALL/grub/x86_64-efi/part_sun.mod differ diff --git a/INSTALL/grub/x86_64-efi/part_sunpc.mod b/INSTALL/grub/x86_64-efi/part_sunpc.mod index b17db009..576a0fe7 100644 Binary files a/INSTALL/grub/x86_64-efi/part_sunpc.mod and b/INSTALL/grub/x86_64-efi/part_sunpc.mod differ diff --git a/INSTALL/tool/VentoyGTK.glade b/INSTALL/tool/VentoyGTK.glade new file mode 100644 index 00000000..d362a81c --- /dev/null +++ b/INSTALL/tool/VentoyGTK.glade @@ -0,0 +1,585 @@ + + + + + True + False + + + + False + False + Partition Configuration + True + center + 460 + 270 + + + True + False + + + 440 + 50 + True + False + 0 + + + True + False + + + 380 + True + True + + + 10 + 10 + + + + + + + 10 + 10 + + + + + + 220 + 60 + True + False + 0 + + + True + False + + + 200 + True + True + * + False + False + True + True + 10 + + + 10 + 10 + + + + + + + 10 + 60 + + + + + + 220 + 60 + True + False + 0 + + + True + False + + + 200 + True + False + 1 + + MB + GB + + + + 10 + 10 + + + + + + + 230 + 60 + + + + + + 440 + 50 + True + False + 0 + + + True + False + + + 380 + True + True + True + + + 10 + 10 + + + + + + + 10 + 140 + + + + + + OK + 100 + 40 + True + True + True + + + 90 + 210 + + + + + Cancel + 100 + 40 + True + True + True + True + + + 270 + 210 + + + + + + 460 + 25 + True + False + 0 + + + 10 + 250 + + + + + + + + + False + False + Ventoy2Disk + False + center + 480 + 365 + + + True + False + + + 480 + 22 + True + False + + + True + False + Options + True + + + True + False + + + Secure Boot Support + True + False + True + False + + + + + True + False + Partition Style + True + + + True + False + + + MBR + True + False + True + True + + + + + GPT + True + False + True + False + + + + + + + + + Partition Configuration + True + False + True + + + + + Clear Ventoy + True + False + True + + + + + Show All Devices + True + False + True + False + + + + + + + + + + True + False + Language + True + + + True + False + + + + + + + + + 460 + 75 + True + False + 0 + + + True + False + + + 380 + True + False + + + 10 + 5 + + + + + 50 + True + True + True + True + image_refresh + + + 398 + 0 + + + + + + + True + False + Device + + + + + 10 + 40 + + + + + 228 + 70 + True + False + 0.5 + + + True + False + + + 10 + 40 + False + False + + + 20 + 2 + + + + + 120 + 40 + True + False + + True + + + 45 + + + + + 45 + 20 + True + False + MBR + + + 180 + 30 + + + + + + + True + False + Ventoy In Package + True + + + + + 10 + 132 + + + + + 228 + 70 + True + False + 0.5 + + + True + False + + + 10 + 40 + True + False + + + 20 + 2 + + + + + 120 + 40 + True + False + + True + + + 45 + + + + + 45 + 20 + True + False + + + + 180 + 30 + + + + + + + True + False + Ventoy In Device + True + + + + + 243 + 132 + + + + + 460 + 50 + True + False + 0 + + + True + False + + + 440 + True + False + 0.0 + + + 8 + 10 + + + + + + + True + False + Status - READY + + + + + 10 + 215 + + + + + Install + 100 + 40 + True + True + True + + + 100 + 300 + + + + + Update + 100 + 40 + True + True + True + + + 280 + 300 + + + + + + 460 + 25 + True + False + 0 + + + 10 + 345 + + + + + + + \ No newline at end of file diff --git a/INSTALL/tool/VentoyWorker.sh b/INSTALL/tool/VentoyWorker.sh index 543ac697..22c3de05 100644 --- a/INSTALL/tool/VentoyWorker.sh +++ b/INSTALL/tool/VentoyWorker.sh @@ -16,6 +16,7 @@ print_usage() { echo ' -s/-S enable/disable secure boot support (default is disabled)' echo ' -g use GPT partition style, default is MBR (only for install)' echo ' -L Label of the 1st exfat partition (default is Ventoy)' + echo ' -n try non-destructive installation (only for install)' echo '' } @@ -28,6 +29,8 @@ while [ -n "$1" ]; do elif [ "$1" = "-I" ]; then MODE="install" FORCE="Y" + elif [ "$1" = "-n" ]; then + NONDESTRUCTIVE="Y" elif [ "$1" = "-u" ]; then MODE="update" elif [ "$1" = "-l" ]; then @@ -162,7 +165,7 @@ if [ -d ./tmp_mnt ]; then fi -if [ "$MODE" = "install" ]; then +if [ "$MODE" = "install" -a -z "$NONDESTRUCTIVE" ]; then vtdebug "install Ventoy ..." if [ -n "$VTGPT" ]; then @@ -255,7 +258,10 @@ if [ "$MODE" = "install" ]; then exit 1 fi - if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then + # check and umount + check_umount_disk "$DISK" + + if ! dd if=/dev/zero of=$DISK bs=64 count=512 status=none conv=fsync; then vterr "Write data to $DISK failed, please check whether it's in use." exit 1 fi @@ -281,10 +287,14 @@ if [ "$MODE" = "install" ]; then PART1=$(get_disk_part_name $DISK 1) PART2=$(get_disk_part_name $DISK 2) + #clean part2 + dd status=none conv=fsync if=/dev/zero of=$DISK bs=512 count=32 seek=$part2_start_sector + + #format part1 + vtinfo "Format partition 1 ..." mkexfatfs -n "$VTNEW_LABEL" -s $cluster_sectors ${PART1} - vtinfo "writing data to disk ..." - + vtinfo "writing data to disk ..." dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446 if [ -n "$VTGPT" ]; then @@ -314,51 +324,181 @@ if [ "$MODE" = "install" ]; then sync vtinfo "esp partition processing ..." - - sleep 1 - check_umount_disk "$DISK" - - if [ "$SECUREBOOT" != "YES" ]; then - mkdir ./tmp_mnt - - vtdebug "mounting part2 ...." - for tt in 1 2 3 4 5; do - if mount ${PART2} ./tmp_mnt > /dev/null 2>&1; then - vtdebug "mounting part2 success" - break - fi - - check_umount_disk "$DISK" - sleep 2 - done - - rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI - rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi - rm -f ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI - rm -f ./tmp_mnt/EFI/BOOT/grubia32.efi - rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi - rm -f ./tmp_mnt/EFI/BOOT/mmia32.efi - rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer - mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI - mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI - - sync - - for tt in 1 2 3; do - if umount ./tmp_mnt; then - vtdebug "umount part2 success" - rm -rf ./tmp_mnt - break - else - vtdebug "umount part2 failed, now retry..." - sleep 1 - fi - done + if [ "$SECUREBOOT" != "YES" ]; then + sleep 2 + check_umount_disk "$DISK" + vtoycli partresize -s $DISK $part2_start_sector fi echo "" vtinfo "Install Ventoy to $DISK successfully finished." echo "" + +elif [ "$MODE" = "install" -a -n "$NONDESTRUCTIVE" ]; then + vtdebug "non-destructive install Ventoy ..." + + version=$(get_disk_ventoy_version $DISK) + if [ $? -eq 0 ]; then + if [ -z "$FORCE" ]; then + vtwarn "$DISK already contains a Ventoy with version $version." + vtwarn "You can not do and don not need non-destructive installation." + vtwarn "" + exit 1 + fi + fi + + disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size) + disk_size_gb=$(expr $disk_sector_num / 2097152) + + if vtoycli partresize -t $DISK; then + OldStyle="GPT" + else + OldStyle="MBR" + fi + + #Print disk info + echo "Disk : $DISK" + parted -s $DISK p 2>&1 | grep Model + echo "Size : $disk_size_gb GB" + echo "Style: $OldStyle" + echo '' + + vtwarn "Attention:" + vtwarn "Ventoy will try non-destructive installation on $DISK if possible." + echo "" + + read -p 'Continue? (y/n) ' Answer + if [ "$Answer" != "y" ]; then + if [ "$Answer" != "Y" ]; then + exit 0 + fi + fi + + if [ $disk_sector_num -le $VENTOY_SECTOR_NUM ]; then + vterr "No enough space in disk $DISK" + exit 1 + fi + + PART1=$(get_disk_part_name $DISK 1) + PART2=$(get_disk_part_name $DISK 2) + + #Part1 size in MB aligned with 4KB + PART1_SECTORS=$(cat /sys/class/block/${PART1#/dev/}/size) + PART1_4K=$(expr $PART1_SECTORS / 8) + PART1_MB=$(expr $PART1_4K / 256) + PART1_NEW_MB=$(expr $PART1_MB - 32) + + echo "$PART1 is ${PART1_MB}MB" + + #check partition layout + echo "check partition layout ..." + vtoycli partresize -c $DISK + vtRet=$? + if [ $vtRet -eq 0 ]; then + exit 1 + else + # check and umount + check_umount_disk "$DISK" + sleep 1 + check_umount_disk "$DISK" + + if [ $vtRet -eq 1 ]; then + echo "Free space enough, start install..." + part2_start_sector=$(expr $PART1_SECTORS + 2048) + elif [ $vtRet -eq 2 ]; then + echo "We need to shrink partition 1 firstly ..." + + PART1_BLKID=$(blkid $PART1) + blkid $PART1 + + if echo $PART1_BLKID | egrep -q -i 'TYPE=ntfs|TYPE=.ntfs'; then + echo "Partition 1 contains NTFS filesystem" + + which ntfsresize + if [ $? -ne 0 ]; then + echo "###[FAIL] ntfsresize not found. Please install ntfs-3g package." + exit 1 + fi + + echo "ntfsfix -b -d $PART1 ..." + ntfsfix -b -d $PART1 + + echo "ntfsresize --size ${PART1_NEW_MB}Mi $PART1 ..." + ntfsresize -f --size ${PART1_NEW_MB}Mi $PART1 + if [ $? -ne 0 ]; then + echo "###[FAIL] ntfsresize failed." + exit 1 + fi + elif echo $PART1_BLKID | egrep -q -i 'TYPE=ext[2-4]|TYPE=.ext[2-4]'; then + echo "Partition 1 contains EXT filesystem" + + which resize2fs + if [ $? -ne 0 ]; then + echo "###[FAIL] resize2fs not found. Please install e2fsprogs package." + exit 1 + fi + + echo "e2fsck -f $PART1 ..." + e2fsck -f $PART1 + + echo "resize2fs $PART1 ${PART1_NEW_MB}M ..." + resize2fs $PART1 ${PART1_NEW_MB}M + if [ $? -ne 0 ]; then + echo "###[FAIL] resize2fs failed." + exit 1 + fi + else + echo "###[FAIL] Unsupported filesystem in partition 1." + exit 1 + fi + + sync + PART1_NEW_END_MB=$(expr $PART1_NEW_MB + 1) + part2_start_sector=$(expr $PART1_NEW_END_MB \* 2048) + fi + fi + + vtinfo "writing data to disk part2_start=$part2_start_sector ..." + + dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440 + + if [ "$OldStyle" = "GPT" ]; then + echo -en '\x22' | dd status=none of=$DISK conv=fsync bs=1 count=1 seek=92 + xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2014 seek=34 + echo -en '\x23' | dd of=$DISK conv=fsync bs=1 count=1 seek=17908 status=none + else + xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1 + fi + + xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector + + #test UUID + testUUIDStr=$(vtoy_gen_uuid | hexdump -C) + vtdebug "test uuid: $testUUIDStr" + + #disk uuid + vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16 + + vtinfo "sync data ..." + sync + + vtinfo "esp partition processing ..." + if [ "$SECUREBOOT" != "YES" ]; then + vtoycli partresize -s $DISK $part2_start_sector + fi + + vtinfo "update partition table $DISK $part2_start_sector ..." + vtoycli partresize -p $DISK $part2_start_sector + if [ $? -eq 0 ]; then + sync + echo "" + vtinfo "Ventoy non-destructive installation on $DISK successfully finished." + echo "" + else + echo "" + vterr "Ventoy non-destructive installation on $DISK failed." + echo "" + fi else vtdebug "update Ventoy ..." @@ -441,47 +581,13 @@ else check_umount_disk "$DISK" xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start - sync + vtinfo "esp partition processing ..." if [ "$SECUREBOOT" != "YES" ]; then - mkdir ./tmp_mnt - - vtdebug "mounting part2 ...." - for tt in 1 2 3 4 5; do - check_umount_disk "$DISK" - - if mount ${PART2} ./tmp_mnt > /dev/null 2>&1; then - vtdebug "mounting part2 success" - break - else - vtdebug "mounting part2 failed, now wait and retry..." - fi - sleep 2 - done - - rm -f ./tmp_mnt/EFI/BOOT/BOOTX64.EFI - rm -f ./tmp_mnt/EFI/BOOT/grubx64.efi - rm -f ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI - rm -f ./tmp_mnt/EFI/BOOT/grubia32.efi - rm -f ./tmp_mnt/EFI/BOOT/MokManager.efi - rm -f ./tmp_mnt/EFI/BOOT/mmia32.efi - rm -f ./tmp_mnt/ENROLL_THIS_KEY_IN_MOKMANAGER.cer - mv ./tmp_mnt/EFI/BOOT/grubx64_real.efi ./tmp_mnt/EFI/BOOT/BOOTX64.EFI - mv ./tmp_mnt/EFI/BOOT/grubia32_real.efi ./tmp_mnt/EFI/BOOT/BOOTIA32.EFI - - sync - - for tt in 1 2 3; do - if umount ./tmp_mnt > /dev/null 2>&1; then - vtdebug "umount part2 success" - rm -rf ./tmp_mnt - break - else - vtdebug "umount part2 failed, now retry..." - sleep 1 - fi - done + sleep 2 + check_umount_disk "$DISK" + vtoycli partresize -s $DISK $part2_start fi echo "" diff --git a/INSTALL/tool/WebDeepin.sh b/INSTALL/tool/WebDeepin.sh deleted file mode 100644 index b37f394c..00000000 --- a/INSTALL/tool/WebDeepin.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/sh - -LOGFILE=log.txt -VUSER=$(get_user) - -if which browser >/dev/null 2>&1; then - : -else - if [ "$LANG" = "zh_CN.UTF-8" ]; then - echo " Built-in browser not found in the system, please use VentoyWeb.sh ..." - else - echo " 未找到系统内置的 browser (å¸è½½äº†ï¼Ÿï¼‰è¯·ä½¿ç”¨ VentoyWeb.sh ..." - fi - exit 1 -fi - - -if [ -e $LOGFILE ]; then - chown $VUSER $LOGFILE -else - su $VUSER -c "touch $LOGFILE" -fi - -#delete the log.txt if it's more than 8MB -if [ -f $LOGFILE ]; then - logsize=$(stat -c '%s' $LOGFILE) - if [ $logsize -gt 8388608 ]; then - rm -f $LOGFILE - fi -fi - - -if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then - xz -d ./tool/$TOOLDIR/V2DServer.xz - chmod +x ./tool/$TOOLDIR/V2DServer -fi - -rm -rf ./*_VTMPDIR -vtWebTmpDir=$(mktemp -d -p ./ --suffix=_VTMPDIR) -chown $VUSER $vtWebTmpDir - - -V2DServer "$HOST" "$PORT" & -V2DPid=$! -sleep 1 - -su $VUSER -c "browser --window-size=550,400 --app=\"http://${HOST}:${PORT}/index.html?chrome-app\" --user-data-dir=$vtWebTmpDir >> $LOGFILE 2>&1" & -WebPid=$! - - -vtoy_trap_exit() { - - [ -d /proc/$V2DPid ] && kill -2 $V2DPid - [ -d /proc/$WebPid ] && kill -9 $WebPid - - while [ -n "1" ]; do - curPid=$(ps -ef | grep -m1 "$vtWebTmpDir" | egrep -v '\sgrep\s' | awk '{print $2}') - if [ -z "$curPid" ]; then - break - fi - - if [ -d /proc/$curPid ]; then - kill -9 $curPid - fi - done - - [ -d $vtWebTmpDir ] && rm -rf $vtWebTmpDir - - if [ -n "$OLDDIR" ]; then - CURDIR=$(pwd) - if [ "$CURDIR" != "$OLDDIR" ]; then - cd "$OLDDIR" - fi - fi - - exit 1 -} - -trap vtoy_trap_exit HUP INT QUIT TSTP -sleep 1 - - -vtVer=$(cat ventoy/version) -echo "" -echo "==================================================" -if [ "$LANG" = "zh_CN.UTF-8" ]; then - echo " Ventoy Server $vtVer å·²ç»å¯åŠ¨ ..." -else - echo " Ventoy Server $vtVer is running ..." -fi -echo "==================================================" -echo "" -echo "########### Press Ctrl + C to exit ###############" -echo "" - -wait $WebPid - -[ -d /proc/$V2DPid ] && kill -2 $V2DPid - -[ -d $vtWebTmpDir ] && rm -rf $vtWebTmpDir - -if [ -n "$OLDDIR" ]; then - CURDIR=$(pwd) - if [ "$CURDIR" != "$OLDDIR" ]; then - cd "$OLDDIR" - fi -fi diff --git a/INSTALL/tool/WebUos.sh b/INSTALL/tool/WebUos.sh deleted file mode 100644 index 793e85b0..00000000 --- a/INSTALL/tool/WebUos.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -LOGFILE=log.txt - -#delete the log.txt if it's more than 8MB -if [ -f $LOGFILE ]; then - logsize=$(stat -c '%s' $LOGFILE) - if [ $logsize -gt 8388608 ]; then - rm -f $LOGFILE - fi -fi - - -if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then - xz -d ./tool/$TOOLDIR/V2DServer.xz - chmod +x ./tool/$TOOLDIR/V2DServer -fi - -V2DServer "$HOST" "$PORT" & -V2DPid=$! -sleep 1 - - -vtoy_trap_exit() { - - [ -d /proc/$V2DPid ] && kill -2 $V2DPid - - if [ -n "$OLDDIR" ]; then - CURDIR=$(pwd) - if [ "$CURDIR" != "$OLDDIR" ]; then - cd "$OLDDIR" - fi - fi - - exit 1 -} - -trap vtoy_trap_exit HUP INT QUIT TSTP -sleep 1 - - -vtVer=$(cat ventoy/version) -echo "" -echo "==================================================" -if [ "$LANG" = "zh_CN.UTF-8" ]; then - echo " Ventoy Server $vtVer å·²ç»å¯åŠ¨ ..." -else - echo " Ventoy Server $vtVer is running ..." -fi -echo "==================================================" -echo "" -echo "########### Press Ctrl + C to exit ###############" -echo "" - -if [ "$VERBOSE" = "1" ]; then - uos-browser --window-size=550,400 --app="http://${HOST}:${PORT}/index.html?chrome-app" -else - uos-browser --window-size=550,400 --app="http://${HOST}:${PORT}/index.html?chrome-app" > /dev/null 2>&1 -fi - -[ -d /proc/$V2DPid ] && kill -2 $V2DPid - -if [ -n "$OLDDIR" ]; then - CURDIR=$(pwd) - if [ "$CURDIR" != "$OLDDIR" ]; then - cd "$OLDDIR" - fi -fi diff --git a/INSTALL/tool/aarch64/V2DServer b/INSTALL/tool/aarch64/V2DServer index 6663ab58..f4e48733 100644 Binary files a/INSTALL/tool/aarch64/V2DServer and b/INSTALL/tool/aarch64/V2DServer differ diff --git a/INSTALL/tool/aarch64/Ventoy2Disk.gtk3 b/INSTALL/tool/aarch64/Ventoy2Disk.gtk3 new file mode 100644 index 00000000..db03db5e Binary files /dev/null and b/INSTALL/tool/aarch64/Ventoy2Disk.gtk3 differ diff --git a/INSTALL/tool/aarch64/Ventoy2Disk.qt5 b/INSTALL/tool/aarch64/Ventoy2Disk.qt5 new file mode 100644 index 00000000..4b849396 Binary files /dev/null and b/INSTALL/tool/aarch64/Ventoy2Disk.qt5 differ diff --git a/INSTALL/tool/aarch64/vtoyfat b/INSTALL/tool/aarch64/vtoycli similarity index 54% rename from INSTALL/tool/aarch64/vtoyfat rename to INSTALL/tool/aarch64/vtoycli index f1ff7485..7cc072b2 100644 Binary files a/INSTALL/tool/aarch64/vtoyfat and b/INSTALL/tool/aarch64/vtoycli differ diff --git a/INSTALL/tool/aarch64/vtoygpt b/INSTALL/tool/aarch64/vtoygpt deleted file mode 100644 index 420aefca..00000000 Binary files a/INSTALL/tool/aarch64/vtoygpt and /dev/null differ diff --git a/INSTALL/tool/distro_gui_type.json b/INSTALL/tool/distro_gui_type.json new file mode 100644 index 00000000..cbfbc2f3 --- /dev/null +++ b/INSTALL/tool/distro_gui_type.json @@ -0,0 +1,23 @@ +[ + { + "type": "env", + "name": "DESKTOP_SESSION", + "condition": "equal", + "expression": "deepin", + "gui": "qt5" + }, + { + "type": "env", + "name": "DESKTOP_SESSION", + "condition": "equal", + "expression": "uos", + "gui": "qt5" + }, + { + "type": "env", + "name": "DESKTOP_SESSION", + "condition": "equal", + "expression": "ukui", + "gui": "gtk3" + } +] diff --git a/INSTALL/tool/i386/V2DServer b/INSTALL/tool/i386/V2DServer index 02f1e5ef..fe154acd 100644 Binary files a/INSTALL/tool/i386/V2DServer and b/INSTALL/tool/i386/V2DServer differ diff --git a/INSTALL/tool/i386/Ventoy2Disk.gtk2 b/INSTALL/tool/i386/Ventoy2Disk.gtk2 new file mode 100644 index 00000000..f7317c59 Binary files /dev/null and b/INSTALL/tool/i386/Ventoy2Disk.gtk2 differ diff --git a/INSTALL/tool/i386/Ventoy2Disk.gtk3 b/INSTALL/tool/i386/Ventoy2Disk.gtk3 new file mode 100644 index 00000000..938d6808 Binary files /dev/null and b/INSTALL/tool/i386/Ventoy2Disk.gtk3 differ diff --git a/INSTALL/tool/i386/Ventoy2Disk.qt5 b/INSTALL/tool/i386/Ventoy2Disk.qt5 new file mode 100644 index 00000000..e46494e6 Binary files /dev/null and b/INSTALL/tool/i386/Ventoy2Disk.qt5 differ diff --git a/INSTALL/tool/i386/vtoycli b/INSTALL/tool/i386/vtoycli new file mode 100644 index 00000000..b6a91107 Binary files /dev/null and b/INSTALL/tool/i386/vtoycli differ diff --git a/INSTALL/tool/i386/vtoyfat b/INSTALL/tool/i386/vtoyfat deleted file mode 100644 index b372e626..00000000 Binary files a/INSTALL/tool/i386/vtoyfat and /dev/null differ diff --git a/INSTALL/tool/i386/vtoygpt b/INSTALL/tool/i386/vtoygpt deleted file mode 100644 index 127f080c..00000000 Binary files a/INSTALL/tool/i386/vtoygpt and /dev/null differ diff --git a/INSTALL/tool/mips64el/V2DServer b/INSTALL/tool/mips64el/V2DServer index bb9f481c..14be9acf 100644 Binary files a/INSTALL/tool/mips64el/V2DServer and b/INSTALL/tool/mips64el/V2DServer differ diff --git a/INSTALL/tool/mips64el/Ventoy2Disk.gtk3 b/INSTALL/tool/mips64el/Ventoy2Disk.gtk3 new file mode 100644 index 00000000..540a93ba Binary files /dev/null and b/INSTALL/tool/mips64el/Ventoy2Disk.gtk3 differ diff --git a/INSTALL/tool/mips64el/Ventoy2Disk.qt5 b/INSTALL/tool/mips64el/Ventoy2Disk.qt5 new file mode 100644 index 00000000..03cc6bfb Binary files /dev/null and b/INSTALL/tool/mips64el/Ventoy2Disk.qt5 differ diff --git a/INSTALL/tool/mips64el/vtoycli b/INSTALL/tool/mips64el/vtoycli new file mode 100644 index 00000000..c087f3d9 Binary files /dev/null and b/INSTALL/tool/mips64el/vtoycli differ diff --git a/INSTALL/tool/mips64el/vtoyfat b/INSTALL/tool/mips64el/vtoyfat deleted file mode 100644 index 2ff2eaf8..00000000 Binary files a/INSTALL/tool/mips64el/vtoyfat and /dev/null differ diff --git a/INSTALL/tool/mips64el/vtoygpt b/INSTALL/tool/mips64el/vtoygpt deleted file mode 100644 index 074d6f09..00000000 Binary files a/INSTALL/tool/mips64el/vtoygpt and /dev/null differ diff --git a/INSTALL/tool/ventoy_lib.sh b/INSTALL/tool/ventoy_lib.sh index a394eb14..04eea642 100644 --- a/INSTALL/tool/ventoy_lib.sh +++ b/INSTALL/tool/ventoy_lib.sh @@ -68,10 +68,10 @@ check_tool_work_ok() { return fi - if vtoyfat -T; then - vtdebug "vtoyfat test ok ..." + if vtoycli fat -T; then + vtdebug "vtoycli fat test ok ..." else - vtdebug "vtoyfat test fail ..." + vtdebug "vtoycli fat test fail ..." ventoy_false return fi @@ -183,7 +183,7 @@ check_disk_secure_boot() { PART2=$(get_disk_part_name $1 2) - vtoyfat -s $PART2 + vtoycli fat -s $PART2 } get_disk_ventoy_version() { @@ -195,7 +195,7 @@ get_disk_ventoy_version() { PART2=$(get_disk_part_name $1 2) - ParseVer=$(vtoyfat $PART2) + ParseVer=$(vtoycli fat $PART2) if [ $? -eq 0 ]; then vtdebug "Ventoy version in $PART2 is $ParseVer" echo $ParseVer @@ -241,6 +241,11 @@ format_ventoy_disk_mbr() { vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector" vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector" + if [ -e $PART1 ]; then + echo "delete $PART1" + rm -f $PART1 + fi + if [ -e $PART2 ]; then echo "delete $PART2" rm -f $PART2 @@ -293,34 +298,41 @@ EOF sleep 3 echo "Done" - echo 'mkfs on disk partitions ...' - for i in 1 2 3 4 5 6 7; do - if [ -b $PART2 ]; then + + echo 'Wait for partitions ...' + for i in 0 1 2 3 4 5 6 7 8 9; do + if [ -b $PART1 -a -b $PART2 ]; then break else - echo "wait $PART2 ..." + echo "Wait for $PART1/$PART2 ..." sleep 1 fi done - + if ! [ -b $PART1 ]; then + MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev) + echo "mknod -m 0660 $PART1 b $MajorMinor ..." + mknod -m 0660 $PART1 b $MajorMinor + fi + if ! [ -b $PART2 ]; then MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev) echo "mknod -m 0660 $PART2 b $MajorMinor ..." - mknod -m 0660 $PART2 b $MajorMinor - - if ! [ -b $PART1 ]; then - MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev) - echo "mknod -m 0660 $PART1 b $MajorMinor ..." - mknod -m 0660 $PART1 b $MajorMinor - fi + mknod -m 0660 $PART2 b $MajorMinor + fi + + if [ -b $PART1 -a -b $PART2 ]; then + echo "partition exist OK" + else + echo "[FAIL] $PART1/$PART2 does not exist" + exit 1 fi echo "create efi fat fs $PART2 ..." for i in 0 1 2 3 4 5 6 7 8 9; do check_umount_disk "$PART2" - if mkfs.vfat -F 16 -n VTOYEFI $PART2; then + if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then echo 'success' break else @@ -366,6 +378,11 @@ format_ventoy_disk_gpt() { vtdebug "part1_start_sector=$part1_start_sector part1_end_sector=$part1_end_sector" vtdebug "part2_start_sector=$part2_start_sector part2_end_sector=$part2_end_sector" + if [ -e $PART1 ]; then + echo "delete $PART1" + rm -f $PART1 + fi + if [ -e $PART2 ]; then echo "delete $PART2" rm -f $PART2 @@ -391,7 +408,7 @@ format_ventoy_disk_gpt() { sync - vtoygpt -f $DISK + vtoycli gpt -f $DISK sync udevadm trigger --name-match=$DISK >/dev/null 2>&1 @@ -399,27 +416,33 @@ format_ventoy_disk_gpt() { sleep 3 echo "Done" - echo 'mkfs on disk partitions ...' - for i in 1 2 3 4 5 6 7; do - if [ -b $PART2 ]; then + echo 'Wait for partitions ...' + for i in 0 1 2 3 4 5 6 7 8 9; do + if [ -b $PART1 -a -b $PART2 ]; then break else - echo "wait $PART2 ..." + echo "Wait for $PART1/$PART2 ..." sleep 1 fi done - + if ! [ -b $PART1 ]; then + MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev) + echo "mknod -m 0660 $PART1 b $MajorMinor ..." + mknod -m 0660 $PART1 b $MajorMinor + fi + if ! [ -b $PART2 ]; then MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART2#/dev/}/dev) echo "mknod -m 0660 $PART2 b $MajorMinor ..." - mknod -m 0660 $PART2 b $MajorMinor - - if ! [ -b $PART1 ]; then - MajorMinor=$(sed "s/:/ /" /sys/class/block/${PART1#/dev/}/dev) - echo "mknod -m 0660 $PART1 b $MajorMinor ..." - mknod -m 0660 $PART1 b $MajorMinor - fi + mknod -m 0660 $PART2 b $MajorMinor + fi + + if [ -b $PART1 -a -b $PART2 ]; then + echo "partition exist OK" + else + echo "[FAIL] $PART1/$PART2 does not exist" + exit 1 fi echo "create efi fat fs $PART2 ..." diff --git a/INSTALL/tool/x86_64/V2DServer b/INSTALL/tool/x86_64/V2DServer index 9b9d8710..492a0e97 100644 Binary files a/INSTALL/tool/x86_64/V2DServer and b/INSTALL/tool/x86_64/V2DServer differ diff --git a/INSTALL/tool/x86_64/Ventoy2Disk.gtk2 b/INSTALL/tool/x86_64/Ventoy2Disk.gtk2 new file mode 100644 index 00000000..7180adce Binary files /dev/null and b/INSTALL/tool/x86_64/Ventoy2Disk.gtk2 differ diff --git a/INSTALL/tool/x86_64/Ventoy2Disk.gtk3 b/INSTALL/tool/x86_64/Ventoy2Disk.gtk3 new file mode 100644 index 00000000..8e4b1144 Binary files /dev/null and b/INSTALL/tool/x86_64/Ventoy2Disk.gtk3 differ diff --git a/INSTALL/tool/x86_64/Ventoy2Disk.qt5 b/INSTALL/tool/x86_64/Ventoy2Disk.qt5 new file mode 100644 index 00000000..3bef337b Binary files /dev/null and b/INSTALL/tool/x86_64/Ventoy2Disk.qt5 differ diff --git a/INSTALL/tool/x86_64/vtoycli b/INSTALL/tool/x86_64/vtoycli new file mode 100644 index 00000000..edb4f2af Binary files /dev/null and b/INSTALL/tool/x86_64/vtoycli differ diff --git a/INSTALL/tool/x86_64/vtoyfat b/INSTALL/tool/x86_64/vtoyfat deleted file mode 100644 index 26e020c6..00000000 Binary files a/INSTALL/tool/x86_64/vtoyfat and /dev/null differ diff --git a/INSTALL/tool/x86_64/vtoygpt b/INSTALL/tool/x86_64/vtoygpt deleted file mode 100644 index 068aaf6e..00000000 Binary files a/INSTALL/tool/x86_64/vtoygpt and /dev/null differ diff --git a/INSTALL/ventoy/7z/32/7za.exe b/INSTALL/ventoy/7z/32/7za.exe deleted file mode 100644 index 2bdd57d2..00000000 Binary files a/INSTALL/ventoy/7z/32/7za.exe and /dev/null differ diff --git a/INSTALL/ventoy/7z/32/7za.xz b/INSTALL/ventoy/7z/32/7za.xz new file mode 100644 index 00000000..927e25a1 Binary files /dev/null and b/INSTALL/ventoy/7z/32/7za.xz differ diff --git a/INSTALL/ventoy/7z/64/7za.exe b/INSTALL/ventoy/7z/64/7za.exe deleted file mode 100644 index 9f27b20e..00000000 Binary files a/INSTALL/ventoy/7z/64/7za.exe and /dev/null differ diff --git a/INSTALL/ventoy/7z/64/7za.xz b/INSTALL/ventoy/7z/64/7za.xz new file mode 100644 index 00000000..bf52734d Binary files /dev/null and b/INSTALL/ventoy/7z/64/7za.xz differ diff --git a/INSTALL/ventoy/dragonfly.mfs.xz b/INSTALL/ventoy/dragonfly.mfs.xz index 6c71a87a..c15a0067 100644 Binary files a/INSTALL/ventoy/dragonfly.mfs.xz and b/INSTALL/ventoy/dragonfly.mfs.xz differ diff --git a/INSTALL/ventoy/ventoy_unix.cpio b/INSTALL/ventoy/ventoy_unix.cpio index f888ffb6..83fdf00b 100644 Binary files a/INSTALL/ventoy/ventoy_unix.cpio and b/INSTALL/ventoy/ventoy_unix.cpio differ diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 1c7bea1f..992a3623 100644 Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index a0d60562..7a425c06 100644 Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ diff --git a/INSTALL/ventoy_pack.sh b/INSTALL/ventoy_pack.sh index 08e2121d..013cf475 100644 --- a/INSTALL/ventoy_pack.sh +++ b/INSTALL/ventoy_pack.sh @@ -8,8 +8,8 @@ fi dos2unix -q ./tool/ventoy_lib.sh dos2unix -q ./tool/VentoyWorker.sh -dos2unix -q ./tool/WebDeepin.sh -dos2unix -q ./tool/WebUos.sh +dos2unix -q ./tool/VentoyGTK.glade +dos2unix -q ./tool/distro_gui_type.json . ./tool/ventoy_lib.sh @@ -36,6 +36,11 @@ sh language.sh || exit 1 sh build.sh cd - +cd ../Plugson +sh build.sh +sh pack.sh +cd - + LOOP=$(losetup -f) @@ -72,15 +77,26 @@ ls -1 ./grub/ | grep -v 'grub\.cfg' | while read line; do cp $OPT ./grub/$line $tmpmnt/grub/ done +#tar help txt +cd $tmpmnt/grub/ +tar czf help.tar.gz ./help/ +rm -rf ./help +cd ../../ + + cp $OPT ./ventoy $tmpmnt/ cp $OPT ./EFI $tmpmnt/ cp $OPT ./tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer $tmpmnt/ mkdir -p $tmpmnt/tool -cp $OPT ./tool/i386/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_i386 -cp $OPT ./tool/x86_64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_x86_64 -cp $OPT ./tool/aarch64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_aarch64 +# cp $OPT ./tool/i386/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_i386 +# cp $OPT ./tool/x86_64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_x86_64 +# cp $OPT ./tool/aarch64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_aarch64 +# to save space +dd status=none bs=1024 count=16 if=./tool/i386/vtoycli of=$tmpmnt/tool/mount.exfat-fuse_i386 +dd status=none bs=1024 count=16 if=./tool/x86_64/vtoycli of=$tmpmnt/tool/mount.exfat-fuse_x86_64 +dd status=none bs=1024 count=16 if=./tool/aarch64/vtoycli of=$tmpmnt/tool/mount.exfat-fuse_aarch64 rm -f $tmpmnt/grub/i386-pc/*.img @@ -101,16 +117,19 @@ cp $OPT ./tool $tmpdir/ rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer cp $OPT Ventoy2Disk.sh $tmpdir/ cp $OPT VentoyWeb.sh $tmpdir/ -cp $OPT VentoyWebDeepin.sh $tmpdir/ -#cp $OPT Ventoy.desktop $tmpdir/ +cp $OPT VentoyPlugson.sh $tmpdir/ +cp $OPT VentoyGUI* $tmpdir/ + + cp $OPT README $tmpdir/ cp $OPT plugin $tmpdir/ cp $OPT CreatePersistentImg.sh $tmpdir/ cp $OPT ExtendPersistentImg.sh $tmpdir/ dos2unix -q $tmpdir/Ventoy2Disk.sh dos2unix -q $tmpdir/VentoyWeb.sh -dos2unix -q $tmpdir/VentoyWebDeepin.sh -#dos2unix -q $tmpdir/Ventoy.desktop +dos2unix -q $tmpdir/VentoyPlugson.sh + + dos2unix -q $tmpdir/CreatePersistentImg.sh dos2unix -q $tmpdir/ExtendPersistentImg.sh @@ -128,11 +147,15 @@ rm -f ventoy-${curver}-linux.tar.gz CurDir=$PWD -for d in i386 x86_64 aarch64; do +for d in i386 x86_64 aarch64 mips64el; do cd $tmpdir/tool/$d for file in $(ls); do if [ "$file" != "xzcat" ]; then - xz --check=crc32 $file + if echo "$file" | grep -q '^Ventoy2Disk'; then + chmod +x $file + else + xz --check=crc32 $file + fi fi done cd $CurDir @@ -143,19 +166,34 @@ find $tmpdir/ -type d -exec chmod 755 "{}" + find $tmpdir/ -type f -exec chmod 644 "{}" + chmod +x $tmpdir/Ventoy2Disk.sh chmod +x $tmpdir/VentoyWeb.sh -chmod +x $tmpdir/VentoyWebDeepin.sh -#chmod +x $tmpdir/Ventoy.desktop +chmod +x $tmpdir/VentoyPlugson.sh +chmod +x $tmpdir/VentoyGUI* + +cp $OPT $LANG_DIR/languages.json $tmpdir/tool/ + + chmod +x $tmpdir/CreatePersistentImg.sh +chmod +x $tmpdir/ExtendPersistentImg.sh tar -czvf ventoy-${curver}-linux.tar.gz $tmpdir rm -f ventoy-${curver}-windows.zip -cp $OPT Ventoy2Disk*.exe $tmpdir/ + +cp $OPT Ventoy2Disk.exe $tmpdir/ +cp $OPT VentoyPlugson.exe $tmpdir/ +cp $OPT FOR_X64_ARM.txt $tmpdir/ +mkdir -p $tmpdir/altexe +cp $OPT Ventoy2Disk_*.exe $tmpdir/altexe/ + + + +cp $OPT $tmpdir/tool/plugson.tar.xz $tmpdir/ventoy/ cp $OPT $LANG_DIR/languages.json $tmpdir/ventoy/ rm -rf $tmpdir/tool rm -f $tmpdir/*.sh +rm -f $tmpdir/VentoyGUI.* rm -rf $tmpdir/WebUI rm -f $tmpdir/README @@ -165,11 +203,11 @@ zip -r ventoy-${curver}-windows.zip $tmpdir/ rm -rf $tmpdir echo "=============== run livecd.sh ===============" -cd ../LiveCD +cd ../LiveCDGUI sh livecd.sh $1 cd $CurDir -mv ../LiveCD/ventoy*.iso ./ +mv ../LiveCDGUI/ventoy*.iso ./ if [ -e ventoy-${curver}-windows.zip ] && [ -e ventoy-${curver}-linux.tar.gz ]; then echo -e "\n ============= SUCCESS =================\n" diff --git a/LANGUAGES/languages.json b/LANGUAGES/languages.json index 111bb56b..0c715052 100644 --- a/LANGUAGES/languages.json +++ b/LANGUAGES/languages.json @@ -44,19 +44,29 @@ "STR_WEB_SERVICE_UNAVAILABLE":"خطأ ÙÙŠ الاتصال: الخدمة غير متوÙرة", "STR_WEB_TOKEN_MISMATCH":"تم تحديث حالة البرنامج الخÙÙŠ ØŒ يرجى إعادة المحاولة لاحقًا.", "STR_WEB_SERVICE_BUSY":"الخدمة مشغولة ØŒ يرجى إعادة المحاولة لاحقًا.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Korean (한국어)", "FontFamily":"Courier New", "FontSize":16, - "Author":"Remiz,VenusGirl", + "Author":"VenusGirl", "STR_ERROR":"오류", "STR_WARNING":"경고", "STR_INFO":"ì •ë³´", "STR_INCORRECT_DIR":"올바른 디렉토리ì—ì„œ 실행하십시오!", - "STR_INCORRECT_TREE_DIR":"여기서 저를 실행하지 ë§ê³ , ì¶œì‹œëœ ì„¤ì¹˜ 패키지를 다운로드한 ë‹¤ìŒ ê±°ê¸°ì„œ 실행하십시오.", + "STR_INCORRECT_TREE_DIR":"여기서 실행하지 ë§ê³ , ì¶œì‹œëœ ì„¤ì¹˜ 패키지를 다운로드한 ë‹¤ìŒ ê±°ê¸°ì„œ 실행하십시오.", "STR_DEVICE":"장치", "STR_LOCAL_VER":"íŒ¨í‚¤ì§€ì˜ Ventoy 버전", "STR_DISK_VER":"장치 ë‚´ë¶€ì˜ Ventoy 버전", @@ -67,9 +77,9 @@ "STR_INSTALL_TIP":"디스í¬ê°€ í¬ë§·ë˜ê³  모든 ë°ì´í„°ê°€ ì†ì‹¤ë©ë‹ˆë‹¤.#@계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "STR_INSTALL_TIP2":"디스í¬ê°€ í¬ë§·ë˜ê³  모든 ë°ì´í„°ê°€ ì†ì‹¤ë©ë‹ˆë‹¤.#@계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ? (다시 확ì¸)", "STR_INSTALL_SUCCESS":"축하합니다!#@Ventoyê°€ ìž¥ì¹˜ì— ì„±ê³µì ìœ¼ë¡œ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.", - "STR_INSTALL_FAILED":"설치 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 연결하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", + "STR_INSTALL_FAILED":"설치 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 삽입하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", "STR_UPDATE_SUCCESS":"축하합니다!#@Ventoyê°€ ìž¥ì¹˜ì— ì„±ê³µì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤.", - "STR_UPDATE_FAILED":"ì—…ë°ì´íŠ¸ ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 연결하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", + "STR_UPDATE_FAILED":"ì—…ë°ì´íŠ¸ ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 삽입하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", "STR_WAIT_PROCESS":"현재 ìž‘ì—…ì´ ì‹¤í–‰ 중입니다. 기다려 주십시오...", "STR_MENU_OPTION":"옵션", "STR_MENU_SECURE_BOOT":"보안 부트 (Secure Boot) 지ì›", @@ -80,7 +90,7 @@ "STR_SPACE_VAL_INVALID":"ì˜ˆì•½ëœ ê³µê°„ì˜ ê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤", "STR_MENU_CLEAR":"Ventoy 제거", "STR_CLEAR_SUCCESS":"Ventoyê°€ 장치ì—ì„œ 성공ì ìœ¼ë¡œ 제거ë˜ì—ˆìŠµë‹ˆë‹¤.", - "STR_CLEAR_FAILED":"디스í¬ì—ì„œ Ventoy를 지울 ë•Œ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 연결하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", + "STR_CLEAR_FAILED":"디스í¬ì—ì„œ Ventoy를 지울 ë•Œ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. USB를 다시 삽입하고 다시 ì‹œë„í•  수 있습니다. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", "STR_MENU_PART_STYLE":"파티션 유형", "STR_DISK_2TB_MBR_ERROR":"2TB ì´ìƒì˜ 디스í¬ëŠ” GPT를 ì„ íƒí•˜ì‹­ì‹œì˜¤", "STR_SHOW_ALL_DEV":"모든 장치 표시", @@ -91,6 +101,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"통신 오류: 서비스를 사용할 수 ì—†ìŒ", "STR_WEB_TOKEN_MISMATCH":"ë°ëª¬ ìƒíƒœê°€ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤. ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„하십시오.", "STR_WEB_SERVICE_BUSY":"서비스가 사용 중입니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ ì‹œë„하십시오.", + "STR_MENU_VTSI_CREATE":"VTSI íŒŒì¼ ìƒì„±", + "STR_VTSI_CREATE_TIP":"ì´ë²ˆì—는 ìž¥ì¹˜ì— ì“°ì§€ ì•Šê³  VTSI 파ì¼#@만 ìƒì„±í•©ë‹ˆë‹¤.#@계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", + "STR_VTSI_CREATE_SUCCESS":"VTSI 파ì¼ì´ 성공ì ìœ¼ë¡œ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤!#@Rufus (3.15+)를 사용하여 ìž¥ì¹˜ì— ê¸°ë¡í•˜ì—¬ Ventoy 설치를 완료할 수 있습니다.", + "STR_VTSI_CREATE_FAILED":"VTSI 파ì¼ì„ ìƒì„±í•˜ì§€ 못했습니다.", + "STR_MENU_PART_RESIZE":"비파괴 설치", + "STR_PART_RESIZE_TIP":"가능하면 Ventoyê°€ 비파괴 설치를 ì‹œë„합니다. #@계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", + "STR_PART_RESIZE_SUCCESS":"축하합니다!#@Ventoy 비파괴 설치가 완료ë˜ì—ˆìŠµë‹ˆë‹¤.", + "STR_PART_RESIZE_FAILED":"비파괴 ì„¤ì¹˜ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", + "STR_PART_RESIZE_UNSUPPORTED":"ì¼ë¶€ ì¡°ê±´ì„ ì¶©ì¡±í•  수 없기 ë•Œë¬¸ì— Ventoy 비파괴 설치가 중지ë˜ì—ˆìŠµë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ log.txt를 확ì¸í•˜ì‹­ì‹œì˜¤.", + "STRXXX":"" }, { @@ -114,9 +134,9 @@ "STR_INSTALL_TIP":"ç£ç›˜ä¼šè¢«æ ¼å¼åŒ–, 所有数æ®éƒ½ä¼šä¸¢å¤±!#@是å¦ç»§ç»­ï¼Ÿ", "STR_INSTALL_TIP2":"ç£ç›˜ä¼šè¢«æ ¼å¼åŒ–, 所有数æ®éƒ½ä¼šä¸¢å¤±!#@å†æ¬¡ç¡®è®¤æ˜¯å¦ç»§ç»­ï¼Ÿ", "STR_INSTALL_SUCCESS":"æ­å–œä½ ! Ventoy å·²ç»æˆåŠŸå®‰è£…到此设备中.", - "STR_INSTALL_FAILED":"安装 Ventoy 过程中å‘生错误. ä½ å¯ä»¥é‡æ–°æ‹”æ’一下U盘然åŽé‡è¯•ä¸€æ¬¡, 详细信æ¯è¯·æŸ¥é˜… log.txt 文件.", + "STR_INSTALL_FAILED":"安装 Ventoy 过程中å‘生错误. ä½ å¯ä»¥é‡æ–°æ‹”æ’一下U盘然åŽé‡è¯•ä¸€æ¬¡, 详细信æ¯è¯·æŸ¥é˜… log.txt 文件. 如果一直出错,请å‚考官网常è§é—®é¢˜è¯´æ˜Ž.", "STR_UPDATE_SUCCESS":"æ­å–œä½ ! 新版本的 Ventoy å·²ç»æˆåŠŸæ›´æ–°åˆ°æ­¤è®¾å¤‡ä¸­.", - "STR_UPDATE_FAILED":"æ›´æ–° Ventoy 过程中é‡åˆ°é”™è¯¯. ä½ å¯ä»¥é‡æ–°æ‹”æ’一下U盘然åŽé‡è¯•ä¸€æ¬¡, 详细信æ¯è¯·æŸ¥é˜… log.txt 文件.", + "STR_UPDATE_FAILED":"æ›´æ–° Ventoy 过程中é‡åˆ°é”™è¯¯. ä½ å¯ä»¥é‡æ–°æ‹”æ’一下U盘然åŽé‡è¯•ä¸€æ¬¡, 详细信æ¯è¯·æŸ¥é˜… log.txt 文件. 如果一直出错,请å‚考官网常è§é—®é¢˜è¯´æ˜Ž.", "STR_WAIT_PROCESS":"当å‰æœ‰ä»»åŠ¡æ­£åœ¨è¿è¡Œ, 请等待...", "STR_MENU_OPTION":"é…置选项", "STR_MENU_SECURE_BOOT":"安全å¯åŠ¨æ”¯æŒ", @@ -138,6 +158,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"通信失败:æœåŠ¡ä¸å¯ç”¨", "STR_WEB_TOKEN_MISMATCH":"åŽå°æœåŠ¡çŠ¶æ€æ›´æ–°ï¼Œè¯·ç¨åŽé‡è¯•", "STR_WEB_SERVICE_BUSY":"åŽå°æœåŠ¡æ­£å¿™ï¼Œè¯·ç¨åŽé‡è¯•", + "STR_MENU_VTSI_CREATE":"创建 VTSI 文件", + "STR_VTSI_CREATE_TIP":"本æ“作ä¸ä¼šå‘设备中写入数æ®ï¼Œè€Œåªä¼šç”Ÿæˆä¸€ä¸ª VTSI 文件#@是å¦ç»§ç»­ï¼Ÿ", + "STR_VTSI_CREATE_SUCCESS":"VTSI 文件创建æˆåŠŸï¼Œä½ å¯ä»¥ä½¿ç”¨Rufus(3.15+)将其写入对应设备,从而完æˆVentoy的安装", + "STR_VTSI_CREATE_FAILED":"VTSI 文件创建失败", + "STR_MENU_PART_RESIZE":"æ— æŸå®‰è£…", + "STR_PART_RESIZE_TIP":"Ventoyå°†å°è¯•è¿›è¡Œæ— æŸå®‰è£…。注æ„:任何ç£ç›˜æ“作都有一定的风险,对于é‡è¦æ•°æ®å»ºè®®åšå¥½å¤‡ä»½ã€‚#@是å¦ç»§ç»­ï¼Ÿ", + "STR_PART_RESIZE_SUCCESS":"æ­å–œä½ ! Ventoy æˆåŠŸå®Œæˆäº†æ— æŸå®‰è£…。", + "STR_PART_RESIZE_FAILED":"Ventoy æ— æŸå®‰è£…失败。详细信æ¯è¯·æŸ¥é˜… log.txt 文件。", + "STR_PART_RESIZE_UNSUPPORTED":"æ¡ä»¶ä¸æ»¡è¶³ï¼Œæ— æ³•è¿›è¡Œæ— æŸå®‰è£…。详细信æ¯è¯·æŸ¥é˜… log.txt 文件。", + "STRXXX":"" }, { @@ -158,12 +188,12 @@ "STR_INSTALL":"Install", "STR_UPDATE":"Update", "STR_UPDATE_TIP":"Upgrade operation is safe, ISO files will be unchanged.#@Continue?", - "STR_INSTALL_TIP":"The disk will be formatted and all the data will be lost.#@Continue?", - "STR_INSTALL_TIP2":"The disk will be formatted and all the data will be lost.#@Continue? (Double Check)", + "STR_INSTALL_TIP":"The device will be formatted and all the data will be lost.#@Continue?", + "STR_INSTALL_TIP2":"The device will be formatted and all the data will be lost.#@Continue? (Double Check)", "STR_INSTALL_SUCCESS":"Congratulations!#@Ventoy has been successfully installed to the device.", - "STR_INSTALL_FAILED":"An error occurred during the installation. You can replug the USB and try again. Check log.txt for detail.", + "STR_INSTALL_FAILED":"An error occurred during the installation. You can replug the USB device and try again. Check log.txt for detail. If it always fail, please refer the FAQ in the official website.", "STR_UPDATE_SUCCESS":"Congratulations!#@Ventoy has been successfully updated to the device.", - "STR_UPDATE_FAILED":"An error occurred during the update. You can replug the USB and try again. Check log.txt for detail.", + "STR_UPDATE_FAILED":"An error occurred during the update. You can replug the USB device and try again. Check log.txt for detail. If it always fail, please refer the FAQ in the official website.", "STR_WAIT_PROCESS":"A thread is running, please wait...", "STR_MENU_OPTION":"Option", "STR_MENU_SECURE_BOOT":"Secure Boot Support", @@ -174,9 +204,9 @@ "STR_SPACE_VAL_INVALID":"Invalid value for reserved space", "STR_MENU_CLEAR":"Clear Ventoy", "STR_CLEAR_SUCCESS":"Ventoy has been successfully removed from the device.", - "STR_CLEAR_FAILED":"An error occurred when clear Ventoy from disk. You can replug the USB and try again. Check log.txt for detail.", + "STR_CLEAR_FAILED":"An error occurred when clearing Ventoy from disk. You can replug the USB device and try again. Check log.txt for details.", "STR_MENU_PART_STYLE":"Partition Style", - "STR_DISK_2TB_MBR_ERROR":"Please select GPT for disk over 2TB", + "STR_DISK_2TB_MBR_ERROR":"Please select GPT for devices over 2TB", "STR_SHOW_ALL_DEV":"Show All Devices", "STR_PART_ALIGN_4KB":"Align partitions with 4KB", "STR_WEB_COMMUNICATION_ERR":"Communication error:", @@ -185,6 +215,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -232,6 +272,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"خطای ارتباطی: سرویس موجود نیست", "STR_WEB_TOKEN_MISMATCH":"وضعیت Daemon به روز شد ØŒ لطÙاً بعداً دوباره امتحان کنید.", "STR_WEB_SERVICE_BUSY":"سرویس شلوغ است ØŒ لطÙاً بعداً دوباره امتحان کنید.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -279,13 +329,23 @@ "STR_WEB_SERVICE_UNAVAILABLE":"BÅ‚Ä…d komunikacji: usÅ‚uga niedostÄ™pna", "STR_WEB_TOKEN_MISMATCH":"Stan daemona zostaÅ‚ zaktualizowany, spróbuj ponownie później.", "STR_WEB_SERVICE_BUSY":"UsÅ‚uga jest zajÄ™ta, spróbuj ponownie później.", + "STR_MENU_VTSI_CREATE":"Wygeneruj plik VTSI", + "STR_VTSI_CREATE_TIP":"Tym razem nie napisze do urzÄ…dzenia ale tylko wygeneruje plik VTSI#@Kontynuować?", + "STR_VTSI_CREATE_SUCCESS":"PomyÅ›lnie wygenerowane plik VTSI!#@Możesz teraz użyć Rufus'a(3.15+) aby napisać go na urzÄ…dzenie by dokoÅ„czyć instlacjÄ™ Ventoy.", + "STR_VTSI_CREATE_FAILED":"Generacja pliku VTSI nie powiodÅ‚a siÄ™.", + "STR_MENU_PART_RESIZE":"NieniszczÄ…sa instalacja", + "STR_PART_RESIZE_TIP":"Ventoy spróbuje nieniszczÄ…cej instalacji jeÅ›li jest możliwa. #@Kontynuować?", + "STR_PART_RESIZE_SUCCESS":"Gratulacje!#@NieniszczÄ…ca instlacja Ventoy zakoÅ„czyÅ‚a siÄ™ pomyÅ›lnie.", + "STR_PART_RESIZE_FAILED":"NieniszczÄ…ca instalacja nie powiodÅ‚a siÄ™, sprawdz log.txt po szczegóły.", + "STR_PART_RESIZE_UNSUPPORTED":"NieniszczÄ…ca instalacja Ventoy zostaÅ‚a zatrzymana ponieważ niektóre wymagania nie zostaÅ‚y speÅ‚nione. Sprawdz log.txt po szczegóły.", + "STRXXX":"" }, { "name":"Portuguese Brazilian (Português do Brasil)", "FontFamily":"Courier New", "FontSize":16, - "Author":"EstevaoCostaG3, David BrazSan", + "Author":"EstevaoCostaG3, David BrazSan, Hildo Guillardi Júnior", "STR_ERROR":"Erro", "STR_WARNING":"Atenção", @@ -326,53 +386,73 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Erro de comunicação: Serviço indisponível", "STR_WEB_TOKEN_MISMATCH":"Status daemon atualizado, por favor, tente novamente mais tarde.", "STR_WEB_SERVICE_BUSY":"O serviço está ocupado, por favor, tente novamente mais tarde.", + "STR_MENU_VTSI_CREATE":"Gerar arquivo VTSI", + "STR_VTSI_CREATE_TIP":"Não será gravado no dispositivo, desta vez, apenas derado um VTSI file#@Continuar?", + "STR_VTSI_CREATE_SUCCESS":"Arquivo VTSI criado com sucesso!#@Você pode usar Rufus(3.15+) para gravá-lo no dispositivo e completar a instalação do Ventoy.", + "STR_VTSI_CREATE_FAILED":"Criaçao do arquivo VTSI falhada.", + "STR_MENU_PART_RESIZE":"Instalação não destrutiva", + "STR_PART_RESIZE_TIP":"Ventoy tentará uma instalação não destrutiva, se possível.#@Continuar?", + "STR_PART_RESIZE_SUCCESS":"Parabéns!#@Instalação não destrutiva do Ventoy concluída com sucesso.", + "STR_PART_RESIZE_FAILED":"Falha na installação não destrutiva, cheque o arquivo log.txt para entender.", + "STR_PART_RESIZE_UNSUPPORTED":"Instalação não destrutiva do Ventoy interrompida devido fato desconhecido. Cheque o arquivo log.txt para detalhes.", + "STRXXX":"" }, { "name":"Turkish (Türkçe)", "FontFamily":"Courier New", "FontSize":16, - "Author":"Erhan Kültür/crasadure", + "Author":"Erhan Kültür/crasadure, OÄŸuz Ersen", "STR_ERROR":"Hata", "STR_WARNING":"Uyarı", "STR_INFO":"Bilgi", "STR_INCORRECT_DIR":"Lütfen doÄŸru dizin altında çalıştırın!", - "STR_INCORRECT_TREE_DIR":"Dosyayı burada çalıştırma, lütfen yayınlanan en son kurulum paketini indirin ve oradan çalıştırın.", + "STR_INCORRECT_TREE_DIR":"Dosyayı burada çalıştırmayın, lütfen yayınlanan en son kurulum paketini indirin ve oradan çalıştırın.", "STR_DEVICE":"Aygıt", "STR_LOCAL_VER":"Ventoy GÃœNCEL Sürüm", - "STR_DISK_VER":"Cihazdaki Ventoy Sürümü", + "STR_DISK_VER":"Aygıttaki Ventoy Sürümü", "STR_STATUS":"Durum - HAZIR", "STR_INSTALL":"Kur", "STR_UPDATE":"Güncelle", - "STR_UPDATE_TIP":"Ventoyun versiyon bilgisi güncellenecek, ISO dosyalarınız bundan etkilenmiyecek.#@Devam edilsinmi?", - "STR_INSTALL_TIP":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsinmi?", - "STR_INSTALL_TIP2":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsinmi? (Son UYARI!)", - "STR_INSTALL_SUCCESS":"Tebrikler!#@ventoy cihaza baÅŸarıyla kuruldu.", - "STR_INSTALL_FAILED":"Yükleme sırasında bir hata oluÅŸtu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.", - "STR_UPDATE_SUCCESS":"Tebrikler!#@ventoy cihazda baÅŸarıyla güncellendi.", + "STR_UPDATE_TIP":"Yükseltme iÅŸlemi güvenlidir, ISO dosyalarınız bundan etkilenmeyecek.#@Devam edilsin mi?", + "STR_INSTALL_TIP":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsin mi?", + "STR_INSTALL_TIP2":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsin mi? (Son UYARI!)", + "STR_INSTALL_SUCCESS":"Tebrikler!#@Ventoy, aygıta baÅŸarıyla kuruldu.", + "STR_INSTALL_FAILED":"Kurulum sırasında bir hata oluÅŸtu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.", + "STR_UPDATE_SUCCESS":"Tebrikler!#@Ventoy, aygıtta baÅŸarıyla güncellendi.", "STR_UPDATE_FAILED":"Güncelleme sırasında bir hata oluÅŸtu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.", - "STR_WAIT_PROCESS":"Mevcut iÅŸlem çalışıyor, lütfen bekleyiniz ...", + "STR_WAIT_PROCESS":"Mevcut iÅŸlem çalışıyor, lütfen bekleyin...", "STR_MENU_OPTION":"Seçenek", - "STR_MENU_SECURE_BOOT":"Güvenli Önyükleme", - "STR_MENU_PART_CFG":"Partisyon Yapılandırması", + "STR_MENU_SECURE_BOOT":"Güvenli Önyükleme DesteÄŸi", + "STR_MENU_PART_CFG":"Bölüm Yapılandırması", "STR_BTN_OK":"Tamam", - "STR_BTN_CANCEL":"Ä°ptal et", - "STR_PRESERVE_SPACE":"Diskin sonunda ayrılmış disk partisyonu oluÅŸtur", + "STR_BTN_CANCEL":"Ä°ptal", + "STR_PRESERVE_SPACE":"Diskin sonunda biraz ayrılmış alan bırak", "STR_SPACE_VAL_INVALID":"Ayrılmış alan için geçersiz deÄŸer girdiniz", - "STR_MENU_CLEAR":"Ventoyu USB Diskten Sil", + "STR_MENU_CLEAR":"Ventoy'u USB Diskten Sil", "STR_CLEAR_SUCCESS":"Ventoy baÅŸarılı bir ÅŸekilde diskten silindi", - "STR_CLEAR_FAILED":"Ventoy USB diskten temizlenirken bir hata oluÅŸtu.Lütfen USB Diski tekrar takın ve tekrar deneyin.Hatanın detayları için Log.txt dosyasını okuyun", - "STR_MENU_PART_STYLE":"Partisyon Yapısı", - "STR_DISK_2TB_MBR_ERROR":"2TB üstündeki diskler için lütfen GPT disk yapısını seçiniz.", - "STR_SHOW_ALL_DEV":"Tüm Cihazları Göster", - "STR_PART_ALIGN_4KB":"Tüm Partisyonları 4KB düzeninde hizala", - "STR_WEB_COMMUNICATION_ERR":"IletiÅŸim Hatası:", - "STR_WEB_REMOTE_ABNORMAL":"IletiÅŸim Hatası:Uzaktan eriÅŸim hizmeti anormal durumda", - "STR_WEB_REQUEST_TIMEOUT":"IletiÅŸim hatası: Uzaktan eriÅŸim isteÄŸi zaman aşımına uÄŸradı", - "STR_WEB_SERVICE_UNAVAILABLE":"IletiÅŸim hatası: Uzaktan web eriÅŸim hizmeti eriÅŸilemez durumda", - "STR_WEB_TOKEN_MISMATCH":"Daemon durumu güncellendi,lütfen daha sonra tekrar deneyiniz.", + "STR_CLEAR_FAILED":"Ventoy USB diskten temizlenirken bir hata oluÅŸtu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın", + "STR_MENU_PART_STYLE":"Bölüm Yapısı", + "STR_DISK_2TB_MBR_ERROR":"2TB üstündeki diskler için lütfen GPT disk yapısını seçin.", + "STR_SHOW_ALL_DEV":"Tüm Aygıtları Göster", + "STR_PART_ALIGN_4KB":"Tüm bölümleri 4KB düzeninde hizala", + "STR_WEB_COMMUNICATION_ERR":"Ä°letiÅŸim Hatası:", + "STR_WEB_REMOTE_ABNORMAL":"Ä°letiÅŸim Hatası:Uzaktan eriÅŸim hizmeti anormal durumda", + "STR_WEB_REQUEST_TIMEOUT":"Ä°letiÅŸim hatası: Uzaktan eriÅŸim isteÄŸi zaman aşımına uÄŸradı", + "STR_WEB_SERVICE_UNAVAILABLE":"Ä°letiÅŸim hatası: Uzaktan web eriÅŸim hizmeti eriÅŸilemez durumda", + "STR_WEB_TOKEN_MISMATCH":"Daemon durumu güncellendi,lütfen daha sonra tekrar deneyin.", "STR_WEB_SERVICE_BUSY":"Hizmet meÅŸgul, lütfen daha sonra tekrar deneyin.", + "STR_MENU_VTSI_CREATE":"VTSI Dosyası OluÅŸtur", + "STR_VTSI_CREATE_TIP":"Åžu an aygıta yazılmayacak,sadece bir VTSI dosyası oluÅŸturulacak#@Devam edilsin mi?", + "STR_VTSI_CREATE_SUCCESS":"VTSI dosyası baÅŸarılı bir ÅŸekilde oluÅŸturuldu!#@Ventoy'un aygıta kurulumunu tamamlamak için Rufus(3.15+) programını kullanabilirsiniz.", + "STR_VTSI_CREATE_FAILED":"VTSI dosyası oluÅŸturma baÅŸarısız oldu!", + "STR_MENU_PART_RESIZE":"Tahribatsız Kurulum", + "STR_PART_RESIZE_TIP":"Ventoy,mümkünse tahribatsız kurulumu deneyecektir. . #@Devam edilsin mi?", + "STR_PART_RESIZE_SUCCESS":"Tebrikler!#@Ventoy Tahribatsız Kurulum, baÅŸarıyla tamamlandı.", + "STR_PART_RESIZE_FAILED":"Tahribatsız kurulum baÅŸarısız oldu, ayrıntılar için log.txt dosyasını kontrol edin.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy Tahribatsız Kurulum, bazı koÅŸullar saÄŸlanmadığı için durduruldu. Ayrıntılı bilgi için log.txt dosyasını kontrol edin.", + "STRXXX":"" }, { @@ -420,6 +500,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfehler: Dienst nicht verfügbar", "STR_WEB_TOKEN_MISMATCH":"Daemon-Status aktualisiert, bitte später erneut versuchen.", "STR_WEB_SERVICE_BUSY":"Dienst ist ausgelastet, bitte später erneut versuchen.", + "STR_MENU_VTSI_CREATE":"VTSI-Datei erstellen", + "STR_VTSI_CREATE_TIP":"Es wird nur eine VTSI-Datei erstellt und nichts auf ein Gerät geschrieben.#@Fortfahren?", + "STR_VTSI_CREATE_SUCCESS":"VTSI-Datei erfolgreich erstellt!#@Sie können Rufus(3.15+) zum auf das Gerät schreiben verwenden um die Installation von Ventoy fertigzustellen.", + "STR_VTSI_CREATE_FAILED":"VTSI-Datei konnte nicht erstellt werden.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy wird eine Installation ohne vorherige Formatierung versuchen. #@Fortfahren?", + "STR_PART_RESIZE_SUCCESS":"Glückwunsch!#@Die Installation von Ventoy, ohne vorherige Formatierung, wurde erfolgreich abgeschlossen.", + "STR_PART_RESIZE_FAILED":"Installation ohne vorherige Formatierung fehlgeschlagen. Für Details die log.txt prüfen.", + "STR_PART_RESIZE_UNSUPPORTED":"Installation ohne vorherige Formatierung wurde auf Grund einiger nicht erfüllbarer Bedingungen gestoppt. Für Details die log.txt prüfen.", + "STRXXX":"" }, { @@ -431,7 +521,7 @@ "STR_ERROR":"Error", "STR_WARNING":"Avertiment", "STR_INFO":"Info", - "STR_INCORRECT_DIR":"Aqueste programa deu s’executar dins lo bon repertòri!", + "STR_INCORRECT_DIR":"Aqueste programa deu s’executar dins lo bon repertòri !", "STR_INCORRECT_TREE_DIR":"Lancetz pas aquò, mercés de telecargar lo programa d’installacion e relançatz-lo.", "STR_DEVICE":"Periferic", "STR_LOCAL_VER":"Ventoy en local", @@ -439,10 +529,10 @@ "STR_STATUS":"Estat - prèst", "STR_INSTALL":"Installacion", "STR_UPDATE":"Mesa a jorn", - "STR_UPDATE_TIP":"La mesa a jorn es segura, los fichièrs ISO seràn pas modificats.#@Continhar ?", - "STR_INSTALL_TIP":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ?", - "STR_INSTALL_TIP2":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ? (confirmacion)", - "STR_INSTALL_SUCCESS":"Felicitacions !#@Ventoy es estat corrèctament installat sul periferic.", + "STR_UPDATE_TIP":"La mesa a jorn es segura, los fichièrs ISO seràn pas modificats.#@Continhar ?", + "STR_INSTALL_TIP":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ?", + "STR_INSTALL_TIP2":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ? (confirmacion)", + "STR_INSTALL_SUCCESS":"Felicitacion  !#@Ventoy es estat corrèctament installat sul periferic.", "STR_INSTALL_FAILED":"Una error s’es producha pendent l’installacion. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.", "STR_UPDATE_SUCCESS":"Felicitacions !#@Ventoy es estat corrèctament mes a jorn sul periferic.", "STR_UPDATE_FAILED":"Una error s’es producha pendent la mesa a jorn. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.", @@ -452,21 +542,31 @@ "STR_MENU_PART_CFG":"Configuracion de particion", "STR_BTN_OK":"OK", "STR_BTN_CANCEL":"Anullar", - "STR_PRESERVE_SPACE":"Preserve some space at the end of the disk", + "STR_PRESERVE_SPACE":"Servar d’espaci a la fin del disc", "STR_SPACE_VAL_INVALID":"Valor invalida per l’espaci reservat", "STR_MENU_CLEAR":"Escafar Ventoy", "STR_CLEAR_SUCCESS":"Ventoy es estat corrèctament tirat del periferic.", "STR_CLEAR_FAILED":"Una error s’es producha pendent l’esfaçament de Ventoy del disc. Podètz tornar brancar l’USB e tornar ensajar. Vejatz log.txt pels detalhs.", "STR_MENU_PART_STYLE":"Estil de particion", - "STR_DISK_2TB_MBR_ERROR":"Pels disques de mai de 2To seleccionatz GPT", + "STR_DISK_2TB_MBR_ERROR":"Pels disques de mai de 2 To seleccionatz GPT", "STR_SHOW_ALL_DEV":"Mostrar totes los periferics", - "STR_PART_ALIGN_4KB":"Alinhar las particions sus 4Ko", + "STR_PART_ALIGN_4KB":"Alinhar las particions sus 4 Ko", "STR_WEB_COMMUNICATION_ERR":"Error de comunicacion :", - "STR_WEB_REMOTE_ABNORMAL":"Error de comunicacion : remote abnormal", - "STR_WEB_REQUEST_TIMEOUT":"Error de comunicacion: requèsta tardièra", + "STR_WEB_REMOTE_ABNORMAL":"Error de comunicacion : remote abnormal", + "STR_WEB_REQUEST_TIMEOUT":"Error de comunicacion : requèsta tardièra", "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicacion : servici pas disponible", "STR_WEB_TOKEN_MISMATCH":"Estat del Daemon actualizat, tornatz ensajar mai tard.", "STR_WEB_SERVICE_BUSY":"Lo servici es ocupat, tornatz ensajar mai tard.", + "STR_MENU_VTSI_CREATE":"Generar lo fichièr VTSI", + "STR_VTSI_CREATE_TIP":"Aqueste còp cap d’escritura al disc, generacion del fichiet VTSI sonque#@Contunhar ?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"Fracàs de la creacion del fichièr VTSI.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -514,6 +614,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Erreur de communication : service inaccessible", "STR_WEB_TOKEN_MISMATCH":"Statut du démon mis à jour, veuillez réessayer plus tard.", "STR_WEB_SERVICE_BUSY":"Service surchargé, veuillez réessayer plus tard.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -561,6 +671,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -573,7 +693,7 @@ "STR_WARNING":"Advertencia", "STR_INFO":"Información", "STR_INCORRECT_DIR":"¡Por favor, ejecuta bajo el directorio correcto!", - "STR_INCORRECT_TREE_DIR":"No me ejecute aquí, por favor descarga el paquete de instalación lanzado, y ejecútalo allí.", + "STR_INCORRECT_TREE_DIR":"No me ejecutes aquí, por favor descarga el paquete de instalación lanzado, y ejecútalo allí.", "STR_DEVICE":"Dispositivo", "STR_LOCAL_VER":"Ventoy En Paquete", "STR_DISK_VER":"Ventoy En Dispositivo", @@ -584,20 +704,20 @@ "STR_INSTALL_TIP":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar?", "STR_INSTALL_TIP2":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar? (Doble Comprobación)", "STR_INSTALL_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido instalado exitosamente en el dispositivo.", - "STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", + "STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_UPDATE_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido actualizado exitosamente en el dispositivo.", - "STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", + "STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_WAIT_PROCESS":"Un hilo está ejecutándose, por favor espera...", "STR_MENU_OPTION":"Opción", "STR_MENU_SECURE_BOOT":"Soporte De Arranque Seguro", "STR_MENU_PART_CFG":"Configuración De Partición", - "STR_BTN_OK":"ACEPTAR", + "STR_BTN_OK":"Aceptar", "STR_BTN_CANCEL":"Cancelar", "STR_PRESERVE_SPACE":"Preservar algo de espacio al final del dispositivo", "STR_SPACE_VAL_INVALID":"Valor inválido para espacio reservado", "STR_MENU_CLEAR":"Limpiar Ventoy", "STR_CLEAR_SUCCESS":"Ventoy ha sido removido exitosamente desde el dispositivo.", - "STR_CLEAR_FAILED":"Ocurrió un error al limpiar Ventoy desde el dispositivo. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", + "STR_CLEAR_FAILED":"Ocurrió un error al limpiar Ventoy desde el dispositivo. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_MENU_PART_STYLE":"Estilo De Partición", "STR_DISK_2TB_MBR_ERROR":"Por favor selecciona GPT para dispositivos sobre 2TB", "STR_SHOW_ALL_DEV":"Mostrar Todos Los Dispositivos", @@ -608,13 +728,23 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: Servicio No Disponible", "STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.", "STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.", + "STR_MENU_VTSI_CREATE":"Generar Archivo VTSI", + "STR_VTSI_CREATE_TIP":"Esta vez no se escribirá al dispositivo, pero solo generará un archivo VTSI#@¿Continuar?", + "STR_VTSI_CREATE_SUCCESS":"¡Archivo VTSI creado exitosamente!#@Puedes usar Rufus(3.15+) para escribirlo al dispositivo a fin de completar la instalación de Ventoy.", + "STR_VTSI_CREATE_FAILED":"Fallo en el archivo VTSI creado.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Russian (PуÑÑкий)", "FontFamily":"Courier New", "FontSize":16, - "Author":"BL4CKH47H4CK3R", + "Author":"BL4CKH47H4CK3R, Teraskull, thehugonote", "STR_ERROR":"Ошибка", "STR_WARNING":"Предупреждение", @@ -629,11 +759,11 @@ "STR_UPDATE":"Обновить", "STR_UPDATE_TIP":"Обновление безопаÑно, ISO-файлы оÑтанутÑÑ Ð±ÐµÐ· изменений.#@Продолжить?", "STR_INSTALL_TIP":"ДиÑк будет отформатирован и вÑе данные будут потерÑны.#@Продолжить?", - "STR_INSTALL_TIP2":"ДиÑк будет отформатирован и вÑе данные будут потерÑны.#@Ð’Ñ‹ ДЕЙСТВИТЕЛЬÐО хотите продолжить?", + "STR_INSTALL_TIP2":"ДиÑк будет отформатирован и вÑе данные будут потерÑны.#@Ð’Ñ‹ дейÑтвительно хотите продолжить?", "STR_INSTALL_SUCCESS":"ПоздравлÑем!#@Ventoy был уÑпешно уÑтановлен на уÑтройÑтво.", - "STR_INSTALL_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте log.txt на ошибки.", + "STR_INSTALL_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте файл log.txt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.", "STR_UPDATE_SUCCESS":"ПоздравлÑем!#@Ventoy был уÑпешно обновлен на уÑтройÑтве.", - "STR_UPDATE_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте log.txt на ошибки.", + "STR_UPDATE_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте файл log.txt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.", "STR_WAIT_PROCESS":"ПроцеÑÑ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½, пожалуйÑта подождите...", "STR_MENU_OPTION":"Опции", "STR_MENU_SECURE_BOOT":"Поддержка Secure Boot", @@ -644,7 +774,7 @@ "STR_SPACE_VAL_INVALID":"Ðеверное значение размера раздела", "STR_MENU_CLEAR":"Удалить Ventoy", "STR_CLEAR_SUCCESS":"Ventoy был уÑпешно удалён Ñ ÑƒÑтройÑтва.", - "STR_CLEAR_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте log.txt на ошибки.", + "STR_CLEAR_FAILED":"Во Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ventoy произошла ошибка. Переподключите уÑтройÑтво и попробуйте Ñнова. Проверьте файл log.txt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.", "STR_MENU_PART_STYLE":"Стиль разметки разделов", "STR_DISK_2TB_MBR_ERROR":"ПожалуйÑта, выберите GPT Ð´Ð»Ñ Ð´Ð¸Ñков более 2ТБ", "STR_SHOW_ALL_DEV":"Показать вÑе уÑтройÑтва", @@ -655,6 +785,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Ошибка ÑвÑзи: Служба недоÑтупна", "STR_WEB_TOKEN_MISMATCH":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð´ÐµÐ¼Ð¾Ð½Ð° обновлен. Повторите попытку позже.", "STR_WEB_SERVICE_BUSY":"Служба занÑта, повторите попытку позже.", + "STR_MENU_VTSI_CREATE":"Создать файл VTSI", + "STR_VTSI_CREATE_TIP":"Ðа Ñтот раз Ventoy не будет уÑтановлен на уÑтройÑтво, а будет только Ñоздан файл VTSI#@Продолжить?", + "STR_VTSI_CREATE_SUCCESS":"Файл VTSI Ñоздан уÑпешно!#@Ð’Ñ‹ можете иÑпользовать Rufus(3.15+), чтобы запиÑать его на уÑтройÑтво, Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÑтановки Ventoy.", + "STR_VTSI_CREATE_FAILED":"Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° VTSI.", + "STR_MENU_PART_RESIZE":"ÐÐµÑ€Ð°Ð·Ñ€ÑƒÑˆÐ°ÑŽÑ‰Ð°Ñ ÑƒÑтановка", + "STR_PART_RESIZE_TIP":"Ventoy попробует неразрушающую уÑтановку, еÑли Ñто возможно. #@Продолжить?", + "STR_PART_RESIZE_SUCCESS":"ПоздравлÑем!#@ÐÐµÑ€Ð°Ð·Ñ€ÑƒÑˆÐ°ÑŽÑ‰Ð°Ñ ÑƒÑтановка Ventoy уÑпешно завершена.", + "STR_PART_RESIZE_FAILED":"Ðе удалоÑÑŒ выполнить неразрушающую уÑтановку, проверьте файл log.txt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.", + "STR_PART_RESIZE_UNSUPPORTED":"ÐÐµÑ€Ð°Ð·Ñ€ÑƒÑˆÐ°ÑŽÑ‰Ð°Ñ ÑƒÑтановка Ventoy оÑтановлена, поÑкольку некоторые уÑÐ»Ð¾Ð²Ð¸Ñ Ð½Ðµ могут быть выполнены. Проверьте файл log.txt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации.", + "STRXXX":"" }, { @@ -702,6 +842,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -749,53 +899,73 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Dutch (Nederlands)", "FontFamily":"Courier New", "FontSize":16, - "Author":"UmitCanbolat", + "Author":"UmitCanbolat, RockyTDR", "STR_ERROR":"Fout", "STR_WARNING":"Waarschuwing", "STR_INFO":"Info", - "STR_INCORRECT_DIR":"Voer Ventoy uit in de juiste directory!", + "STR_INCORRECT_DIR":"Voer Ventoy uit in de juiste map!", "STR_INCORRECT_TREE_DIR":"Ventoy kan hier niet worden uitgevoerd. Download het installatiepakket en probeer Ventoy daarmee te starten.", "STR_DEVICE":"Apparaat", "STR_LOCAL_VER":"Ventoy in pakket", "STR_DISK_VER":"Ventoy op apparaat", - "STR_STATUS":"Status - GEREED", + "STR_STATUS":"Status - KLAAR", "STR_INSTALL":"Installeren", "STR_UPDATE":"Bijwerken", "STR_UPDATE_TIP":"Upgraden is veilig: ISO-bestanden blijven ongewijzigd.#@Doorgaan?", - "STR_INSTALL_TIP":"De schijf wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan?", - "STR_INSTALL_TIP2":"De schijf wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan? (Dubbelcheck)", + "STR_INSTALL_TIP":"Het apparaat wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan?", + "STR_INSTALL_TIP2":"Het apparaat wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan? (Dubbelcheck)", "STR_INSTALL_SUCCESS":"Gefeliciteerd!#@Ventoy is met succes op het apparaat geïnstalleerd.", - "STR_INSTALL_FAILED":"Er is een fout opgetreden tijdens de installatie. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", - "STR_UPDATE_SUCCESS":"Gefeliciteerd!#@Ventoy is succesvol bijgewerkt op het apparaat.", - "STR_UPDATE_FAILED":"Er is een fout opgetreden tijdens de update. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", + "STR_INSTALL_FAILED":"Er is een fout opgetreden tijdens de installatie. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", + "STR_UPDATE_SUCCESS":"Gefeliciteerd!#@Ventoy is met succes bijgewerkt op het apparaat.", + "STR_UPDATE_FAILED":"Er is een fout opgetreden tijdens de update. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", "STR_WAIT_PROCESS":"Ventoy is nog bezig, even geduld...", "STR_MENU_OPTION":"Opties", - "STR_MENU_SECURE_BOOT":"Secure Boot", + "STR_MENU_SECURE_BOOT":"Ondersteuning voor Secure Boot", "STR_MENU_PART_CFG":"Partitieconfiguratie", - "STR_BTN_OK":"OK", + "STR_BTN_OK":"Ok", "STR_BTN_CANCEL":"Annuleren", "STR_PRESERVE_SPACE":"Ruimte aan het einde van de schijf reserveren", "STR_SPACE_VAL_INVALID":"Ongeldige waarde voor gereserveerde ruimte", "STR_MENU_CLEAR":"Ventoy verwijderen", - "STR_CLEAR_SUCCESS":"Ventoy is succesvol verwijderd van het apparaat.", - "STR_CLEAR_FAILED":"Er is een fout opgetreden bij het verwijderen van Ventoy. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", + "STR_CLEAR_SUCCESS":"Ventoy is met succes verwijderd van het apparaat.", + "STR_CLEAR_FAILED":"Er is een fout opgetreden bij het verwijderen van Ventoy. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", "STR_MENU_PART_STYLE":"Partitietabel", - "STR_DISK_2TB_MBR_ERROR":"Selecteer GPT als partitietabel voor schijven groter dan 2TB", - "STR_SHOW_ALL_DEV":"Toon alle apparaten", - "STR_PART_ALIGN_4KB":"Lijn partities uit met 4KB", - "STR_WEB_COMMUNICATION_ERR":"Communicatie fout:", - "STR_WEB_REMOTE_ABNORMAL":"Communicatiefout: abnormaal op afstand", + "STR_DISK_2TB_MBR_ERROR":"Selecteer GPT als partitietabel voor apparaten groter dan 2 TB", + "STR_SHOW_ALL_DEV":"Alle apparaten weergeven", + "STR_PART_ALIGN_4KB":"Partities uitlijnen met 4 KB", + "STR_WEB_COMMUNICATION_ERR":"Communicatiefout:", + "STR_WEB_REMOTE_ABNORMAL":"Communicatiefout: extern abnormaal", "STR_WEB_REQUEST_TIMEOUT":"Communicatiefout: time-out van verzoek", "STR_WEB_SERVICE_UNAVAILABLE":"Communicatiefout: service niet beschikbaar", "STR_WEB_TOKEN_MISMATCH":"Daemon-status bijgewerkt, probeer het later opnieuw.", "STR_WEB_SERVICE_BUSY":"Service is bezet, probeer het later opnieuw.", + "STR_MENU_VTSI_CREATE":"VTSI-bestand genereren", + "STR_VTSI_CREATE_TIP":"Deze keer wordt er niet naar het apparaat geschreven, maar wordt er alleen een VTSI-bestand gegenereerd#@Doorgaan?", + "STR_VTSI_CREATE_SUCCESS":"VTSI-bestand met succes aangemaakt!#@U kunt Rufus(3.15+) gebruiken om het bestand naar het apparaat te schrijven om de installatie van Ventoy te voltooien.", + "STR_VTSI_CREATE_FAILED":"Aanmaken van VTSI-bestand mislukt.", + "STR_MENU_PART_RESIZE":"Niet-destructieve installatie", + "STR_PART_RESIZE_TIP":"Ventoy zal indien mogelijk een niet-destructieve installatie proberen. #@Doorgaan?", + "STR_PART_RESIZE_SUCCESS":"Gefeliciteerd!#@De niet-destructieve installatie van Ventoy is met succes voltooid.", + "STR_PART_RESIZE_FAILED":"Niet-destructieve installatie mislukt. Controleer log.txt voor details.", + "STR_PART_RESIZE_UNSUPPORTED":"De niet-destructieve installatie van Ventoy is gestopt omdat aan sommige voorwaarden niet kan worden voldaan. Controleer log.txt voor details.", + "STRXXX":"" }, { @@ -843,100 +1013,130 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Japanese (日本語)", - "FontFamily":"Courier New", - "FontSize":16, - "Author":"taichi eto,Bentnand", + "FontFamily":"Yu Gothic UI", + "FontSize":14, + "Author":"taichi eto, Bentnand, cmplstofB", "STR_ERROR":"エラー", "STR_WARNING":"警告", "STR_INFO":"情報", "STR_INCORRECT_DIR":"æ­£ã—ã„ディレクトリーã§å®Ÿè¡Œã—ã¦ãã ã•ã„", - "STR_INCORRECT_TREE_DIR":"ã“ã“ã§å®Ÿè¡Œã™ã‚‹ã«ã¯ã€ãƒ‘ッケージをインストールã—ã¦ãã ã•ã„。.", - "STR_DEVICE":"デãƒã‚¤ã‚¹", - "STR_LOCAL_VER":"Ventoy In Package", - "STR_DISK_VER":"Ventoy In Device", - "STR_STATUS":"Status - 準備完了", - "STR_INSTALL":"インストール", + "STR_INCORRECT_TREE_DIR":"ã“ã®å ´æ‰€ã§å®Ÿè¡Œã™ã‚‹ã«ã¯ã€ãƒ‘ッケージを導入ã—ã¦ãã ã•ã„。", + "STR_DEVICE":"機器", + "STR_LOCAL_VER":"パッケージ中ã®Ventoy", + "STR_DISK_VER":"機器中ã®Ventoy", + "STR_STATUS":"状態 - 準備完了", + "STR_INSTALL":"å°Žå…¥", "STR_UPDATE":"æ›´æ–°", - "STR_UPDATE_TIP":"アップグレードå¯èƒ½ã§ã™ã€ISOファイルã¯æ”¹å¤‰ã•ã‚Œã¾ã›ã‚“。.#@続行?", - "STR_INSTALL_TIP":"é¸æŠžã•ã‚ŒãŸãƒ‡ã‚£ã‚¹ã‚¯ã¯å®Œå…¨ã«åˆæœŸåŒ–ã•ã‚Œã€ä¿å­˜ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯äºŒåº¦ã¨å¾©å…ƒã§ãã¾ã›ã‚“。#@続行?", - "STR_INSTALL_TIP2":"é¸æŠžã•ã‚ŒãŸãƒ‡ã‚£ã‚¹ã‚¯ã¯å®Œå…¨ã«åˆæœŸåŒ–ã•ã‚Œã€ä¿å­˜ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯äºŒåº¦ã¨å¾©å…ƒã§ãã¾ã›ã‚“。#@続行? (å†ç¢ºèª)", - "STR_INSTALL_SUCCESS":"Congratulations!#@Ventoy ã¯æ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã—ãŸ", - "STR_INSTALL_FAILED":"インストール中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚デãƒã‚¤ã‚¹ã‚’å†æŽ¥ç¶šã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。 詳細ログ log.txt ", - "STR_UPDATE_SUCCESS":"Congratulations!#@Ventoy ã¯æ­£å¸¸ã«ã‚¢ãƒƒãƒ—デートã•ã‚Œã¾ã—ãŸ.", - "STR_UPDATE_FAILED":"更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚デãƒã‚¤ã‚¹ã‚’å†æŽ¥ç¶šã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。. 詳細ログ log.txt", - "STR_WAIT_PROCESS":"処ç†ä¸­...", + "STR_UPDATE_TIP":"æ›´æ–°å¯èƒ½ã§ã™ã€ISOファイルã¯æ”¹å¤‰ã•ã‚Œã¾ã›ã‚“。#@続行ã—ã¾ã™ã‹ï¼Ÿ", + "STR_INSTALL_TIP":"é¸æŠžã—ãŸæ©Ÿå™¨ã¯å®Œå…¨ã«åˆæœŸåŒ–ã•ã‚Œã€ä¿å­˜ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯äºŒåº¦ã¨å¾©å…ƒã§ãã¾ã›ã‚“。#@続行ã—ã¾ã™ã‹ï¼Ÿ", + "STR_INSTALL_TIP2":"é¸æŠžã—ãŸæ©Ÿå™¨ã¯å®Œå…¨ã«åˆæœŸåŒ–ã•ã‚Œã€ä¿å­˜ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã¯äºŒåº¦ã¨å¾©å…ƒã§ãã¾ã›ã‚“。#@続行ã—ã¾ã™ã‹ï¼Ÿï¼ˆå†ç¢ºèªï¼‰", + "STR_INSTALL_SUCCESS":"ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚#@Ventoyã®å°Žå…¥ã¯æ­£å¸¸ã«è¡Œã‚ã‚Œã¾ã—ãŸã€‚", + "STR_INSTALL_FAILED":"導入中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚機器をå†æŽ¥ç¶šã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。詳細ãªè¨˜éŒ²ã¯ log.txt ã«ã‚ã‚Šã¾ã™ã€‚", + "STR_UPDATE_SUCCESS":"ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚#@Ventoyã®æ›´æ–°ã¯æ­£å¸¸ã«è¡Œã‚ã‚Œã¾ã—ãŸã€‚", + "STR_UPDATE_FAILED":"更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚機器をå†æŽ¥ç¶šã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。詳細ãªè¨˜éŒ²ã¯ log.txt ã«ã‚ã‚Šã¾ã™ã€‚", + "STR_WAIT_PROCESS":"スレッドãŒç¨¼å‹•ã—ã¦ã„ã¾ã™ã€‚ãŠå¾…ã¡ãã ã•ã„...", "STR_MENU_OPTION":"設定", - "STR_MENU_SECURE_BOOT":"Secure Boot", - "STR_MENU_PART_CFG":"パーティション構æˆ", - "STR_BTN_OK":"OK", - "STR_BTN_CANCEL":"キャンセル", - "STR_PRESERVE_SPACE":"ディスクã®ä¸‹éƒ¨ã«ã‚る程度ã®ã‚¹ãƒšãƒ¼ã‚¹ã‚’確ä¿ã™ã‚‹", - "STR_SPACE_VAL_INVALID":"予約スペースã®ç„¡åŠ¹ãªå€¤", + "STR_MENU_SECURE_BOOT":"セキュアブート", + "STR_MENU_PART_CFG":"区画構æˆ", + "STR_BTN_OK":"了解", + "STR_BTN_CANCEL":"å–消", + "STR_PRESERVE_SPACE":"機器ã®æœ€å¾Œã«é ˜åŸŸã‚’確ä¿ã™ã‚‹", + "STR_SPACE_VAL_INVALID":"確ä¿ã™ã‚‹é ˜åŸŸã®å€¤ãŒç„¡åŠ¹ã§ã™", "STR_MENU_CLEAR":"Ventoyを削除", - "STR_CLEAR_SUCCESS":"VentoyãŒãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚", - "STR_CLEAR_FAILED":"Ventoyをディスクã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚USBã‚’å†æŒ¿å…¥ã—ã¦ã¿ã¦ãã ã•ã„。 詳細ログ log.txt", - "STR_MENU_PART_STYLE":"パーティションスタイル", - "STR_DISK_2TB_MBR_ERROR":"2TB以上ã®ãƒ‡ã‚£ã‚¹ã‚¯ã«ã¯GPTを使用ã—ã¦ãã ã•ã„。", - "STR_SHOW_ALL_DEV":"ã™ã¹ã¦ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’表示", - "STR_PART_ALIGN_4KB":"パーティションを4KBã«æƒãˆã‚‹", - "STR_WEB_COMMUNICATION_ERR":"Communication error:", - "STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", - "STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", - "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", - "STR_WEB_TOKEN_MISMATCH":"デーモンã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†è©¦è¡Œã—ã¦ãã ã•ã„。", - "STR_WEB_SERVICE_BUSY":"サービスãŒãƒ“ジーã§ã™ã€‚後ã§å†è©¦è¡Œã—ã¦ãã ã•ã„。", + "STR_CLEAR_SUCCESS":"VentoyãŒæ©Ÿå™¨ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚", + "STR_CLEAR_FAILED":"Ventoyを機器ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚機器をå†æŽ¥ç¶šã—ã¦ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。詳細ãªè¨˜éŒ²ã¯ log.txt ã«ã‚ã‚Šã¾ã™ã€‚", + "STR_MENU_PART_STYLE":"区画ã®æ§‹æˆæ–¹å¼", + "STR_DISK_2TB_MBR_ERROR":"2TB以上ã®æ©Ÿå™¨ã«ã¯GPTを使用ã—ã¦ãã ã•ã„。", + "STR_SHOW_ALL_DEV":"ã™ã¹ã¦ã®æ©Ÿå™¨ã‚’表示", + "STR_PART_ALIGN_4KB":"区画å˜ä½ã‚’4KBã«æƒãˆã‚‹", + "STR_WEB_COMMUNICATION_ERR":"通信エラー:", + "STR_WEB_REMOTE_ABNORMAL":"通信エラー: 通信先ã§ç•°å¸¸ãŒç™ºç”Ÿã—ã¦ã„ã¾ã™", + "STR_WEB_REQUEST_TIMEOUT":"通信エラー: è¦æ±‚ãŒæ™‚間切れã—ã¾ã—ãŸ", + "STR_WEB_SERVICE_UNAVAILABLE":"通信エラー: サービスãŒåˆ©ç”¨ã§ãã¾ã›ã‚“", + "STR_WEB_TOKEN_MISMATCH":"デーモンã®çŠ¶æ…‹ãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†è©¦è¡Œã—ã¦ãã ã•ã„。", + "STR_WEB_SERVICE_BUSY":"サービスãŒç¹å¿™ã§ã™ã€‚後ã§å†è©¦è¡Œã—ã¦ãã ã•ã„。", + "STR_MENU_VTSI_CREATE":"VTSIファイルを生æˆã™ã‚‹", + "STR_VTSI_CREATE_TIP":"VTSIファイルを生æˆã—,記憶装置ã¸ã®æ›¸ãè¾¼ã¿ã¯è¡Œã„ã¾ã›ã‚“。#@続行ã—ã¾ã™ã‹ï¼Ÿ", + "STR_VTSI_CREATE_SUCCESS":"VTSIファイルãŒç”Ÿæˆã•ã‚Œã¾ã—ãŸã€‚#@Rufus(3.15以上ã®ç‰ˆï¼‰ã‚’使ã£ã¦è¨˜æ†¶è£…ç½®ã«æ›¸ã込んã§ï¼ŒVentoyã®å°Žå…¥ã‚’完é‚ã—ã¾ã—ょã†ã€‚", + "STR_VTSI_CREATE_FAILED":"VTSIファイルを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚", + "STR_MENU_PART_RESIZE":"éžç ´å£Šçš„å°Žå…¥", + "STR_PART_RESIZE_TIP":"Ventoyを(å¯èƒ½ã§ã‚ã‚Œã°ï¼‰éžç ´å£Šçš„ã«å°Žå…¥ã—ã¾ã™ã€‚#@続行ã—ã¾ã™ã‹ï¼Ÿ", + "STR_PART_RESIZE_SUCCESS":"ãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™ã€‚#@Ventoyã®éžç ´å£Šçš„å°Žå…¥ã¯æ­£å¸¸ã«è¡Œã‚ã‚Œã¾ã—ãŸã€‚", + "STR_PART_RESIZE_FAILED":"Ventoyã‚’éžç ´å£Šçš„ã«å°Žå…¥ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚詳細ãªè¨˜éŒ²ã¯ log.txt ã«ã‚ã‚Šã¾ã™ã€‚", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoyã‚’éžç ´å£Šçš„ã«å°Žå…¥ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚éžç ´å£Šçš„å°Žå…¥ã«ã‚ãŸã£ã¦ã®è¦ä»¶ãŒæº€ãŸã•ã‚Œã¦ã„ã¾ã›ã‚“。詳細ãªè¨˜éŒ²ã¯ log.txt ã«ã‚ã‚Šã¾ã™ã€‚", + "STRXXX":"" }, { "name":"Italian (Italiano)", "FontFamily":"Courier New", "FontSize":16, - "Author":"AverageUser2", + "Author":"AverageUser2,Albano Battistella,bovirus", "STR_ERROR":"Errore", "STR_WARNING":"Attenzione", "STR_INFO":"Info", - "STR_INCORRECT_DIR":"Si prega di eseguire nella cartella corretta", - "STR_INCORRECT_TREE_DIR":"Non eseguire qui, scarica il pacchetto di installazione ed avvialo", + "STR_INCORRECT_DIR":"Eseguilo nella cartella corretta", + "STR_INCORRECT_TREE_DIR":"Non eseguirlo qui.#@Scarica il pacchetto di installazione ed avvialo.", "STR_DEVICE":"Dispositivo", - "STR_LOCAL_VER":"Versione Ventoy locale", + "STR_LOCAL_VER":"Versione locale di Ventoy", "STR_DISK_VER":"Ventoy nel dispositivo", "STR_STATUS":"Stato - PRONTO", "STR_INSTALL":"Installa", "STR_UPDATE":"Aggiorna", - "STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Continue?", - "STR_INSTALL_TIP":"Il disco verrà formattato e tutti i dati saranno persi.#@Continue?", - "STR_INSTALL_TIP2":"Il disco verrà formattato e tutti i dati saranno persi.#@Continue?' (Seconda Verifica)", - "STR_INSTALL_SUCCESS":"Congratulazioni!#@Ventoy è stato installato con successo nel dispositivo", - "STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione. Reinserisci il dispostivo e riprova. Controlla il file log.txt per i dettagli.", - "STR_UPDATE_SUCCESS":"Congratulazioni!#@Ventoy è stato aggiornato con successo nel dispositivo", - "STR_UPDATE_FAILED":"Si è verificato un errore durante l'aggiornamento. Reinserisci il dispostivo e riprova. Controlla il file log.txt per i dettagli.", - "STR_WAIT_PROCESS":"Un processo è in esecuzione, attendere prego...", + "STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Vuoi continuare?", + "STR_INSTALL_TIP":"Il disco verrà formattato e tutti i dati saranno persi.#@Vuoi continuare?", + "STR_INSTALL_TIP2":"Il disco verrà formattato e tutti i dati saranno persi.#@Vuoi continuare (seconda verifica)?", + "STR_INSTALL_SUCCESS":"Congratulazioni!#@Installazione di Ventoy nel dispositivo completata.", + "STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt .", + "STR_UPDATE_SUCCESS":"Congratulazioni!#@Aggiornamento di Ventoy nel dispositivo completato", + "STR_UPDATE_FAILED":"Si è verificato un errore durante l'aggiornamento.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt.", + "STR_WAIT_PROCESS":"Un processo è in esecuzione. Attendi...", "STR_MENU_OPTION":"Opzioni", "STR_MENU_SECURE_BOOT":"Avvio protetto (secure boot)", - "STR_MENU_PART_CFG":"Configurazione della partizione", + "STR_MENU_PART_CFG":"Configurazione partizione", "STR_BTN_OK":"OK", "STR_BTN_CANCEL":"Annulla", - "STR_PRESERVE_SPACE":"Conserva spazio nella parte finale del disco", + "STR_PRESERVE_SPACE":"Riserva spazio nella parte finale del disco", "STR_SPACE_VAL_INVALID":"Quantità di spazio da riservare non valida", "STR_MENU_CLEAR":"Rimuovi Ventoy", - "STR_CLEAR_SUCCESS":"Ventoy è stato rimosso con successo dal dispositivo.", - "STR_CLEAR_FAILED":"Si è verificato un errore durante la rimozione di Ventoy dal dispositivo. Reinserisci il dispositivo e riprova. Controlla il file log.txt per maggiori dettagli", - "STR_MENU_PART_STYLE":"Stile Tabella delle partizioni", + "STR_CLEAR_SUCCESS":"Rimozione di Ventoy dal dispositivo completata.", + "STR_CLEAR_FAILED":"Si è verificato un errore durante la rimozione di Ventoy dal dispositivo.#@Riconnetti il dispositivo e riprova.#@Per i dettagli controlla il file log.txt.", + "STR_MENU_PART_STYLE":"Stile tabella partizioni", "STR_DISK_2TB_MBR_ERROR":"Seleziona GPT per dischi con dimensioni maggiori di 2TB", - "STR_SHOW_ALL_DEV":"Mostra tutti i dispositivi", + "STR_SHOW_ALL_DEV":"Visualizza tutti i dispositivi", "STR_PART_ALIGN_4KB":"Allinea le partizioni con 4KB", - "STR_WEB_COMMUNICATION_ERR":"Communication error:", - "STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", - "STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", - "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", - "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", - "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_WEB_COMMUNICATION_ERR":"Errore di comunicazione:", + "STR_WEB_REMOTE_ABNORMAL":"Errore di comunicazione: remoto anormale", + "STR_WEB_REQUEST_TIMEOUT":"Errore di comunicazione: richiesta scaduta", + "STR_WEB_SERVICE_UNAVAILABLE":"Errore di comunicazione: servizio non disponibile", + "STR_WEB_TOKEN_MISMATCH":"Stato del demone aggiornato. Riprova più tardi.", + "STR_WEB_SERVICE_BUSY":"Il servizio è occupato. Riprova più tardi.", + "STR_MENU_VTSI_CREATE":"Genera file VTSI", + "STR_VTSI_CREATE_TIP":"Questa volta non scriverà sul dispositivo, ma genererà solo un file VTSI#@Vuoi continuare?", + "STR_VTSI_CREATE_SUCCESS":"Creazione file VTSI completata!#@Per scrivere nel dispositivo in modo da completare l'installazione di Ventoy puoi usare Rufus (versione 3.15 o successiva).", + "STR_VTSI_CREATE_FAILED":"Creazione file VTSI non riuscita.", + "STR_MENU_PART_RESIZE":"Installazione non distruttiva", + "STR_PART_RESIZE_TIP":"Ventoy proverà, se possibile, l'installazione non distruttiva.#@Vuoi continuare?", + "STR_PART_RESIZE_SUCCESS":"Congratulazioni!#@Installazione non distruttiva di Ventoy completata.", + "STR_PART_RESIZE_FAILED":"Installazione non distruttiva fallita.#@Per i dettagli controlla il file log.txt.", + "STR_PART_RESIZE_UNSUPPORTED":"L'installazione non distruttiva di Ventoy è stata interrotta perché alcune condizioni non possono essere soddisfatte.#@Per i dettagli controlla il file log.txt.", + "STRXXX":"" }, { @@ -984,6 +1184,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1031,13 +1241,23 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { - "name":"Chinese Traditional (ç¹é«”中文)", + "name":"Traditional Chinese(正體中文)", "FontFamily":"新細明體", "FontSize":14, - "Author":"penut85420", + "Author":"penut85420,tony8077616", "STR_ERROR":"錯誤", "STR_WARNING":"警告", @@ -1045,39 +1265,49 @@ "STR_INCORRECT_DIR":"請在正確的資料夾下開啟ï¼", "STR_INCORRECT_TREE_DIR":"請下載並使用發行版本的安è£åŒ…", "STR_DEVICE":"è£ç½®", - "STR_LOCAL_VER":"ç•¶å‰ Ventoy 版本", - "STR_DISK_VER":"è£ç½®å…§éƒ¨çš„ Ventoy 版本", + "STR_LOCAL_VER":"安è£åŒ…å…§ Ventoy 版本", + "STR_DISK_VER":"è£ç½®å…§ Ventoy 版本", "STR_STATUS":"狀態 - 準備就緒", "STR_INSTALL":"安è£", "STR_UPDATE":"å‡ç´š", - "STR_UPDATE_TIP":"å‡ç´šæ“作是安全的,ç£ç¢Ÿå…§çš„ ISO 文件ä¸æœƒè¢«æ¸…除#@是å¦ç¹¼çºŒï¼Ÿ", - "STR_INSTALL_TIP":"ç£ç¢Ÿå°‡æœƒè¢«æ ¼å¼åŒ–,所有內容將會被清除ï¼#@是å¦ç¹¼çºŒï¼Ÿ", - "STR_INSTALL_TIP2":"ç£ç¢Ÿå°‡æœƒè¢«æ ¼å¼åŒ–,所有內容將會被清除ï¼#@å†æ¬¡ç¢ºèªæ˜¯å¦ç¹¼çºŒï¼Ÿ", + "STR_UPDATE_TIP":"å‡ç´šæ“作是安全的,ç£ç¢Ÿå…§çš„ ISO 檔案ä¸æœƒè¢«æ¸…除#@è«‹å•æ˜¯å¦ç¹¼çºŒï¼Ÿ", + "STR_INSTALL_TIP":"ç£ç¢Ÿå°‡æœƒè¢«æ ¼å¼åŒ–,所有內容將會被清除ï¼#@è«‹å•æ˜¯å¦ç¹¼çºŒï¼Ÿ", + "STR_INSTALL_TIP2":"ç£ç¢Ÿå°‡æœƒè¢«æ ¼å¼åŒ–,所有內容將會被清除ï¼#@è«‹å†æ¬¡ç¢ºèªæ˜¯å¦ç¹¼çºŒï¼Ÿ", "STR_INSTALL_SUCCESS":"æ­å–œï¼ŒVentoy 已經æˆåŠŸå®‰è£åˆ°æ­¤è£ç½®ä¸­ï¼", - "STR_INSTALL_FAILED":"å®‰è£ Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹é‡æ–°æ’å…¥ç£ç¢Ÿä¸¦é‡è©¦ä¸€æ¬¡ï¼Œè©³ç´°è¨Šæ¯è«‹èª¿é–± log.txt 文件。", + "STR_INSTALL_FAILED":"å®‰è£ Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹å†æ¬¡é‡æ–°æ’å…¥ç£ç¢Ÿé‡è©¦ï¼Œè©³ç´°è¨Šæ¯è«‹æª¢è¦– log.txt 檔案。", "STR_UPDATE_SUCCESS":"æ­å–œï¼Œæ–°ç‰ˆæœ¬çš„ Ventoy 已經æˆåŠŸæ›´æ–°åˆ°æ­¤è£ç½®ä¸­ï¼", - "STR_UPDATE_FAILED":"æ›´æ–° Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹é‡æ–°æ’å…¥ç£ç¢Ÿä¸¦é‡è©¦ä¸€æ¬¡ï¼Œè©³ç´°è¨Šæ¯è«‹èª¿é–± log.txt 文件。", - "STR_WAIT_PROCESS":"ç›®å‰æœ‰åŸ·è¡Œç·’正在é‹ä½œä¸­ï¼Œè«‹ç¨å€™", + "STR_UPDATE_FAILED":"æ›´æ–° Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹å†æ¬¡é‡æ–°æ’å…¥ç£ç¢Ÿé‡è©¦ï¼Œè©³ç´°è¨Šæ¯è«‹æª¢è¦– log.txt 檔案。", + "STR_WAIT_PROCESS":"ç›®å‰ä»æœ‰åŸ·è¡Œç·’正在é‹ä½œä¸­ï¼Œè«‹ç¨å€™...", "STR_MENU_OPTION":"é¸é …", - "STR_MENU_SECURE_BOOT":"æ”¯æ´ Secure Boot", - "STR_MENU_PART_CFG":"分å€é…ç½®", + "STR_MENU_SECURE_BOOT":"支æ´å®‰å…¨é–‹æ©Ÿ", + "STR_MENU_PART_CFG":"分割å€é…ç½®", "STR_BTN_OK":"確定", "STR_BTN_CANCEL":"å–消", - "STR_PRESERVE_SPACE":"在ç£ç›¤æœ€å¾Œä¿ç•™ä¸€éƒ¨åˆ†ç©ºé–“", - "STR_SPACE_VAL_INVALID":"ä¿ç•™ç©ºé–“的大å°ä¸åˆæ³•", - "STR_MENU_CLEAR":"清除Ventoy", - "STR_CLEAR_SUCCESS":"Ventoyå·²æˆåŠŸå¾žè¨­å‚™ä¸­æ¸…除", - "STR_CLEAR_FAILED":"清除 Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹é‡æ–°æ’å…¥ç£ç¢Ÿä¸¦é‡è©¦ä¸€æ¬¡ï¼Œè©³ç´°è¨Šæ¯è«‹èª¿é–± log.txt 文件。", - "STR_MENU_PART_STYLE":"分å€æ ¼å¼", - "STR_DISK_2TB_MBR_ERROR":"å°æ–¼è¶…éŽ2TBçš„ç£ç‰‡è«‹é¸æ“‡GPT分å€æ ¼å¼", - "STR_SHOW_ALL_DEV":"顯示所有設備", - "STR_PART_ALIGN_4KB":"分å€æŒ‰ç…§4KBå°é½Š", - "STR_WEB_COMMUNICATION_ERR":"通信錯誤:", - "STR_WEB_REMOTE_ABNORMAL":"通信錯誤: æœå‹™ç«¯ç•°å¸¸", - "STR_WEB_REQUEST_TIMEOUT":"通信錯誤: 請求超時", - "STR_WEB_SERVICE_UNAVAILABLE":"通信錯誤: æœå‹™ä¸å¯ç”¨", - "STR_WEB_TOKEN_MISMATCH":"æœå‹™ç‹€æ…‹å·²æ›´æ–°", - "STR_WEB_SERVICE_BUSY":"æœå‹™æ­£å¿™ï¼Œè«‹ç¨å¾Œé‡è©¦", + "STR_PRESERVE_SPACE":"在ç£å€æœ€å¾Œä¿ç•™ä¸€éƒ¨åˆ†ç©ºé–“", + "STR_SPACE_VAL_INVALID":"ä¿ç•™ç©ºé–“的容é‡ä¸æ­£ç¢º", + "STR_MENU_CLEAR":"清除 Ventoy", + "STR_CLEAR_SUCCESS":"Ventoy å·²æˆåŠŸå¾žè£ç½®ä¸­æ¸…除", + "STR_CLEAR_FAILED":"清除 Ventoy çš„éŽç¨‹ä¸­ç™¼ç”ŸéŒ¯èª¤ï¼Œè«‹å†æ¬¡é‡æ–°æ’å…¥ç£ç¢Ÿé‡è©¦ï¼Œè©³ç´°è¨Šæ¯è«‹æª¢è¦– log.txt 檔案。", + "STR_MENU_PART_STYLE":"分割表格å¼", + "STR_DISK_2TB_MBR_ERROR":"è¶…éŽ 2TB çš„ç£ç¢Ÿè«‹é¸æ“‡ GPT 分割表格å¼", + "STR_SHOW_ALL_DEV":"顯示所有è£ç½®", + "STR_PART_ALIGN_4KB":"ç£ç¢Ÿåˆ†å‰²å€æŒ‰ç…§ 4KB å°é½Š", + "STR_WEB_COMMUNICATION_ERR":"通訊錯誤:", + "STR_WEB_REMOTE_ABNORMAL":"通訊錯誤: 伺æœå™¨ç«¯ç™¼ç”Ÿç•°å¸¸", + "STR_WEB_REQUEST_TIMEOUT":"通訊錯誤: 請求逾時", + "STR_WEB_SERVICE_UNAVAILABLE":"通訊錯誤: 伺æœå™¨ç„¡æ³•ä½¿ç”¨", + "STR_WEB_TOKEN_MISMATCH":"伺æœå™¨ç‹€æ…‹å·²æ›´æ–°", + "STR_WEB_SERVICE_BUSY":"伺æœå™¨å¿™ç¢Œä¸­ï¼Œè«‹ç¨å¾Œå†è©¦", + "STR_MENU_VTSI_CREATE":"建立 VTSI 檔案", + "STR_VTSI_CREATE_TIP":"這個æ“作將åªæœƒåœ¨åŽŸåœ°ç›®éŒ„建立一個 VTSI 的檔案#@è«‹å•æ˜¯å¦ç¹¼çºŒï¼Ÿ", + "STR_VTSI_CREATE_SUCCESS":"VTSI 檔案建立完æˆï¼#@您å¯ä»¥ä½¿ç”¨ Rufus(3.15+) å°‡ VTSI 檔案寫入指定的è£ç½®ä»¥å®Œæˆ Ventoy 的安è£ã€‚", + "STR_VTSI_CREATE_FAILED":"VTSI 檔案建立失敗。", + "STR_MENU_PART_RESIZE":"ç„¡æ安è£", + "STR_PART_RESIZE_TIP":"Ventoy 將嘗試進行無æ安è£ã€‚#@請注æ„:任何å°æ–¼ç£ç¢Ÿçš„任何æ“作都存在一定的風險,å°æ–¼é‡è¦çš„資料建議您åšå¥½å‚™ä»½ï¼#@è«‹å•æ‚¨æ˜¯å¦ç¹¼çºŒï¼Ÿ", + "STR_PART_RESIZE_SUCCESS":"æ­å–œï¼#@Ventoy 已完æˆç„¡æ安è£ã€‚", + "STR_PART_RESIZE_FAILED":"Ventoy ç„¡æ安è£å¤±æ•—。詳細訊æ¯è«‹æª¢è¦– log.txt 檔案。", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy ç„¡æ安è£å·²ä¸­æ­¢å› ç‚ºæœªæ»¿è¶³éƒ¨åˆ†æ¢ä»¶ã€‚詳細訊æ¯è«‹æª¢è¦– log.txt 檔案。", + "STRXXX":"" }, { @@ -1125,6 +1355,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"GreÅ¡ka u komunikaciji: Servis nije dostupan", "STR_WEB_TOKEN_MISMATCH":"Status demona ažuriran, pokuÅ¡ajte ponovo kasnije.", "STR_WEB_SERVICE_BUSY":"Servis je zauzet, pokuÅ¡ajte ponovo kasnije.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1172,6 +1412,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Комуникациона грешка: Ð¡ÐµÑ€Ð²Ð¸Ñ Ñ˜Ðµ недоÑтупан", "STR_WEB_TOKEN_MISMATCH":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð´ÐµÐ¼Ð¾Ð½Ð° ажуриран, покушајте поново каÑније.", "STR_WEB_SERVICE_BUSY":"Ð¡ÐµÐ²Ð¸Ñ Ñ˜Ðµ заузет, покушајте поново каÑније.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1219,6 +1469,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1266,6 +1526,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikasjonsfeil: Tjeneste utilgjengelig", "STR_WEB_TOKEN_MISMATCH":"Daemon status er oppdatert, vennligst prøv igjen senere.", "STR_WEB_SERVICE_BUSY":"Tjenesten er opptatt, vennligst prøv igjen senere.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1285,12 +1555,12 @@ "STR_STATUS":"Trạng thái - SẴN SÀNG", "STR_INSTALL":"Cài đặt", "STR_UPDATE":"Cập nhật", - "STR_UPDATE_TIP":"Việc cập nhật Ventoy là an toàn, các tập tin ISO của bạn sẽ được giữ nguyên trạng.#@ Bạn thật sá»± muốn tiếp tục ?.", - "STR_INSTALL_TIP":"Thiết bị sẽ được định dạng và do đó TẤT CẢ Dá»® LIỆU trên thiết bị sẽ bị mất.#@ Bạn thật sá»± muốn tiếp tục ?.", - "STR_INSTALL_TIP2":"Thiết bị sẽ được định dạng và do đó TẤT CẢ Dá»® LIỆU trên thiết bị sẽ bị mất.#@ Bạn thật sá»± muốn tiếp tục ?. (Xác nhận lần hai)", - "STR_INSTALL_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được cài Ventoy thành công.", + "STR_UPDATE_TIP":"Việc cập nhật Ventoy là an toàn, các tập tin ISO của bạn sẽ được giữ nguyên trạng.#@Bạn thật sá»± muốn tiếp tục?", + "STR_INSTALL_TIP":"Thiết bị sẽ được định dạng và do đó TẤT CẢ Dá»® LIỆU trên thiết bị sẽ bị mất.#@Bạn thật sá»± muốn tiếp tục?", + "STR_INSTALL_TIP2":"Thiết bị sẽ được định dạng và do đó TẤT CẢ Dá»® LIỆU trên thiết bị sẽ bị mất.#@Bạn thật sá»± muốn tiếp tục? (Xác nhận lần hai)", + "STR_INSTALL_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được cài Ventoy thành công.", "STR_INSTALL_FAILED":"Äã xảy ra lá»—i trong quá trình cài đặt Ventoy. Bạn có thể rút thiết bị ra và thá»­ lại. Xem chi tiết ở tệp log.txt.", - "STR_UPDATE_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được cập nhật Ventoy thành công.", + "STR_UPDATE_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được cập nhật Ventoy thành công.", "STR_UPDATE_FAILED":"Äã xảy ra lá»—i trong quá trình cập nhật Ventoy. Bạn có thể rút thiết bị ra và thá»­ lại. Xem chi tiết ở tệp log.txt.", "STR_WAIT_PROCESS":"Má»™t luồng xá»­ lý Ä‘ang chạy, vui lòng chá»...", "STR_MENU_OPTION":"Tùy chá»n", @@ -1301,7 +1571,7 @@ "STR_PRESERVE_SPACE":"Giữ lại phần dung lượng ở cuối thiết bị", "STR_SPACE_VAL_INVALID":"Giá trị dung lượng giữ lại không hợp lệ.", "STR_MENU_CLEAR":"Gỡ bá» Ventoy", - "STR_CLEAR_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được gỡ bá» Ventoy thành công.", + "STR_CLEAR_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được gỡ bá» Ventoy thành công.", "STR_CLEAR_FAILED":"Äã xảy ra lá»—i trong quá trình gỡ bá» Ventoy. Bạn có thể rút thiết bị ra và thá»­ lại. Xem chi tiết ở tệp log.txt.", "STR_MENU_PART_STYLE":"Kiểu phân vùng", "STR_DISK_2TB_MBR_ERROR":"Thiết bị có dung lượng lá»›n hÆ¡n 2TB. Vui lòng chá»n Kiểu phân vùng là GPT.", @@ -1313,6 +1583,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Lá»—i giao tiếp: Dịch vụ không sẵn có", "STR_WEB_TOKEN_MISMATCH":"Äã cập nhật trạng thái Daemon, vui lòng thá»­ lại sau.", "STR_WEB_SERVICE_BUSY":"Dịch vụ bận, vui lòng thá»­ lại sau.", + "STR_MENU_VTSI_CREATE":"Tạo tệp VTSI", + "STR_VTSI_CREATE_TIP":"Lần này sẽ không ghi vào thiết bị, chỉ tạo má»™t tệp VTSI#@Bạn muốn tiếp tục?", + "STR_VTSI_CREATE_SUCCESS":"Tạo tệp VTSI thành công!#@Äể hoàn thành cài đặt Ventoy, bạn có thể dùng Rufus (3.15+) để ghi tệp này vào thiết bị.", + "STR_VTSI_CREATE_FAILED":"Tạo tệp VTSI đã gặp lá»—i.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1360,6 +1640,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1407,6 +1697,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"КомуникациÑка грешка: ÐедоÑтапен ÑервиÑ", "STR_WEB_TOKEN_MISMATCH":"Ðжуриран ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° даемонот, молиме обидете Ñе подоцна.", "STR_WEB_SERVICE_BUSY":"СервиÑот е зафатен, молиме обидете Ñе подоцна.", + "STR_MENU_VTSI_CREATE":"Генерирај VTSI датотека", + "STR_VTSI_CREATE_TIP":"Овој пат ништо нема да Ñе запише на уредот туку Ñамо ќе Ñе генерира VTSI датотека#@Продолжи?", + "STR_VTSI_CREATE_SUCCESS":"УÑпешно креирана VTSI датотека!#@Можете да го кориÑтите Rufus(3.15+) за да ја запишете на уредот како и да ја комплетирате инÑталацијата на Ventoy.", + "STR_VTSI_CREATE_FAILED":"Креирањето на VTSI датотека е неуÑпешно.", + "STR_MENU_PART_RESIZE":"ÐедеÑтруктивна инÑталација", + "STR_PART_RESIZE_TIP":"Ventoy ќе Ñе обиде Ñо недеÑтруктивна инÑталација доколку е возможно. #@Продолжи?", + "STR_PART_RESIZE_SUCCESS":"ЧеÑтитки! ÐедеÑтруктивната инÑталација е уÑпешно завршена.", + "STR_PART_RESIZE_FAILED":"ÐедеÑтруктивната инÑталација не уÑпеа. Проверете го log.txt за детали.", + "STR_PART_RESIZE_UNSUPPORTED":"ÐедеÑтруктивната инÑталација на Ventoy е запрена бидејќи некои уÑлови не Ñе иÑполнети. Проверете го log.txt за детали.", + "STRXXX":"" }, { @@ -1454,19 +1754,29 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Portuguese (Português de Portugal)", "FontFamily":"Courier New", "FontSize":16, - "Author":"Eskiso", + "Author":"Eskiso, Hugo Carvalho", "STR_ERROR":"Erro", "STR_WARNING":"Aviso", "STR_INFO":"Info", - "STR_INCORRECT_DIR":"Por favor, execute na pasta correta!", - "STR_INCORRECT_TREE_DIR":"Não me execute aqui, por favor transfira o pacote de instalação, e execute lá.", + "STR_INCORRECT_DIR":"Execute na pasta correta!", + "STR_INCORRECT_TREE_DIR":"Não me execute aqui, transfira o pacote de instalação e execute lá.", "STR_DEVICE":"Dispositivo", "STR_LOCAL_VER":"Ventoy em pacote", "STR_DISK_VER":"Ventoy no dispositivo", @@ -1477,35 +1787,45 @@ "STR_INSTALL_TIP":"O disco será formatado e todos os dados serão perdidos.#@Continuar?", "STR_INSTALL_TIP2":"O disco será formatado e todos os dados serão perdidos.#@Continuar? (Confirmação)", "STR_INSTALL_SUCCESS":"Parabéns!#@Ventoy foi instalado com sucesso no dispositivo.", - "STR_INSTALL_FAILED":"Um erro ocorreu durante a instalação. Pode reconectar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", + "STR_INSTALL_FAILED":"Ocorreu um erro durante a instalação. Pode voltar a ligar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", "STR_UPDATE_SUCCESS":"Parabéns!#@Ventoy foi atualizado com sucesso no dispositivo.", - "STR_UPDATE_FAILED":"Um erro ocorreu durante a atualização. Pode reconectar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", - "STR_WAIT_PROCESS":"Uma thread está em execução, por favor espere...", + "STR_UPDATE_FAILED":"Ocorreu um erro durante a atualização. Pode voltar a ligar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", + "STR_WAIT_PROCESS":"Uma thread está em execução, aguarde...", "STR_MENU_OPTION":"Opção", - "STR_MENU_SECURE_BOOT":"Boot seguro", - "STR_MENU_PART_CFG":"Configuração da Partição", - "STR_BTN_OK":"OK", + "STR_MENU_SECURE_BOOT":"Arranque seguro", + "STR_MENU_PART_CFG":"Configuração da partição", + "STR_BTN_OK":"Aceitar", "STR_BTN_CANCEL":"Cancelar", - "STR_PRESERVE_SPACE":"Preservar algum espaço no final do disco", - "STR_SPACE_VAL_INVALID":"Valor invalido para o espaço reservado", + "STR_PRESERVE_SPACE":"Reservar algum espaço no final do disco", + "STR_SPACE_VAL_INVALID":"Valor inválido para o espaço reservado", "STR_MENU_CLEAR":"Remover o Ventoy", "STR_CLEAR_SUCCESS":"O Ventoy foi removido deste dispositivo com sucesso.", - "STR_CLEAR_FAILED":"Um erro ocorreu ao remover o Ventoy do disco. Pode reconectar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", - "STR_MENU_PART_STYLE":"Estilo de Partição", - "STR_DISK_2TB_MBR_ERROR":"Por favor selecione GPT para discos maiores que 2TB", - "STR_SHOW_ALL_DEV":"Show All Devices", - "STR_PART_ALIGN_4KB":"Align partitions with 4KB", - "STR_WEB_COMMUNICATION_ERR":"Communication error:", - "STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", - "STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", - "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", - "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", - "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_CLEAR_FAILED":"Um erro ocorreu ao remover o Ventoy do disco. Pode voltar a ligar o dispositivo USB e tentar novamente. Verifique o ficheiro log.txt para mais detalhes.", + "STR_MENU_PART_STYLE":"Estilo de partição", + "STR_DISK_2TB_MBR_ERROR":"Selecione GPT para discos maiores que 2TB", + "STR_SHOW_ALL_DEV":"Mostrar todos os dispositivos", + "STR_PART_ALIGN_4KB":"Alinhar as partições com 4KB", + "STR_WEB_COMMUNICATION_ERR":"Erro de comunicação:", + "STR_WEB_REMOTE_ABNORMAL":"Erro de comunicação: Anomalia remota", + "STR_WEB_REQUEST_TIMEOUT":"Erro de comunicação: Pedido de tempo limite", + "STR_WEB_SERVICE_UNAVAILABLE":"Erro de comunicação: Serviço indisponível", + "STR_WEB_TOKEN_MISMATCH":"Estado do daemon atualizado, tente novamente mais tarde.", + "STR_WEB_SERVICE_BUSY":"Serviço está ocupado, tente novamente mais tarde.", + "STR_MENU_VTSI_CREATE":"Gerar ficheiro VTSI", + "STR_VTSI_CREATE_TIP":"Desta vez não irá gravar no dispositivo, mas apenas gerar um ficheiro VTSI#@Continuar?", + "STR_VTSI_CREATE_SUCCESS":"Ficheiro VTSI criado com sucesso!#@Pode utilizar o Rufus(3.15+) para o gravar no dispositivo de modo a completar a instalação do Ventoy.", + "STR_VTSI_CREATE_FAILED":"Falha no ficheiro VTSI criado.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Indonesian (Bahasa Indonesia)", - "FontFamily":"Comic Sans MS", + "FontFamily":"Courier New", "FontSize":16, "Author":"Ida Bagus Anom Sanjaya", @@ -1533,28 +1853,95 @@ "STR_MENU_PART_CFG":"Konfigurasi Partisi", "STR_BTN_OK":"OK", "STR_BTN_CANCEL":"Batal", - "STR_PRESERVE_SPACE":"Mempertahankan sejumlah ruang penyimpanan pada disk di bawah ini", - "STR_SPACE_VAL_INVALID":"Nilai menpertahankan ruang tidak valid", + "STR_PRESERVE_SPACE":"Menyisakan sejumlah ruang penyimpanan pada disk di bawah ini", + "STR_SPACE_VAL_INVALID":"Nilai penyisaan ruang tidak valid", "STR_MENU_CLEAR":"Bersihkan Ventoy", "STR_CLEAR_SUCCESS":"Ventoy telah berhasil dihapus pada perangkat ini.", - "STR_CLEAR_FAILED":"Terjadi kesalahan ketika penghapusan berlangsung. Anda perlu mencabut-pasang ulang USB dan coba lagi. Cek log.txt untuk detil.", + "STR_CLEAR_FAILED":"Terjadi kesalahan ketika penghapusan berlangsung. Anda perlu mencabut-pasang ulang USB dan coba lagi. Periksa berkas log.txt untuk detil.", "STR_MENU_PART_STYLE":"Gaya Partisi", "STR_DISK_2TB_MBR_ERROR":"Silakan pilih GPT untuk disk yang lebih dari 2TB", - "STR_SHOW_ALL_DEV":"Show All Devices", - "STR_PART_ALIGN_4KB":"Align partitions with 4KB", - "STR_WEB_COMMUNICATION_ERR":"Communication error:", - "STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", - "STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", - "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", - "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", - "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", + "STR_SHOW_ALL_DEV":"Tampilkan semua perangkat", + "STR_PART_ALIGN_4KB":"Meluruskan dengan partisi 4KB", + "STR_WEB_COMMUNICATION_ERR":"Kesalahan komunikasi:", + "STR_WEB_REMOTE_ABNORMAL":"Kesalahan komunikasi: pengendali bermasalah", + "STR_WEB_REQUEST_TIMEOUT":"Kesalahan komunikasi: Waktu permintaan habis", + "STR_WEB_SERVICE_UNAVAILABLE":"Kesalahan komunikasi: Layanan tidak tersedia", + "STR_WEB_TOKEN_MISMATCH":"Status daemon diperbarui, silakan coba lagi nanti.", + "STR_WEB_SERVICE_BUSY":"Layanan sedang sibuk, silakan coba lagi nanti.", + "STR_MENU_VTSI_CREATE":"Membuat berkas VTSI", + "STR_VTSI_CREATE_TIP":"Saat ini tidak akan menuliskan di perangkat, tetapi hanya membuat berkas VTSI #@Lanjutkan?", + "STR_VTSI_CREATE_SUCCESS":"Berkas VTSI berhasil dibuat#@Anda bisa menggunakan Rufus(3.15+) untuk menulisnya ke perangkat untuk menyelesaikan pemasangan Ventoy.", + "STR_VTSI_CREATE_FAILED":"Berkas VTSI gagal dibuat.", + "STR_MENU_PART_RESIZE":"Pemasangan tanpa merusakkan", + "STR_PART_RESIZE_TIP":"Ventoy akan mencoba pemasangan tanpa merusakkan apabila memungkinkan. #@Lanjutkan?", + "STR_PART_RESIZE_SUCCESS":"Selamat!#@Pemasangan tanpa merusakkan Ventoy berhasil.", + "STR_PART_RESIZE_FAILED":"Pemasangan tanpa merusakkan gagal, periksa berkas log.txt untuk detil.", + "STR_PART_RESIZE_UNSUPPORTED":"Pemasangan tanpa merusakkan Ventoy terhenti karena beberapa kondisi yang tidak mendukung. Periksa berkas log.txt untuk detil.", + + "STRXXX":"" + }, + { + "name":"Norwegian BokmÃ¥l (Norsk BokmÃ¥l)", + "FontFamily":"Courier New", + "FontSize":16, + "Author":"Allan Nordhøy", + + "STR_ERROR":"Feil", + "STR_WARNING":"Advarsel", + "STR_INFO":"Info", + "STR_INCORRECT_DIR":"Start programmet i rett mappe først.", + "STR_INCORRECT_TREE_DIR":"Ikke kjør meg her. Last ned utgitt installasjonspakke og kjør det der.", + "STR_DEVICE":"Enhet", + "STR_LOCAL_VER":"Ventoy i pakke", + "STR_DISK_VER":"Ventoy i enhet", + "STR_STATUS":"Status — Klar", + "STR_INSTALL":"Installer", + "STR_UPDATE":"Updater", + "STR_UPDATE_TIP":"Oppgradering er trygt. ISO-filer vil forbli uendret.#@Fortsett?", + "STR_INSTALL_TIP":"Enheten vil bli formatert og all data pÃ¥ den vil gÃ¥ tapt.#@Fortsett?", + "STR_INSTALL_TIP2":"Enheten vil bli formatert og all data pÃ¥ den vil gÃ¥ tapt.#@Fortsett? (Dobbeltsjekk)", + "STR_INSTALL_SUCCESS":"Gratulerer!#@Ventoy har blitt installert pÃ¥ enheten.", + "STR_INSTALL_FAILED":"Noe gikk galt under installasjonen. Du kan plugge ut og inn USB-enheten og prøve igjen. Sjekk log.txt for detaljer. Hvis feilen vedvarer kan du sjekke O-S-S pÃ¥ nettsiden.", + "STR_UPDATE_SUCCESS":"Gratulerer!#@Ventoy har blitt installert pÃ¥ enheten.", + "STR_UPDATE_FAILED":"Noe gikk galt under oppdateringen. Du kan plugge ut og inn USB-enheten og prøve igjen. Sjekk log.txt for detaljer. Hvis feilen vedvarer kan du sjekke O-S-S pÃ¥ nettsiden.", + "STR_WAIT_PROCESS":"Vent mens en trÃ¥d kjører …", + "STR_MENU_OPTION":"Alternativ", + "STR_MENU_SECURE_BOOT":"Secure Boot-støtte", + "STR_MENU_PART_CFG":"Partisjonsoppsett", + "STR_BTN_OK":"OK", + "STR_BTN_CANCEL":"Avbryt", + "STR_PRESERVE_SPACE":"Hold av litt plass pÃ¥ slutten av disken", + "STR_SPACE_VAL_INVALID":"Ugyldig verdi for avholdt plass", + "STR_MENU_CLEAR":"Tøm Ventoy", + "STR_CLEAR_SUCCESS":"Ventoy har blitt fjernet fra enheten.", + "STR_CLEAR_FAILED":"Noe gikk galt ved fjerning av Ventoy fra disken. Du kan plugge ut og inn USB-enheten og prøve igjen. Sjekk log.txt for detaljer.", + "STR_MENU_PART_STYLE":"Partisjonsstil", + "STR_DISK_2TB_MBR_ERROR":"Velg «GPT» for enheter over 2 TB", + "STR_SHOW_ALL_DEV":"Vis alle enheter", + "STR_PART_ALIGN_4KB":"Juster partisjoner til 4 KB", + "STR_WEB_COMMUNICATION_ERR":"Kommunikasjonsfeil:", + "STR_WEB_REMOTE_ABNORMAL":"Kommunikasjonsfeil: Noe er galt annensteds hen", + "STR_WEB_REQUEST_TIMEOUT":"Kommunikasjonsfeil: Tidsavbrudd for forespørsel", + "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikasjonsfeil: Utilgjengelig tjeneste", + "STR_WEB_TOKEN_MISMATCH":"Nisse-status oppdatert. Prøv igjen senere.", + "STR_WEB_SERVICE_BUSY":"Tjensten er opptatt. Prøv igjen senere.", + "STR_MENU_VTSI_CREATE":"Generer VTSI-fil", + "STR_VTSI_CREATE_TIP":"Dette vil ikke skrive til enheten, men kun generere en VTSIfil#@Fortsett?", + "STR_VTSI_CREATE_SUCCESS":"VTSI-fil opprettet.#@Du kan bruke Rufus(3.15+) til Ã¥ skrive den til enheten for Ã¥ fullføre installasjonen av Ventoy.", + "STR_VTSI_CREATE_FAILED":"Noe gikk galt under opprettelse av VTSI-fil.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { "name":"Ukrainian (УкраїнÑька)", "FontFamily":"Courier New", "FontSize":16, - "Author":"Teraskull", + "Author":"Teraskull, thehugonote", "STR_ERROR":"Помилка", "STR_WARNING":"ПопередженнÑ", @@ -1569,11 +1956,11 @@ "STR_UPDATE":"Оновити", "STR_UPDATE_TIP":"ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÑ‡Ð½Ð¸Ð¹, файли ISO залишатьÑÑ Ð½ÐµÐ·Ð¼Ñ–Ð½Ð½Ð¸Ð¼Ð¸.#@Продовжити?", "STR_INSTALL_TIP":"ДиÑк буде відформатовано, Ñ– вÑÑ– дані будуть втрачені.#@Продовжити?", - "STR_INSTALL_TIP2":"ДиÑк буде відформатовано, Ñ– вÑÑ– дані будуть втрачені.#@Продовжити? (Подвійна перевірка)", + "STR_INSTALL_TIP2":"ДиÑк буде відформатовано, Ñ– вÑÑ– дані будуть втрачені.#@Ви дійÑно хочете продовжити?", "STR_INSTALL_SUCCESS":"Вітаємо!#@Ventoy уÑпішно вÑтановлено на приÑтрій.", - "STR_INSTALL_FAILED":"Під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹.", + "STR_INSTALL_FAILED":"Під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.", "STR_UPDATE_SUCCESS":"Вітаємо!#@Ventoy на приÑтрої уÑпішно оновлено.", - "STR_UPDATE_FAILED":"Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹.", + "STR_UPDATE_FAILED":"Під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.", "STR_WAIT_PROCESS":"Потік запущено, зачекайте...", "STR_MENU_OPTION":"Опції", "STR_MENU_SECURE_BOOT":"Підтримка Secure Boot", @@ -1584,7 +1971,7 @@ "STR_SPACE_VAL_INVALID":"ÐедійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ñ€ÐµÐ·ÐµÑ€Ð²Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ проÑтору", "STR_MENU_CLEAR":"Видалити Ventoy", "STR_CLEAR_SUCCESS":"Ventoy уÑпішно видалено з приÑтрою.", - "STR_CLEAR_FAILED":"Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ventoy ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹.", + "STR_CLEAR_FAILED":"Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ventoy ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ви можете ще раз підключити USB Ñ– повторити Ñпробу. Перевірте log.txt Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.", "STR_MENU_PART_STYLE":"Стиль розмітки розділів", "STR_DISK_2TB_MBR_ERROR":"Будь лаÑка, виберіть GPT Ð´Ð»Ñ Ð´Ð¸Ñків понад 2TB", "STR_SHOW_ALL_DEV":"Показати вÑÑ– приÑтрої", @@ -1595,6 +1982,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Помилка зв'Ñзку: Служба недоÑтупна", "STR_WEB_TOKEN_MISMATCH":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð´ÐµÐ¼Ð¾Ð½Ð° оновлено. Повторіть Ñпробу пізніше.", "STR_WEB_SERVICE_BUSY":"Служба зайнÑта, повторіть Ñпробу пізніше.", + "STR_MENU_VTSI_CREATE":"Створити файл VTSI", + "STR_VTSI_CREATE_TIP":"Цього разу Ventoy не буде вÑтановлено на приÑтрій, а лише буде Ñтворено файл VTSI#@Продовжити?", + "STR_VTSI_CREATE_SUCCESS":"Файл VTSI Ñтворено уÑпішно!#@Ви можете викориÑтати Rufus(3.15+), щоб запиÑати його на приÑтрій, Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ventoy", + "STR_VTSI_CREATE_FAILED":"Ðе вдалоÑÑ Ñтворити файл VTSI.", + "STR_MENU_PART_RESIZE":"Ðеруйнівна уÑтановка", + "STR_PART_RESIZE_TIP":"Ventoy Ñпробує виконати неруйнівну уÑтановку, Ñкщо це можливо. #@Продовжити?", + "STR_PART_RESIZE_SUCCESS":"Вітаємо!#@Ðеруйнівна уÑтановка Ventoy уÑпішно завершена.", + "STR_PART_RESIZE_FAILED":"Збій неруйнівної уÑтановки, перевірте log.txt Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.", + "STR_PART_RESIZE_UNSUPPORTED":"Ðеруйнівна уÑтановка Ventoy зупинена через неможливіÑÑ‚ÑŒ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´ÐµÑких умов. Перевірте log.txt Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.", + "STRXXX":"" }, { @@ -1617,9 +2014,9 @@ "STR_UPDATE_TIP":"Η λειτουÏγία αναβάθμισης είναι ασφαλής, τα αÏχεία ISO δεν θα αλλάξουν.#@Συνέχεια;", "STR_INSTALL_TIP":"Ο δίσκος θα μοÏφοποιηθεί και όλα τα δεδομένα θα χαθοÏν.#@Συνέχεια;", "STR_INSTALL_TIP2":"Ο δίσκος θα μοÏφοποιηθεί και όλα τα δεδομένα θα χαθοÏν.#@Συνέχεια; (Επανελέγξτε)", - "STR_INSTALL_SUCCESS":"ΣυγχαÏητήÏια!#Το @Ventoy έχει εγκατασταθεί με επιτυχία στη συσκευή.", + "STR_INSTALL_SUCCESS":"ΣυγχαÏητήÏια!#@Ventoy έχει εγκατασταθεί με επιτυχία στη συσκευή.", "STR_INSTALL_FAILED":"ΠαÏουσιάστηκε σφάλμα κατά την εγκατάσταση. ΜποÏείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αÏχείο log.txt για λεπτομέÏειες.", - "STR_UPDATE_SUCCESS":"ΣυγχαÏητήÏια!#Το @Ventoy ενημεÏώθηκε με επιτυχία στη συσκευή.", + "STR_UPDATE_SUCCESS":"ΣυγχαÏητήÏια!#@Ventoy ενημεÏώθηκε με επιτυχία στη συσκευή.", "STR_UPDATE_FAILED":"ΠαÏουσιάστηκε σφάλμα κατά την ενημέÏωση. ΜποÏείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αÏχείο log.txt για λεπτομέÏειες.", "STR_WAIT_PROCESS":"Ένα νήμα εκτελείται, παÏακαλώ πεÏιμένετε...", "STR_MENU_OPTION":"Επιλογές", @@ -1642,6 +2039,16 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Σφάλμα επικοινωνίας: υπηÏεσία μη διαθέσιμη", "STR_WEB_TOKEN_MISMATCH":"Η κατάσταση του δαίμονα επικαιÏοποιήθηκε. ΠαÏακαλώ δοκιμάστε αÏγότεÏα.", "STR_WEB_SERVICE_BUSY":"Η υπηÏεσία είναι απασχολημένη. ΠαÏακαλώ δοκιμάστε αÏγότεÏα.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1688,7 +2095,17 @@ "STR_WEB_REQUEST_TIMEOUT":"Kommunikationsfel: Begäran tog för lÃ¥ng tid", "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfel: Tjänsten är inte tillgänglig", "STR_WEB_TOKEN_MISMATCH":"Daemon-status uppdaterad. Försök igen senare.", - "STR_WEB_SERVICE_BUSY":"Tjänster är upptagen. Försök igen senare.", + "STR_WEB_SERVICE_BUSY":"Tjänsten är upptagen. Försök igen senare.", + "STR_MENU_VTSI_CREATE":"Skapa VTSI-fil", + "STR_VTSI_CREATE_TIP":"Den här gÃ¥ngen skrivs det inget till enheten, utan det skapas endast en VTSI-fil#@Fortsätta?", + "STR_VTSI_CREATE_SUCCESS":"VTSI-filen skapad!#@Använd Rufus (3.15+) till att skriva till enheten för att slutföra installationen av Ventoy.", + "STR_VTSI_CREATE_FAILED":"Misslyckades med att skapa VTSI-filen.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { @@ -1736,6 +2153,187 @@ "STR_WEB_SERVICE_UNAVAILABLE":"Napaka v komunikaciji: storitev ni na voljo", "STR_WEB_TOKEN_MISMATCH":"Zahteva storitve je potekla, prosim poskusite kasneje.", "STR_WEB_SERVICE_BUSY":"Storitev je zasedena, prosim poskusite kasneje.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?", + "STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI file created failed.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + + "STRXXX":"" + }, + { + "name":"Bulgarian (БългарÑки)", + "FontFamily":"Courier New", + "FontSize":16, + "Author":"jekovcar", + + "STR_ERROR":"Грешка", + "STR_WARNING":"Предупреждение", + "STR_INFO":"ИнформациÑ", + "STR_INCORRECT_DIR":"МолÑ, Ñтартирайте в друга директориÑ!", + "STR_INCORRECT_TREE_DIR":"Ðе ме Ñтартирайте оттук, молÑ, изтеглете инÑталационен пакет и го Ñтартирайте в друго мÑÑто.", + "STR_DEVICE":"УÑтройÑтво", + "STR_LOCAL_VER":"Ventoy в пакета", + "STR_DISK_VER":"Ventoy на уÑтройÑтвото", + "STR_STATUS":"Ð¡Ñ‚Ð°Ñ‚ÑƒÑ - ГОТОВ", + "STR_INSTALL":"ИнÑталирай", + "STR_UPDATE":"Обнови", + "STR_UPDATE_TIP":"ОбновÑването е безопаÑно, ISO-файловете нÑма да Ñе променÑÑ‚.#@Продължаваме?", + "STR_INSTALL_TIP":"ДиÑка ще Ñе форматира и вÑички данни изтриÑÑ‚.#@Продължаваме?", + "STR_INSTALL_TIP2":"ДиÑка ще Ñе форматира и вÑички данни изтриÑÑ‚..#@ДЕЙСТВИТЕЛÐО ще продължите?", + "STR_INSTALL_SUCCESS":"Поздрави!#@Ventoy бе уÑпешно инÑталиран на уÑтройÑтвото.", + "STR_INSTALL_FAILED":"По време на инÑталирането на Ventoy възникна грешка. ПодÑъединете уÑтройÑтвото и опитайте отново. Проверете log.txt за грешки.", + "STR_UPDATE_SUCCESS":"Поздрави!#@Ventoy бе уÑпешно обновен на уÑтройÑтвото.", + "STR_UPDATE_FAILED":"По време на обновÑването на Ventoy възникна грешка. ПодÑъединете уÑтройÑтвото и опитайте отново. Проверете log.txt за грешки.", + "STR_WAIT_PROCESS":"ПроцеÑа е Ñтартиран, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ñ‡Ð°ÐºÐ°Ð¹Ñ‚Ðµ...", + "STR_MENU_OPTION":"Опции", + "STR_MENU_SECURE_BOOT":"Поддръжка на Secure Boot", + "STR_MENU_PART_CFG":"Допълнителен дÑл", + "STR_BTN_OK":"ОК", + "STR_BTN_CANCEL":"Отказ", + "STR_PRESERVE_SPACE":"Създай Допълнителен дÑл в ÐºÑ€Ð°Ñ Ð½Ð° диÑка", + "STR_SPACE_VAL_INVALID":"Ðеправилен размер на дÑла", + "STR_MENU_CLEAR":"Изтрий Ventoy", + "STR_CLEAR_SUCCESS":"Ventoy бе уÑпешно изтрит от уÑтройÑтвото.", + "STR_CLEAR_FAILED":"По време на изтриването на Ventoy възникна грешка. ПодÑъединете уÑтройÑтвото и опитайте отново. Проверете log.txt за грешки.", + "STR_MENU_PART_STYLE":"Стил на оразмерÑване на дÑловете", + "STR_DISK_2TB_MBR_ERROR":"МолÑ, изберете GPT за диÑкове по-големи от 2ТБ", + "STR_SHOW_ALL_DEV":"Покажи вÑички уÑтройÑтва", + "STR_PART_ALIGN_4KB":"Подравни дÑловете Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ 4КБ", + "STR_WEB_COMMUNICATION_ERR":"Грешка при Ñвързване:", + "STR_WEB_REMOTE_ABNORMAL":"Грешка при Ñвързване: Отдалечената връзка е недейÑтвителна", + "STR_WEB_REQUEST_TIMEOUT":"Грешка при Ñвързване: Изтекло време за изчакване на заÑвката", + "STR_WEB_SERVICE_UNAVAILABLE":"Грешка при Ñвързване: Службата е недоÑтъпна", + "STR_WEB_TOKEN_MISMATCH":"СтатуÑа на агента е обновен. Повторете по-къÑно.", + "STR_WEB_SERVICE_BUSY":"Службата е заета, Повторете по-къÑно.", + "STR_MENU_VTSI_CREATE":"Generate VTSI File", + "STR_VTSI_CREATE_TIP":"Сега нÑма да Ñе запиÑва на диÑка, Ñамо ще Ñе генерира VTSI файл#@Продължаваме?", + "STR_VTSI_CREATE_SUCCESS":"VTSI файла бе Ñъздаден уÑпешно!#@Може да използвате Rufus(3.15+) да го запишете на уÑтройÑтвото за инÑталациÑта Ñ Ventoy.", + "STR_VTSI_CREATE_FAILED":"VTSI файла Ñъздаване Ñе провали.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + + "STRXXX":"" + }, + { + "name":"Armenian (Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶)", + "FontFamily":"Courier New", + "FontSize":16, + "Author":"Egho", + + "STR_ERROR":"ÕÕ­Õ¡Õ¬", + "STR_WARNING":"Ô¶Õ£Õ¸Ö‚Õ·Õ¡ÖÕ¸Ö‚Õ´", + "STR_INFO":"ÕÕ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶", + "STR_INCORRECT_DIR":"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Õ³Õ«Õ·Õ¿ Õ©Õ²Õ©Õ¡Õ­Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´!", + "STR_INCORRECT_TREE_DIR":"Õ‰Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Õ¡ÕµÕ½Õ¿Õ¥Õ², Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ´ Õ¶Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Ö„ Õ©Õ¸Õ²Õ¡Ö€Õ¯Õ¾Õ¡Õ® Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ´Õ¡Õ¶ ÖƒÕ¡Õ©Õ¥Õ©Õ¨ Ö‡ Õ£Õ¸Ö€Õ®Õ¡Ö€Õ¯Õ¥Õ¬ Õ¡ÕµÕ¶Õ¿Õ¥Õ²:", + "STR_DEVICE":"Ô¿Ö€Õ«Õ¹Õ¨", + "STR_LOCAL_VER":"Ventoy-Õ¨ ÖƒÕ¡Õ©Õ¥Õ©Õ¸Ö‚Õ´", + "STR_DISK_VER":"Ventoy-Õ¨ Õ¯Ö€Õ«Õ¹Õ¸Ö‚Õ´", + "STR_STATUS":"Ô¿Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯ - ÕŠÔ±ÕÕÔ±ÕÕ", + "STR_INSTALL":"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬", + "STR_UPDATE":"Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬", + "STR_UPDATE_TIP":"Ô¹Õ¡Ö€Õ´Õ¡ÖÕ´Õ¡Õ¶ Õ£Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ§, ISO Ö†Õ¡ÕµÕ¬Õ¥Ö€Õ¨ Õ¯Õ´Õ¶Õ¡Õ¶ Õ¡Õ¶ÖƒÕ¸ÖƒÕ¸Õ­.#@Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬?", + "STR_INSTALL_TIP":"ÕÕ¯Õ¡Õ¾Õ¡Õ¼Õ¡Õ¯Õ¨ Õ¯Õ±Ö‡Õ¡Õ¹Õ¡ÖƒÕ¾Õ« Ö‡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¹Õ¥Õ¶.#@Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬?", + "STR_INSTALL_TIP2":"ÕÕ¯Õ¡Õ¾Õ¡Õ¼Õ¡Õ¯Õ¨ Õ¯Õ±Ö‡Õ¡Õ¹Õ¡ÖƒÕ¾Õ« Ö‡ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ¹Õ¥Õ¶:#@Ô´Õ¸Ö‚Ö„ Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¡Õ® Õ¥Ö„, Õ´Õ¡Ö„Ö€Õ¥Õ¬ Õ¯Ö€Õ«Õ¹Õ¨? (Double Check)", + "STR_INSTALL_SUCCESS":"Õ‡Õ¶Õ¸Ö€Õ°Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„!#@Ventoy- Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¾Õ¥Õ¬ Õ§ Õ¯Ö€Õ«Õ¹Õ¸Ö‚Õ´:", + "STR_INSTALL_FAILED":"ÕÕ¥Õ²Õ¡Õ¤Ö€Õ´Õ¡Õ¶ Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ¾ Õ½Õ­Õ¡Õ¬: Ô¿Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¶Õ¸Ö€Õ«Ö Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ USB- Õ¯Ö€Õ«Õ¹Õ¨ Ö‡ Õ¯Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ log.txt-Õ¨ ", + "STR_UPDATE_SUCCESS":"Õ‡Õ¶Õ¸Ö€Õ°Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„!#@Ventoy-Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Ö Õ¯Ö€Õ«Õ¹Õ¸Ö‚Õ´:", + "STR_UPDATE_FAILED":"Ô¹Õ¡Ö€Õ´Õ¡ÖÕ´Õ¡Õ¶ Õ¨Õ¶Õ©Õ¡ÖÖ„Õ¸Ö‚Õ´ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ¾ Õ½Õ­Õ¡Õ¬: Ô¿Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¶Õ¸Ö€Õ«Ö Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ USB- Õ¯Ö€Õ«Õ¹Õ¨ Ö‡ Õ¯Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ log.txt-Õ¨ ", + "STR_WAIT_PROCESS":"Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¶ Õ¨Õ¶Õ©Õ¡Õ¶Õ¸Ö‚Õ´, Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½ÕºÕ¡Õ½Õ¥Õ¬...", + "STR_MENU_OPTION":"Ô¸Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€", + "STR_MENU_SECURE_BOOT":"Secure Boot Õ¡Õ»Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶", + "STR_MENU_PART_CFG":"Partition Õ¯Õ¡Õ¦Õ´Õ¡Õ±Ö‡Õ¸Ö‚Õ´", + "STR_BTN_OK":"Ô±ÕµÕ¸", + "STR_BTN_CANCEL":"Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬", + "STR_PRESERVE_SPACE":"ÕŠÕ¡Õ°ÕºÕ¡Õ¶Õ¥Ö„ Õ¸Ö€Õ¸Õ·Õ¡Õ¯Õ« Õ¿Õ¡Ö€Õ¡Õ®Ö„ Õ¯Ö€Õ«Õ¹Õ« Õ¾Õ¥Ö€Õ»Õ¸Ö‚Õ´", + "STR_SPACE_VAL_INVALID":"ÕŠÕ¡Õ°Õ¾Õ¡Õ® Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ« Õ¡Õ¶Õ¾Õ¡Õ¾Õ¥Ö€ Õ¡Ö€ÕªÕ¥Ö„", + "STR_MENU_CLEAR":"Õ„Õ¡Ö„Ö€Õ¥Õ¬ Ventoy-Õ¨", + "STR_CLEAR_SUCCESS":"Ventoy-Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ°Õ¥Õ¼Õ¡ÖÕ¾Õ¡Õ® Õ§ Õ¯Ö€Õ«Õ¹Õ«Ö:", + "STR_CLEAR_FAILED":"Ventoy-Õ¨ Õ¯Ö€Õ«Õ¹Õ«Ö Õ´Õ¡Ö„Ö€Õ¥Õ¬Õ«Õ½ Õ¿Õ¥Õ²Õ« Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ¾ Õ½Õ­Õ¡Õ¬: Ô¿Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¶Õ¸Ö€Õ«Ö Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ USB-Õ¯Ö€Õ«Õ¹Õ¨ Ö‡ Õ¯Ö€Õ¯Õ«Õ¶ ÖƒÕ¸Ö€Õ±Õ¥Õ¬: Õ„Õ¡Õ¶Ö€Õ¡Õ´Õ¡Õ½Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ log.txt-Õ¨", + "STR_MENU_PART_STYLE":"Partition-Õ« Õ¿Õ¥Õ½Õ¡Õ¯Õ¨", + "STR_DISK_2TB_MBR_ERROR":"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ GPT 2TB-Õ«Ö Õ´Õ¥Õ® Õ¯Ö€Õ«Õ¹Õ« Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´", + "STR_SHOW_ALL_DEV":"Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¯Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ¨", + "STR_PART_ALIGN_4KB":"partition-Õ¥Ö€Õ¨ Õ£Õ®Õ¡Õ¶Õ·Õ¥Õ¬ 4KB-Õ¸Õ¾", + "STR_WEB_COMMUNICATION_ERR":"Õ€Õ¡Õ´Õ¡Õ¯ÖÕ´Õ¡Õ¶ սխալ․", + "STR_WEB_REMOTE_ABNORMAL":"Õ€Õ¡Õ´Õ¡Õ¯ÖÕ´Õ¡Õ¶ սխալ․ Õ€Õ¥Õ¼Õ¡Õ°Õ¡Ö€ Õ°Õ¡Õ´Õ¡Õ¯ÖÕ¸Ö‚Õ´Õ¶ Õ¹Õ½Õ¿Õ¡ÖÕ¾Õ¥Ö", + "STR_WEB_REQUEST_TIMEOUT":"Õ€Õ¡Õ´Õ¡Õ¯ÖÕ´Õ¡Õ¶ սխալ․: ÕÕºÕ¡Õ½Õ´Õ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ Õ½ÕºÕ¡Õ¼Õ¾Õ¥Ö", + "STR_WEB_SERVICE_UNAVAILABLE":"Õ€Õ¡Õ´Õ¡Õ¯ÖÕ´Õ¡Õ¶ սխալ․: Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§", + "STR_WEB_TOKEN_MISMATCH":"Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Õ¬ Õ§ Demon-Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ«Õ³Õ¡Õ¯Õ¨, Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ´ Õ¶Õ¸Ö€Õ«Ö ÖƒÕ¸Ö€Õ±Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¸Ö‚Õ·:", + "STR_WEB_SERVICE_BUSY":"Ô¾Õ¡Õ¼Õ¡ÕµÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¦Õ¢Õ¡Õ²Õ¾Õ¡Õ® Õ§, Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ´ Õ¶Õ¸Ö€Õ«Ö ÖƒÕ¸Ö€Õ±Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¸Ö‚Õ·:", + "STR_MENU_VTSI_CREATE":"ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ VTSI Ö†Õ¡ÕµÕ¬", + "STR_VTSI_CREATE_TIP":"Ô±ÕµÕ½ Õ¡Õ¶Õ£Õ¡Õ´ Õ¹Õ« Õ£Ö€Õ¾Õ« Õ¯Ö€Õ«Õ¹Õ« Õ¾Ö€Õ¡, Õ¡ÕµÕ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ¯Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ« VTSI Ö†Õ¡ÕµÕ¬#@Õ‡Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬?", + "STR_VTSI_CREATE_SUCCESS":"VTSI Ö†Õ¡ÕµÕ¬Õ¨ Õ°Õ¡Õ»Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ Õ½Õ¿Õ¥Õ²Õ®Õ¾Õ¥Ö!#@Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Rufus (3.15+) Õ¯Ö€Õ«Õ¹Õ¸Ö‚Õ´ Õ±Õ¡ÕµÕ¶Õ¡Õ£Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Õ¸Ö€ÕºÕ¥Õ½Õ¦Õ« Õ¡Õ¾Õ¡Ö€Õ¿Õ¥Ö„ Ventoy-Õ« Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¸Ö‚Õ´Õ¨:", + "STR_VTSI_CREATE_FAILED":"VTSI Ö†Õ¡ÕµÕ¬Õ« Õ½Õ¿Õ¥Õ²Õ®Õ¸Ö‚Õ´Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥ÖÖ‰", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + + "STRXXX":"" + }, + { + "name":"Finnish (suomi)", + "FontFamily":"Courier New", + "FontSize":16, + "Author":"heidi.wenger", + + "STR_ERROR":"Virhe", + "STR_WARNING":"Varoitus", + "STR_INFO":"Tiedot", + "STR_INCORRECT_DIR":"Ole hyvä ja aja oikean kansion alla!", + "STR_INCORRECT_TREE_DIR":"Älä aja minua tässä, ole hyvä ja lataa julkaistu asennuspaketti, ja suorita ajo siellä.", + "STR_DEVICE":"Laite", + "STR_LOCAL_VER":"Ventoy paketissa", + "STR_DISK_VER":"Ventoy laitteessa", + "STR_STATUS":"Tila - VALMIS", + "STR_INSTALL":"Asenna", + "STR_UPDATE":"Päivitä", + "STR_UPDATE_TIP":"Päivytystoiminto on turvallinen, ISO -tiedostot pysyvät muuttumattomana.#@Jatketaanko?", + "STR_INSTALL_TIP":"Laite tullaan alustamaan ja tämän johdosta kaikki tieto sen sisällä menetetään.#@Jatketaanko?", + "STR_INSTALL_TIP2":"Laite tullaan alustamaan ja tämän johdosta kaikki tieto sen sisällä menetetään.#@Jatketaanko? (Kaksoistarkistus)", + "STR_INSTALL_SUCCESS":"Onnittelut!#@Ventoy on asennettu laitteeseen onnistuneesti.", + "STR_INSTALL_FAILED":"Asennuksen yhteydessä ilmeni virhe. Voit nypätä USB-laitteen irti ja koettaa uudelleen. Katso log.txt nähdäksesi yksityiskohdat. Mikäli toimi epäonnistuu aina, lue usein kysytyt kysymykset (FAQ) virallisella sivustolla.", + "STR_UPDATE_SUCCESS":"Onnittelut!#@Ventoy päivitettiin laitteeseen onnistuneesti.", + "STR_UPDATE_FAILED":"Päivityksen aikana ilmeni virhe. Voit nypätä USB-laitteen irti ja koettaa uudelleen. Katso log.txt nähdäksesi yksityiskohdat. Mikäli toimi epäonnistuu aina, lue usein kysytyt kysymykset (FAQ) virallisella sivustolla.", + "STR_WAIT_PROCESS":"Toimi on ajossa juuri nyt, ole hyvä ja odota...", + "STR_MENU_OPTION":"Vaihtoehto", + "STR_MENU_SECURE_BOOT":"Secure Boot (turvakäynnistys) -tuki", + "STR_MENU_PART_CFG":"Osioasetukset", + "STR_BTN_OK":"SELVÄ", + "STR_BTN_CANCEL":"Peruuta", + "STR_PRESERVE_SPACE":"Jätä hiukan vapaata tilaa levyn loppuun", + "STR_SPACE_VAL_INVALID":"Epäkelpo määrä tilavaraukselle", + "STR_MENU_CLEAR":"Poista Ventoy", + "STR_CLEAR_SUCCESS":"Ventoy on nyt poistettu laitteesta onnistuneesti.", + "STR_CLEAR_FAILED":"Ilmeni virhe poistettaessa Ventoyta levyltä. Voit nypätä laitteen irti ja koettaa uudelleen. Katso log.txt nähdäksesi yksityiskohdat.", + "STR_MENU_PART_STYLE":"Osiotyyli", + "STR_DISK_2TB_MBR_ERROR":"Ole hyvä ja valitse GPT laitteille joissa on tilavuutta yli 2 teratavua", + "STR_SHOW_ALL_DEV":"Näytä kaikki laitteet", + "STR_PART_ALIGN_4KB":"Järjestä osiot 4Kt mukaisesti", + "STR_WEB_COMMUNICATION_ERR":"Kommunikaatiovirhe:", + "STR_WEB_REMOTE_ABNORMAL":"Kommunikaatiovirhe: epätavanomainen etävaste", + "STR_WEB_REQUEST_TIMEOUT":"Kommunikaatiovirhe: pyynnön aikavaste ylittyi", + "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikaatiovirhe: palvelu on tavoittamattomissa", + "STR_WEB_TOKEN_MISMATCH":"Taustaohjelman tila päivittyi, ole hyvä ja yritä myöhemmin uudelleen.", + "STR_WEB_SERVICE_BUSY":"Palvelu ruuhkautunut, ole hyvä ja yritä myöhemmin uudelleen.", + "STR_MENU_VTSI_CREATE":"Luo VTSI -tiedosto", + "STR_VTSI_CREATE_TIP":"Tällä kerralla laitteeseen ei kirjoiteta, vaan luodaan ainoastaan VTSI -tiedosto#@Jatketaanko?", + "STR_VTSI_CREATE_SUCCESS":"VTSI -tiedosto luotiin onnistuneesti!#@Voit käyttää Rufus-ohjelmaa(3.15+) kirjoittaaksesi sen laitteeseen viimeistelläksesi Ventoy-asennuksen.", + "STR_VTSI_CREATE_FAILED":"VTSI -tiedoston luominen epäonnistui.", + "STR_MENU_PART_RESIZE":"Non-destructive Install", + "STR_PART_RESIZE_TIP":"Ventoy will try non-destructive installation if possible. #@Continue?", + "STR_PART_RESIZE_SUCCESS":"Congratulations!#@Ventoy non-destructive installation successfully finished.", + "STR_PART_RESIZE_FAILED":"Non-destructive installation failed, Check log.txt for details.", + "STR_PART_RESIZE_UNSUPPORTED":"Ventoy non-destructive installation stopped because some conditions cannot be met. Check log.txt for details.", + "STRXXX":"" }, { diff --git a/License/license-PorteusKiosk.txt b/License/license-PorteusKiosk.txt new file mode 100644 index 00000000..ecc0ce20 --- /dev/null +++ b/License/license-PorteusKiosk.txt @@ -0,0 +1,3 @@ +Porteus Kiosk follows GPL license (see gpl-3.0.txt) + +Ventoy does not modify its source code, only its library is used. diff --git a/LinuxGUI/EXLIB/README.txt b/LinuxGUI/EXLIB/README.txt new file mode 100644 index 00000000..ecbe5574 --- /dev/null +++ b/LinuxGUI/EXLIB/README.txt @@ -0,0 +1,60 @@ + +====== ARM64 ====== +1. Download CentOS-7-aarch64-Everything-2009.iso from internet. +2. mount CentOS-7-aarch64-Everything-2009.iso /mnt +3. sh prepare_lib_aarch64.sh /mnt/Packages/ + + +====== MIPS64EL ====== +1. build dpkg for CentOS7 +download dpkg_1.18.25.tar.xz from internet. +cd dpkg-1.18.25 +./configure +make +cp -a ./src/dpkg /sbin/ +cp -a ./dpkg-deb/dpkg-deb /sbin/ + +2. download debian 10.x mips64el DVD iso (e.g. debian-10.9.0-mips64el-DVD-1.iso) form internet +3. mount debian-10.9.0-mips64el-DVD-1.iso /mnt +4. sh prepare_gtk_lib_mips64el.sh /mnt/ +5. download the following packages from internet and dpkg -x each of them +pool/main/g/gtk+3.0/libgtk-3-dev_3.24.5-1_mips64el.deb +pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mips64el.deb +pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mips64el.deb +pool/main/d/double-conversion/libdouble-conversion1_3.1.0-3_mips64el.deb +pool/main/libg/libglvnd/libgl1_1.3.2-1~bpo10+2_mips64el.deb +pool/main/libg/libglvnd/libglvnd0_1.3.2-1~bpo10+2_mips64el.deb +pool/main/libg/libglvnd/libglx0_1.3.2-1~bpo10+2_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5core5a_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5dbus5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5gui5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5network5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5opengl5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5opengl5-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5widgets5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/libqt5xml5_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/qt5-qmake_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/qtbase5-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/qtbase5-examples_5.11.3+dfsg1-1+deb10u4_mips64el.deb +pool/main/q/qtbase-opensource-src/qtbase5-private-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb + + +==== I386 === +We need a CentOS8 environment +Install CentOS 8 x86_64 system. +yum update +yum install gcc +yum install gcc-c++ +yum install gcc.i686 +yum install glibc.i686 glibc-devel.i686 glibc-headers.i686 glibc-static.i686 glibc-nss-devel.i686 +yum install libstdc++.i686 +yum install harfbuzz.i686 +yum install zlib.i686 +yum install mesa-libGL.i686 + +pack all /usr /etc directories and extract to /opt/CentOS8/ + + + diff --git a/LinuxGUI/EXLIB/aarch64libs b/LinuxGUI/EXLIB/aarch64libs new file mode 100644 index 00000000..ac280e74 --- /dev/null +++ b/LinuxGUI/EXLIB/aarch64libs @@ -0,0 +1,57 @@ +gtk3- +qt5 +GL +icu +glib2- +pango- +cairo- +gdk-pixbuf2- +libXcursor- +libcap- +pcre- +libffi- +libthai- +fribidi- +libXrender- +libxcb- +pixman- +libpng- +libselinux- +zlib- +libwayland- +wayland- +libglvnd- +elfutils- +libattr- +libX11- +libXi- +libXfixes- +libepoxy- +harfbuzz- +fontconfig- +freetype- +libXinerama- +libXrandr- +libXcomposite- +libXdamage- +libxkbcommon- +libuuid- +libmount- +atk- +libblkid- +graphite2- +libXau- +bzip2- +expat- +libXext- +pcre2- +pcre- +at-spi2-atk +dbus- +dbus-libs +systemd-libs +at-spi2-core +xz-libs +lz4- +libgcrypt- +libgpg-error- diff --git a/LinuxGUI/EXLIB/download_lib.sh b/LinuxGUI/EXLIB/download_lib.sh new file mode 100644 index 00000000..54442cd4 --- /dev/null +++ b/LinuxGUI/EXLIB/download_lib.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +if [ -z "$1" ]; then + echo "please input url" + exit 1 +fi + +if [ -n "$2" ]; then + proxy_opt="-x $2" +fi + +rm -rf download +mkdir -p download +cd download + +grep pool ../README.txt | while read line; do + a="$line" + b=$(basename "$a") + echo "downloading $b ..." + curl -s $1/debian/"$a" $proxy_opt -o "$b" + + a=$(echo $line | sed "s/mips64el/i386/g") + b=$(basename "$a") + echo "downloading $b ..." + curl -s $1/debian/"$a" $proxy_opt -o "$b" +done + +cd .. diff --git a/LinuxGUI/EXLIB/i386libs b/LinuxGUI/EXLIB/i386libs new file mode 100644 index 00000000..3e548f60 --- /dev/null +++ b/LinuxGUI/EXLIB/i386libs @@ -0,0 +1,7 @@ +libmd +libzstd +libpcre2-16 +libicu +qt5 +libgpg-error +libpng diff --git a/LinuxGUI/EXLIB/mips64ellibs b/LinuxGUI/EXLIB/mips64ellibs new file mode 100644 index 00000000..705631e2 --- /dev/null +++ b/LinuxGUI/EXLIB/mips64ellibs @@ -0,0 +1,52 @@ +libmd +libzstd +libpcre2-16 +libicu +qt5 +libglib2 +libgtk-3 +libpango +libharfbuzz +pixbuf2 +atk +wayland +libx11 +libxi6 +epoxy +cairo +composite +damage +libxfixes +libxkbcommon +libfontconfig +libfreetype +libxinerama +libxrandr +libxcursor +libxext +libthai +libfribidi +libpixman +libpng +libxcb +libxrender +zlib1g +libmount +libselinux +libffi +libpcre3 +libdbus +libatspi +libgraphite +libexpat +libuuid +libdatrie +libxdmcp +libblkid +libxau +libsystemd +libbsd +liblz4 +liblzma +libgcrypt +libgpg-error diff --git a/LinuxGUI/EXLIB/prepare_lib_aarch64.sh b/LinuxGUI/EXLIB/prepare_lib_aarch64.sh new file mode 100644 index 00000000..33075ae7 --- /dev/null +++ b/LinuxGUI/EXLIB/prepare_lib_aarch64.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ ! -d $1 ]; then + echo "$1 not exist" + exit 1 +fi + +rm -rf aarch64 +mkdir aarch64 +cd aarch64 + +cat ../aarch64libs | while read a; do + ls -1 $1/*$a* | while read rpm; do + echo "extract ${rpm##*/} ..." + rpm2cpio $rpm | cpio -idmu --quiet + done +done + +cd .. diff --git a/LinuxGUI/EXLIB/prepare_lib_i386.sh b/LinuxGUI/EXLIB/prepare_lib_i386.sh new file mode 100644 index 00000000..540c94b9 --- /dev/null +++ b/LinuxGUI/EXLIB/prepare_lib_i386.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +if [ ! -d $1/pool ]; then + echo "$1/pool not exist" + exit 1 +fi + +rm -rf i386 +mkdir i386 +cd i386 + +cat ../i386libs | while read line; do + find "$1/pool" -name "*${line}*.deb" | while read deb; do + echo "extract ${deb##*/} ..." + dpkg -x $deb . + done +done + +ls -1 ../download/*i386.deb | while read line; do + echo "extract ${line} ..." + dpkg -x "$line" . +done + +cd .. + diff --git a/LinuxGUI/EXLIB/prepare_lib_mips64el.sh b/LinuxGUI/EXLIB/prepare_lib_mips64el.sh new file mode 100644 index 00000000..73e97866 --- /dev/null +++ b/LinuxGUI/EXLIB/prepare_lib_mips64el.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +if [ ! -d $1/pool ]; then + echo "$1/pool not exist" + exit 1 +fi + +rm -rf mips64el +mkdir mips64el +cd mips64el + +cat ../mips64ellibs | while read line; do + find "$1/pool" -name "*${line}*.deb" | while read deb; do + echo "extract ${deb##*/} ..." + dpkg -x $deb . + done +done + +ls -1 ../download/*mips64el.deb | while read line; do + echo "extract ${line} ..." + dpkg -x "$line" . +done + +cd .. + diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_define.h b/LinuxGUI/Ventoy2Disk/Core/ventoy_define.h index 14b2cf41..01c0fd87 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_define.h +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_define.h @@ -31,9 +31,6 @@ #define VTOYEFI_PART_BYTES (32 * 1024 * 1024) #define VTOYEFI_PART_SECTORS 65536 -#define VTOY_LOG_FILE "log.txt" - - #pragma pack(1) typedef struct vtoy_guid diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_json.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_json.c index f65a4583..8253a1cc 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_json.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_json.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c index 6e788c2f..2df37c22 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_log.c @@ -26,8 +26,10 @@ #include #include #include +#include #include +extern char g_log_file[PATH_MAX]; static int g_ventoy_log_level = VLOG_DEBUG; static pthread_mutex_t g_log_mutex; @@ -68,7 +70,7 @@ void ventoy_syslog_newline(int level, const char *Fmt, ...) va_end(arg); pthread_mutex_lock(&g_log_mutex); - fp = fopen(VTOY_LOG_FILE, "a+"); + fp = fopen(g_log_file, "a+"); if (fp) { fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s\n", @@ -96,7 +98,7 @@ void ventoy_syslog_printf(const char *Fmt, ...) va_end(arg); pthread_mutex_lock(&g_log_mutex); - fp = fopen(VTOY_LOG_FILE, "a+"); + fp = fopen(g_log_file, "a+"); if (fp) { fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", @@ -129,11 +131,11 @@ void ventoy_syslog(int level, const char *Fmt, ...) va_end(arg); pthread_mutex_lock(&g_log_mutex); - fp = fopen(VTOY_LOG_FILE, "a+"); + fp = fopen(g_log_file, "a+"); if (fp) { fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", - ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, ttm.tm_hour, ttm.tm_min, ttm.tm_sec, log); fclose(fp); diff --git a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h index 72cec62d..87eb5463 100644 --- a/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h +++ b/LinuxGUI/Ventoy2Disk/Core/ventoy_util.h @@ -20,6 +20,9 @@ #ifndef __VENTOY_UTIL_H__ #define __VENTOY_UTIL_H__ +extern char g_log_file[PATH_MAX]; +extern char g_ini_file[PATH_MAX]; + #define check_free(p) if (p) free(p) #define vtoy_safe_close_fd(fd) \ {\ diff --git a/LinuxGUI/Ventoy2Disk/GTK/refresh_icon_data.c b/LinuxGUI/Ventoy2Disk/GTK/refresh_icon_data.c new file mode 100644 index 00000000..0b678ff5 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/GTK/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/LinuxGUI/Ventoy2Disk/GTK/secure_icon_data.c b/LinuxGUI/Ventoy2Disk/GTK/secure_icon_data.c new file mode 100644 index 00000000..d72c8472 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/GTK/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.c b/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.c new file mode 100644 index 00000000..a1ef3dc2 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.c @@ -0,0 +1,1132 @@ +/****************************************************************************** + * ventoy_gtk.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include "ventoy_gtk.h" + +int g_secure_boot_support = 0; +GtkWidget *g_topWindow = NULL; +GtkWidget *g_partCfgWindow = NULL; +GtkBuilder *g_pXmlBuilder = NULL; +GtkComboBoxText *g_dev_combobox = NULL; +GtkButton *g_refresh_button = NULL; +GtkButton *g_install_button = NULL; +GtkButton *g_update_button = NULL; +GtkMenu *g_lang_menu = NULL;; +GtkCheckMenuItem *g_menu_item_secure_boot = NULL; +GtkCheckMenuItem *g_menu_item_mbr = NULL; +GtkCheckMenuItem *g_menu_item_gpt = NULL; +GtkCheckMenuItem *g_menu_item_show_all = NULL; +GtkLabel *g_device_title = NULL; +GtkLabel *g_label_local_part_style = NULL; +GtkLabel *g_label_dev_part_style = NULL; +GtkLabel *g_label_local_ver = NULL; +GtkLabel *g_label_disk_ver = NULL; +GtkLabel *g_label_status = NULL; +GtkImage *g_image_secure_local = NULL; +GtkImage *g_image_secure_device = NULL; +GtkToggleButton *g_part_align_checkbox = NULL; +GtkToggleButton *g_part_preserve_checkbox = NULL; +GtkEntry *g_part_reserve_space_value = NULL; +GtkComboBoxText *g_part_space_unit_combox = NULL; +GtkProgressBar *g_progress_bar = NULL; +VTOY_JSON *g_languages_json = NULL; +int g_languages_toggled_proc = 0; +int g_dev_changed_proc = 0; +gboolean g_align_part_with_4k = TRUE; +gboolean g_preserve_space_check = FALSE; +int g_preserve_space_unit = 1; +int g_preserve_space_number = 0; +gboolean g_thread_run = FALSE; + +const char *language_string(const char *id) +{ + const char *pName = NULL; + VTOY_JSON *node = NULL; + const char *pCurLang = ventoy_code_get_cur_language(); + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = vtoy_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, pCurLang)) + { + break; + } + } + + if (NULL == node) + { + return "xxx"; + } + + return vtoy_json_get_string_ex(node->pstChild, id); +} + +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, "%s", language_string(strid)); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + + +static void set_item_visible(const char *id, int visible) +{ + GtkWidget *pWidget = NULL; + + pWidget = GTK_WIDGET(gtk_builder_get_object(g_pXmlBuilder, id)); + if (visible) + { + gtk_widget_show(pWidget); + } + else + { + gtk_widget_hide(pWidget); + } +} + +static void init_part_style_menu(void) +{ + int style; + + style = ventoy_code_get_cur_part_style(); + gtk_check_menu_item_set_active(g_menu_item_mbr, (0 == style)); + gtk_check_menu_item_set_active(g_menu_item_gpt, (1 == style)); + gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR"); +} + +static void select_language(const char *lang) +{ + const char *pName = NULL; + const char *pPos = NULL; + const char *pDevice = NULL; + VTOY_JSON *node = NULL; + char device[256]; + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = vtoy_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, lang)) + { + break; + } + } + + if (NULL == node) + { + return; + } + + pDevice = gtk_label_get_text(g_device_title); + if (pDevice && (pPos = strchr(pDevice, '[')) != NULL) + { + g_snprintf(device, sizeof(device), "%s %s", vtoy_json_get_string_ex(node->pstChild, "STR_DEVICE"), pPos); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, vtoy_json_get_string_ex(node->pstChild, "STR_DEVICE")); + } + + LANG_LABEL_TEXT("label_local_ver", "STR_LOCAL_VER"); + LANG_LABEL_TEXT("label_device_ver", "STR_DISK_VER"); + + LANG_LABEL_TEXT("label_status", "STR_STATUS"); + + LANG_BUTTON_TEXT("button_install", "STR_INSTALL"); + LANG_BUTTON_TEXT("button_update", "STR_UPDATE"); + + LANG_MENU_ITEM_TEXT("menu_option", "STR_MENU_OPTION"); + LANG_MENU_ITEM_TEXT("menu_item_secure", "STR_MENU_SECURE_BOOT"); + LANG_MENU_ITEM_TEXT("menu_part_style", "STR_MENU_PART_STYLE"); + LANG_MENU_ITEM_TEXT("menu_item_part_cfg", "STR_MENU_PART_CFG"); + LANG_MENU_ITEM_TEXT("menu_item_clear", "STR_MENU_CLEAR"); + LANG_MENU_ITEM_TEXT("menu_item_show_all", "STR_SHOW_ALL_DEV"); + + LANG_BUTTON_TEXT("space_check_btn", "STR_PRESERVE_SPACE"); + LANG_BUTTON_TEXT("space_align_btn", "STR_PART_ALIGN_4KB"); + LANG_BUTTON_TEXT("button_partcfg_ok", "STR_BTN_OK"); + LANG_BUTTON_TEXT("button_partcfg_cancel", "STR_BTN_CANCEL"); + + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), vtoy_json_get_string_ex(node->pstChild, "STR_MENU_PART_CFG")); + + /* + * refresh screen + */ + + gtk_widget_hide(g_topWindow); + gtk_widget_show(g_topWindow); +} + + +void on_secure_boot_toggled(GtkMenuItem *menuItem, gpointer data) +{ + g_secure_boot_support = 1 - g_secure_boot_support; + + if (g_secure_boot_support) + { + gtk_widget_show((GtkWidget *)g_image_secure_local); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_local); + } +} + +void on_devlist_changed(GtkWidget *widget, gpointer data) +{ + int active; + ventoy_disk *cur = NULL; + char version[512]; + + if (g_dev_changed_proc == 0) + { + return; + } + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + + gtk_widget_hide((GtkWidget *)g_image_secure_device); + gtk_label_set_markup(g_label_disk_ver, ""); + gtk_label_set_text(g_label_dev_part_style, ""); + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + if (cur->vtoydata.ventoy_valid) + { + if (cur->vtoydata.secure_boot_flag) + { + gtk_widget_show((GtkWidget *)g_image_secure_device); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_device); + } + + if (g_secure_boot_support != cur->vtoydata.secure_boot_flag) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + + g_snprintf(version, sizeof(version), VTOY_VER_FMT, cur->vtoydata.ventoy_ver); + gtk_label_set_markup(g_label_disk_ver, version); + gtk_label_set_text(g_label_dev_part_style, cur->vtoydata.partition_style ? "GPT" : "MBR"); + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + } + else + { + if (g_secure_boot_support) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + } +} + + +void on_language_toggled(GtkMenuItem *menuItem, gpointer data) +{ + const char *cur_lang = NULL; + + if (g_languages_toggled_proc == 0) + { + return; + } + + cur_lang = ventoy_code_get_cur_language(); + if (g_strcmp0(cur_lang, (char *)data) != 0) + { + ventoy_code_set_cur_language((char *)data); + select_language((char *)data); + } +} + +void on_part_style_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int style; + + style = ventoy_code_get_cur_part_style(); + ventoy_code_set_cur_part_style(1 - style); + + gtk_label_set_text(g_label_local_part_style, style ? "MBR" : "GPT"); +} + +static ventoy_disk *select_active_dev(const char *select, int *activeid) +{ + int i; + int alldev; + ventoy_disk *cur = NULL; + + alldev = ventoy_code_get_cur_show_all(); + + /* find the match one */ + if (select) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (strcmp(cur->disk_name, select) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Ventoy */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (cur->vtoydata.ventoy_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (cur->type == VTOY_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + +static void fill_dev_list(const char *select) +{ + int i; + int alldev; + int activeid; + int count = 0; + char line[512]; + ventoy_disk *cur = NULL; + ventoy_disk *active = NULL; + GtkListStore *store = NULL; + + g_dev_changed_proc = 0; + + alldev = ventoy_code_get_cur_show_all(); + + vlog("fill_dev_list total disk: %d showall:%d\n", g_disk_num, alldev); + + /* gtk_combo_box_text_remove_all */ + store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g_dev_combobox))); + gtk_list_store_clear(store); + + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + g_snprintf(line, sizeof(line), "%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + gtk_combo_box_text_append_text(g_dev_combobox, line); + count++; + } + + active = select_active_dev(select, &activeid); + if (active) + { + vlog("combox count:%d, active:%s id:%d\n", count, active->disk_name, activeid); + gtk_combo_box_set_active((GtkComboBox *)g_dev_combobox, activeid); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), active->vtoydata.ventoy_valid); + } + else + { + vlog("combox count:%d, no active id\n", count); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + } + + g_dev_changed_proc = 1; + on_devlist_changed(NULL, NULL); +} + + +void on_show_all_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int show_all = ventoy_code_get_cur_show_all(); + + ventoy_code_set_cur_show_all(1 - show_all); + fill_dev_list(NULL); +} + +void on_button_refresh_clicked(GtkWidget *widget, gpointer data) +{ + if (g_thread_run || ventoy_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + ventoy_code_refresh_device(); + fill_dev_list(NULL); +} + +static void set_progress_bar_percent(int percent) +{ + char *pos = NULL; + const char *text = NULL; + char tmp[128]; + + gtk_progress_bar_set_fraction(g_progress_bar, percent * 1.0 / 100); + vlog("set percent %d\n", percent); + + text = language_string("STR_STATUS"); + if (percent == 0) + { + gtk_label_set_text(g_label_status, text); + } + else + { + g_snprintf(tmp, sizeof(tmp), "%s", text); + pos = strchr(tmp, '-'); + if (pos) + { + g_snprintf(pos + 2, sizeof(tmp), "%d%%", percent); + gtk_label_set_text(g_label_status, tmp); + } + } +} + +void on_clear_ventoy(GtkMenuItem *menuItem, gpointer data) +{ + int ret; + int active; + char buf[1024]; + char out[256]; + char disk_name[32]; + ventoy_disk *cur = NULL; + + if (g_thread_run || ventoy_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + g_thread_run = TRUE; + + + cur = g_disk_list + active; + g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_CLEAR_SUCCESS"); + } + else + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_CLEAR_FAILED"); + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + + fill_dev_list(disk_name); + g_thread_run = FALSE; +} + +static int install_proc(ventoy_disk *cur) +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + char disk_name[32]; + long long space; + + vlog("install_thread ...\n"); + + g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + + buflen = sizeof(buf); + VTOY_JSON_FMT_BEGIN(pos, buf, buflen); + VTOY_JSON_FMT_OBJ_BEGIN(); + VTOY_JSON_FMT_STRN("method", "install"); + VTOY_JSON_FMT_STRN("disk", disk_name); + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024 * 1024 * 1024LL; + } + else + { + space = space * 1024 * 1024LL; + } + + snprintf(dec, sizeof(dec), "%lld", space); + VTOY_JSON_FMT_STRN("reserve_space", dec); + } + else + { + VTOY_JSON_FMT_STRN("reserve_space", "0"); + } + + VTOY_JSON_FMT_UINT("partstyle", ventoy_code_get_cur_part_style()); + VTOY_JSON_FMT_UINT("secure_boot", g_secure_boot_support); + VTOY_JSON_FMT_UINT("align_4kb", g_align_part_with_4k); + VTOY_JSON_FMT_OBJ_END(); + VTOY_JSON_FMT_END(pos); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = ventoy_code_get_percent(); + set_progress_bar_percent(percent); + GTK_MSG_ITERATION(); + usleep(50 * 1000); + } + + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_INSTALL_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_INSTALL_SUCCESS"); + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + + fill_dev_list(disk_name); + g_thread_run = FALSE; + + return 0; +} + +void on_button_install_clicked(GtkWidget *widget, gpointer data) +{ + int active; + long long size; + long long space; + ventoy_disk *cur = NULL; + + if (g_thread_run || ventoy_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + + if (ventoy_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_DISK_2TB_MBR_ERROR"); + return; + } + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024; + } + else + { + space = space; + } + + size = cur->size_in_byte / SIZE_1MB; + if (size <= space || (size - space) <= (VTOYEFI_PART_BYTES / SIZE_1MB)) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + vlog("reserved space value too big ...\n"); + return; + } + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + install_proc(cur); +} + + +static int update_proc(ventoy_disk *cur) +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + char disk_name[32]; + + g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", + disk_name, g_secure_boot_support); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = ventoy_code_get_percent(); + set_progress_bar_percent(percent); + GTK_MSG_ITERATION(); + usleep(50 * 1000); + } + + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_UPDATE_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_UPDATE_SUCCESS"); + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + + fill_dev_list(disk_name); + g_thread_run = FALSE; + + return 0; +} + + +void on_button_update_clicked(GtkWidget *widget, gpointer data) +{ + int active; + ventoy_disk *cur = NULL; + + if (g_thread_run || ventoy_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + cur = g_disk_list + active; + + if (cur->vtoydata.ventoy_valid == 0) + { + vlog("invalid ventoy version.\n"); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL, "STR_UPDATE_TIP")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + update_proc(cur); +} + +static gint lang_compare(gconstpointer a, gconstpointer b) +{ + const char *name1 = (const char *)a; + const char *name2 = (const char *)b; + + if (strncmp(name1, "Chinese Simplified", 18) == 0) + { + return -1; + } + else if (strncmp(name2, "Chinese Simplified", 18) == 0) + { + return 1; + } + else + { + return g_strcmp0(name1, name2); + } +} + +static int load_languages(void) +{ + int size = 0; + char *pBuf = NULL; + char *pCur = NULL; + const char *pCurLang = NULL; + const char *pName = NULL; + VTOY_JSON *json = NULL; + VTOY_JSON *node = NULL; + VTOY_JSON *lang = NULL; + GSList *pGroup = NULL; + GList *pNameNode = NULL; + GList *pNameList = NULL; + GtkRadioMenuItem *pItem = NULL; + + vlog("load_languages ...\n"); + + pCurLang = ventoy_code_get_cur_language(); + if (pCurLang[0] == 0) + { + pName = getenv("LANG"); + if (pName && strncmp(pName, "zh_CN", 5) == 0) + { + ventoy_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + ventoy_code_set_cur_language("English (English)"); + } + pCurLang = ventoy_code_get_cur_language(); + } + + vlog("current language <%s>\n", pCurLang); + + ventoy_read_file_to_buf("./tool/languages.json", 1, (void **)&pBuf, &size); + + json = vtoy_json_create(); + vtoy_json_parse(json, pBuf); + g_languages_json = json; + + for (node = json->pstChild; node; node = node->pstNext) + { + pName = vtoy_json_get_string_ex(node->pstChild, "name"); + if (pName) + { + pNameList = g_list_append(pNameList, (gpointer)pName); + } + + for (lang = node->pstChild; lang; lang = lang->pstNext) + { + if (lang->enDataType == JSON_TYPE_STRING) + { + pCur = lang->unData.pcStrVal; + while (*pCur) + { + if (*pCur == '#') + { + *pCur = '\r'; + } + else if (*pCur == '@') + { + *pCur = '\n'; + } + pCur++; + } + } + } + } + + pNameList = g_list_sort(pNameList, lang_compare); + + for (pNameNode = g_list_first(pNameList); pNameNode; pNameNode = g_list_next(pNameNode)) + { + pName = (char *)(pNameNode->data); + pItem = (GtkRadioMenuItem *)gtk_radio_menu_item_new_with_label(pGroup, pName); + pGroup = gtk_radio_menu_item_get_group(pItem); + + if (strcmp(pCurLang, pName) == 0) + { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pItem), TRUE); + } + + g_signal_connect(pItem, "toggled", G_CALLBACK(on_language_toggled), (gpointer)pName); + gtk_widget_show((GtkWidget *)pItem); + gtk_menu_shell_append(GTK_MENU_SHELL(g_lang_menu), (GtkWidget *)pItem); + } + + g_list_free(pNameList); + free(pBuf); + + select_language(pCurLang); + g_languages_toggled_proc = 1; + + return 0; +} + +void on_part_cfg_ok(GtkWidget *widget, gpointer data) +{ + const char *pos = NULL; + const char *input = NULL; + char device[256]; + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + if (checked) + { + input = gtk_entry_get_text(g_part_reserve_space_value); + if (input == NULL || input[0] == 0) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + + for (pos = input; *pos; pos++) + { + if (*pos < '0' || *pos >= '9') + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + g_preserve_space_unit = gtk_combo_box_get_active((GtkComboBox *)g_part_space_unit_combox); + g_preserve_space_number = (int)strtol(input, NULL, 10); + + g_snprintf(device, sizeof(device), "%s [ -%d%s ]", + language_string("STR_DEVICE"), g_preserve_space_number, + g_preserve_space_unit ? "GB" : "MB"); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, language_string("STR_DEVICE")); + } + + g_preserve_space_check = checked; + g_align_part_with_4k = gtk_toggle_button_get_active(g_part_align_checkbox); + gtk_widget_hide(g_partCfgWindow); +} + +void on_part_cfg_cancel(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); +} + +int on_part_cfg_close(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); + return TRUE; +} + +void on_part_config(GtkMenuItem *menuItem, gpointer data) +{ + char value[64]; + + gtk_toggle_button_set_active(g_part_align_checkbox, g_align_part_with_4k); + gtk_toggle_button_set_active(g_part_preserve_checkbox, g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), g_preserve_space_check); + + if (g_preserve_space_check) + { + g_snprintf(value, sizeof(value), "%d", g_preserve_space_number); + gtk_entry_set_text(g_part_reserve_space_value, value); + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + } + + gtk_widget_show_all(g_partCfgWindow); +} + +void on_reserve_space_toggled(GtkMenuItem *menuItem, gpointer data) +{ + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), checked); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), checked); +} + +static void init_part_cfg_window(GtkBuilder *pBuilder) +{ +#if GTK_CHECK_VERSION(3, 0, 0) + GtkWidget *pHeader = NULL; + + pHeader = gtk_header_bar_new(); + gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(pHeader), FALSE); + gtk_window_set_titlebar (GTK_WINDOW(g_partCfgWindow), pHeader); + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), "Partition Configuration"); +#endif + + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_reserve_space_value), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_space_unit_combox), FALSE); + + SIGNAL("space_check_btn", "toggled", on_reserve_space_toggled); + + SIGNAL("button_partcfg_ok", "clicked", on_part_cfg_ok); + SIGNAL("button_partcfg_cancel", "clicked", on_part_cfg_cancel); + SIGNAL("part_cfg_dlg", "delete_event", on_part_cfg_close); +} + +static void add_accelerator(GtkAccelGroup *agMain, void *widget, const char *signal, guint accel_key) +{ + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_SHIFT_MASK | GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); +} + +void on_init_window(GtkBuilder *pBuilder) +{ + GSList *pGroup = NULL; + GtkAccelGroup *agMain = NULL; + char version[512]; + + vlog("on_init_window ...\n"); + + g_pXmlBuilder = pBuilder; + g_topWindow = BUILDER_ITEM(GtkWidget, "window"); + g_partCfgWindow = BUILDER_ITEM(GtkWidget, "part_cfg_dlg"); + + g_dev_combobox = BUILDER_ITEM(GtkComboBoxText, "combobox_devlist"); + g_refresh_button = BUILDER_ITEM(GtkButton, "button_refresh"); + g_install_button = BUILDER_ITEM(GtkButton, "button_install"); + g_update_button = BUILDER_ITEM(GtkButton, "button_update"); + + g_lang_menu = BUILDER_ITEM(GtkMenu, "submenu_language"); + g_menu_item_secure_boot = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_secure"); + g_menu_item_mbr = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_mbr"); + g_menu_item_gpt = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_gpt"); + g_menu_item_show_all = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_show_all"); + + g_device_title = BUILDER_ITEM(GtkLabel, "label_device"); + g_label_local_part_style = BUILDER_ITEM(GtkLabel, "label_local_part_style"); + g_label_dev_part_style = BUILDER_ITEM(GtkLabel, "label_dev_part_style"); + + g_label_local_ver = BUILDER_ITEM(GtkLabel, "label_local_ver_value"); + g_label_disk_ver = BUILDER_ITEM(GtkLabel, "label_dev_ver_value"); + + g_label_status = BUILDER_ITEM(GtkLabel, "label_status"); + + g_image_secure_local = BUILDER_ITEM(GtkImage, "image_secure_local"); + g_image_secure_device = BUILDER_ITEM(GtkImage, "image_secure_dev"); + + g_part_preserve_checkbox = BUILDER_ITEM(GtkToggleButton, "space_check_btn"); + g_part_align_checkbox = BUILDER_ITEM(GtkToggleButton, "space_align_btn"); + + g_part_reserve_space_value = BUILDER_ITEM(GtkEntry, "entry_reserve_space"); + g_part_space_unit_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_unit"); + + g_progress_bar = BUILDER_ITEM(GtkProgressBar, "progressbar1"); + + init_part_cfg_window(pBuilder); + + /* for gtk2 */ + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy1"), GTK_SHADOW_NONE); + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy2"), GTK_SHADOW_NONE); + + /* join group */ + pGroup = gtk_radio_menu_item_get_group((GtkRadioMenuItem *)g_menu_item_mbr); + gtk_radio_menu_item_set_group((GtkRadioMenuItem *)g_menu_item_gpt, pGroup); + + gtk_widget_hide((GtkWidget *)g_image_secure_local); + gtk_widget_hide((GtkWidget *)g_image_secure_device); + + g_snprintf(version, sizeof(version), VTOY_VER_FMT, ventoy_get_local_version()); + gtk_label_set_markup(g_label_local_ver, version); + + init_part_style_menu(); + gtk_check_menu_item_set_active(g_menu_item_show_all, ventoy_code_get_cur_show_all()); + + load_languages(); + + SIGNAL("combobox_devlist", "changed", on_devlist_changed); + + SIGNAL("button_refresh", "clicked", on_button_refresh_clicked); + SIGNAL("button_install", "clicked", on_button_install_clicked); + SIGNAL("button_update", "clicked", on_button_update_clicked); + + SIGNAL("menu_item_secure", "toggled", on_secure_boot_toggled); + SIGNAL("menu_item_mbr", "toggled", on_part_style_toggled); + SIGNAL("menu_item_show_all", "toggled", on_show_all_toggled); + + SIGNAL("menu_item_part_cfg", "activate", on_part_config); + SIGNAL("menu_item_clear", "activate", on_clear_ventoy); + + agMain = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(g_topWindow), agMain); + add_accelerator(agMain, g_dev_combobox, "popup", GDK_KEY_d); + add_accelerator(agMain, g_install_button, "clicked", GDK_KEY_i); + add_accelerator(agMain, g_update_button, "clicked", GDK_KEY_u); + add_accelerator(agMain, g_refresh_button, "clicked", GDK_KEY_r); + + fill_dev_list(NULL); + + return; +} + +int on_exit_window(GtkWidget *widget, gpointer data) +{ + vlog("on_exit_window ...\n"); + + if (g_thread_run || ventoy_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return TRUE; + } + + ventoy_code_save_cfg(); + return FALSE; +} + diff --git a/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.h b/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.h new file mode 100644 index 00000000..d3c5e5c7 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/GTK/ventoy_gtk.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * ventoy_gtk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_GTK_H__ +#define __VENTOY_GTK_H__ + +int ventoy_disk_init(void); +void ventoy_disk_exit(void); +int ventoy_http_init(void); +void ventoy_http_exit(void); +int ventoy_log_init(void); +void ventoy_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * ventoy_code_get_cur_language(void); +int ventoy_code_get_cur_part_style(void); +void ventoy_code_set_cur_part_style(int style); +int ventoy_code_get_cur_show_all(void); +void ventoy_code_set_cur_show_all(int show_all); +void ventoy_code_set_cur_language(const char *lang); +void ventoy_code_save_cfg(void); +void on_init_window(GtkBuilder *pBuilder); +int on_exit_window(GtkWidget *widget, gpointer data) ; +void ventoy_code_refresh_device(void); +int ventoy_code_is_busy(void); +int ventoy_code_get_percent(void); +int ventoy_code_get_result(void); +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid); + +#define VTOY_VER_FMT "%s" + +#define LANG_LABEL_TEXT(id, str) \ + gtk_label_set_text(BUILDER_ITEM(GtkLabel, id), vtoy_json_get_string_ex(node->pstChild, str)) + +#define LANG_BUTTON_TEXT(id, str) \ + gtk_button_set_label(BUILDER_ITEM(GtkButton, id), vtoy_json_get_string_ex(node->pstChild, str)) + +#define LANG_MENU_ITEM_TEXT(id, str) \ + gtk_menu_item_set_label(BUILDER_ITEM(GtkMenuItem, id), vtoy_json_get_string_ex(node->pstChild, str)) + +#define LANG_CHKBTN_TEXT(id, str) \ + gtk_check_button_set_label(BUILDER_ITEM(GtkCheckButton, id), vtoy_json_get_string_ex(node->pstChild, str)) + +#define BUILDER_ITEM(type, id) (type *)gtk_builder_get_object(g_pXmlBuilder, id) + +#define SIGNAL(id, act, func) \ + g_signal_connect(gtk_builder_get_object(g_pXmlBuilder, id), act, G_CALLBACK(func), NULL) + +#define GTK_MSG_ITERATION() while (gtk_events_pending ()) gtk_main_iteration() + +#endif /* __VENTOY_GTK_H__ */ + diff --git a/LinuxGUI/Ventoy2Disk/GTK/window_icon_data.c b/LinuxGUI/Ventoy2Disk/GTK/window_icon_data.c new file mode 100644 index 00000000..857be32a --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/GTK/window_icon_data.c @@ -0,0 +1,7633 @@ +/****************************************************************************** + * window_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char window_icon_hexData[] = +{ + 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x08, + 0x01, 0x00, 0xCE, 0x05, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x88, 0x54, + 0x00, 0x00, 0xF6, 0x0D, 0x01, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x42, + 0x00, 0x00, 0x7E, 0x62, 0x01, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x25, + 0x00, 0x00, 0xA6, 0xA4, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x4E, 0xCA, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x5E, 0x0E, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x69, 0x1E, + 0x00, 0x00, 0x6A, 0x23, 0x00, 0x00, 0x6A, 0x32, 0x0B, 0x00, 0x70, 0x37, 0x0F, 0x00, 0x74, 0x3A, + 0x0D, 0x00, 0x6C, 0x37, 0x13, 0x00, 0x7C, 0x41, 0x12, 0x00, 0x7E, 0x45, 0x18, 0x00, 0x78, 0x49, + 0x2A, 0x00, 0x7D, 0x4C, 0x28, 0x00, 0x7D, 0x4F, 0x30, 0x00, 0x80, 0x40, 0x05, 0x00, 0x81, 0x42, + 0x09, 0x00, 0x82, 0x44, 0x0B, 0x00, 0x86, 0x46, 0x0A, 0x00, 0x82, 0x44, 0x0C, 0x00, 0x84, 0x44, + 0x0E, 0x00, 0x88, 0x48, 0x0C, 0x00, 0x8C, 0x4E, 0x0E, 0x00, 0x90, 0x4F, 0x0E, 0x00, 0x84, 0x47, + 0x10, 0x00, 0x85, 0x49, 0x12, 0x00, 0x87, 0x4B, 0x14, 0x00, 0x87, 0x4C, 0x17, 0x00, 0x8A, 0x4C, + 0x13, 0x00, 0x81, 0x47, 0x18, 0x00, 0x87, 0x4D, 0x18, 0x00, 0x88, 0x4D, 0x18, 0x00, 0x84, 0x51, + 0x1F, 0x00, 0x8D, 0x53, 0x1E, 0x00, 0x94, 0x53, 0x13, 0x00, 0x96, 0x56, 0x13, 0x00, 0x91, 0x52, + 0x14, 0x00, 0x98, 0x57, 0x11, 0x00, 0x99, 0x58, 0x13, 0x00, 0x94, 0x5A, 0x1A, 0x00, 0xA1, 0x61, + 0x17, 0x00, 0xA1, 0x62, 0x1A, 0x00, 0xA4, 0x66, 0x1D, 0x00, 0x85, 0x4E, 0x21, 0x00, 0x81, 0x4F, + 0x2B, 0x00, 0x86, 0x50, 0x23, 0x00, 0x85, 0x53, 0x27, 0x00, 0x88, 0x51, 0x21, 0x00, 0x8A, 0x54, + 0x26, 0x00, 0x87, 0x54, 0x2B, 0x00, 0x89, 0x55, 0x2A, 0x00, 0x89, 0x56, 0x2C, 0x00, 0x80, 0x54, + 0x30, 0x00, 0x82, 0x55, 0x36, 0x00, 0x8D, 0x5B, 0x32, 0x00, 0x8A, 0x5A, 0x36, 0x00, 0x89, 0x5B, + 0x3A, 0x00, 0x91, 0x5D, 0x31, 0x00, 0x99, 0x60, 0x2B, 0x00, 0x8D, 0x62, 0x33, 0x00, 0x97, 0x63, + 0x37, 0x00, 0x98, 0x62, 0x30, 0x00, 0x9D, 0x69, 0x32, 0x00, 0x9E, 0x6D, 0x31, 0x00, 0x9A, 0x67, + 0x3A, 0x00, 0xA4, 0x69, 0x28, 0x00, 0xA9, 0x6C, 0x28, 0x00, 0xB1, 0x76, 0x2D, 0x00, 0xA7, 0x6D, + 0x34, 0x00, 0xA5, 0x72, 0x3E, 0x00, 0xB2, 0x78, 0x34, 0x00, 0xD1, 0x55, 0x00, 0x00, 0x94, 0x68, + 0x45, 0x00, 0x9D, 0x6F, 0x48, 0x00, 0x9E, 0x73, 0x4F, 0x00, 0x99, 0x79, 0x50, 0x00, 0xA2, 0x74, + 0x4B, 0x00, 0xA2, 0x76, 0x51, 0x00, 0x9B, 0x7F, 0x64, 0x00, 0xBA, 0x81, 0x3B, 0x00, 0xBF, 0x86, + 0x3B, 0x00, 0xBF, 0x87, 0x3D, 0x00, 0xE6, 0xA6, 0x3E, 0x00, 0xBB, 0x87, 0x4E, 0x00, 0xBB, 0x8B, + 0x49, 0x00, 0xAB, 0x84, 0x50, 0x00, 0xAA, 0x81, 0x5C, 0x00, 0xAD, 0x83, 0x5D, 0x00, 0xB8, 0x91, + 0x62, 0x00, 0xA8, 0x93, 0x73, 0x00, 0xB9, 0x96, 0x79, 0x00, 0xC2, 0x8D, 0x47, 0x00, 0xC2, 0x8F, + 0x4D, 0x00, 0xC9, 0x93, 0x4E, 0x00, 0xCC, 0x97, 0x4D, 0x00, 0xCE, 0x99, 0x50, 0x00, 0xC8, 0x9B, + 0x5F, 0x00, 0xCC, 0x9C, 0x64, 0x00, 0xC5, 0x9B, 0x6A, 0x00, 0xC1, 0x99, 0x6F, 0x00, 0xC7, 0xA4, + 0x6F, 0x00, 0xD2, 0xA2, 0x63, 0x00, 0xD9, 0xA7, 0x64, 0x00, 0xD9, 0xAA, 0x63, 0x00, 0xDC, 0xAC, + 0x65, 0x00, 0xD6, 0xAA, 0x6E, 0x00, 0xDA, 0xAD, 0x74, 0x00, 0xD9, 0xB0, 0x78, 0x00, 0xDC, 0xB2, + 0x7D, 0x00, 0xE6, 0xB9, 0x75, 0x00, 0xEA, 0xBB, 0x76, 0x00, 0xE0, 0xB7, 0x7C, 0x00, 0xE5, 0xBA, + 0x7E, 0x00, 0xEC, 0xBF, 0x78, 0x00, 0xE8, 0xBE, 0x7C, 0x00, 0xB6, 0x99, 0x85, 0x00, 0xB1, 0xA3, + 0x90, 0x00, 0xB7, 0xAB, 0x94, 0x00, 0xBB, 0xB1, 0xA3, 0x00, 0xC2, 0xA7, 0x83, 0x00, 0xC1, 0xA3, + 0x89, 0x00, 0xD3, 0xAD, 0x80, 0x00, 0xD9, 0xB5, 0x82, 0x00, 0xCB, 0xB0, 0x97, 0x00, 0xD5, 0xB6, + 0x95, 0x00, 0xDD, 0xBF, 0x99, 0x00, 0xE4, 0xBE, 0x8B, 0x00, 0xC9, 0xBE, 0xAB, 0x00, 0xC8, 0xBF, + 0xAE, 0x00, 0xD3, 0xBC, 0xA4, 0x00, 0xC5, 0xBF, 0xB4, 0x00, 0xE7, 0xC2, 0x87, 0x00, 0xE5, 0xC1, + 0x8B, 0x00, 0xE6, 0xC3, 0x8F, 0x00, 0xEF, 0xC8, 0x89, 0x00, 0xF0, 0xCB, 0x8B, 0x00, 0xF5, 0xCE, + 0x8C, 0x00, 0xE6, 0xC4, 0x91, 0x00, 0xE7, 0xC4, 0x95, 0x00, 0xEC, 0xC7, 0x90, 0x00, 0xEA, 0xC8, + 0x93, 0x00, 0xE6, 0xC9, 0x9D, 0x00, 0xEB, 0xCB, 0x99, 0x00, 0xEF, 0xCD, 0x99, 0x00, 0xEE, 0xCF, + 0x9C, 0x00, 0xF0, 0xCB, 0x91, 0x00, 0xF2, 0xD1, 0x99, 0x00, 0xF5, 0xD3, 0x98, 0x00, 0xF5, 0xD4, + 0x9A, 0x00, 0xF5, 0xD4, 0x9D, 0x00, 0xD5, 0xC4, 0xAD, 0x00, 0xDF, 0xC7, 0xA9, 0x00, 0xDE, 0xCB, + 0xA9, 0x00, 0xC8, 0xC0, 0xB3, 0x00, 0xC9, 0xC4, 0xB9, 0x00, 0xD0, 0xC5, 0xBC, 0x00, 0xE8, 0xCA, + 0xA1, 0x00, 0xE7, 0xD1, 0xAE, 0x00, 0xEE, 0xD6, 0xAE, 0x00, 0xF5, 0xD6, 0xA0, 0x00, 0xF0, 0xD3, + 0xA5, 0x00, 0xF0, 0xD4, 0xA6, 0x00, 0xF7, 0xD8, 0xA0, 0x00, 0xF9, 0xDB, 0xA7, 0x00, 0xF4, 0xD9, + 0xA9, 0x00, 0xF9, 0xDE, 0xAD, 0x00, 0xF1, 0xD8, 0xB0, 0x00, 0xF5, 0xDB, 0xB0, 0x00, 0xF6, 0xDF, + 0xB6, 0x00, 0xF4, 0xDF, 0xB9, 0x00, 0xF0, 0xDE, 0xBF, 0x00, 0xFB, 0xE1, 0xB3, 0x00, 0xF9, 0xE1, + 0xB6, 0x00, 0xF6, 0xE0, 0xB8, 0x00, 0xF6, 0xE1, 0xBE, 0x00, 0xFC, 0xE5, 0xBC, 0x00, 0xD2, 0xCD, + 0xC2, 0x00, 0xD6, 0xD3, 0xCD, 0x00, 0xD8, 0xD5, 0xCF, 0x00, 0xD7, 0xD6, 0xD5, 0x00, 0xD8, 0xD6, + 0xD2, 0x00, 0xDF, 0xDA, 0xD1, 0x00, 0xDE, 0xDB, 0xD4, 0x00, 0xDF, 0xDD, 0xD8, 0x00, 0xE0, 0xD4, + 0xC1, 0x00, 0xE0, 0xD8, 0xCE, 0x00, 0xE1, 0xDE, 0xDA, 0x00, 0xFA, 0xE5, 0xC1, 0x00, 0xFB, 0xE7, + 0xC4, 0x00, 0xF1, 0xE4, 0xCE, 0x00, 0xE1, 0xE0, 0xDE, 0x00, 0xEF, 0xE7, 0xDA, 0x00, 0xF1, 0xE8, + 0xD8, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0xE8, 0xE9, 0xE9, 0x00, 0xEE, 0xEE, 0xEC, 0x00, 0xFB, 0xF2, + 0xE1, 0x00, 0xF0, 0xF0, 0xEE, 0x00, 0xEF, 0xF0, 0xF0, 0x00, 0xF2, 0xF1, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x0F, 0x0F, 0x0F, 0x0F, 0x13, 0x13, 0x13, 0x13, 0x13, 0x04, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x1A, 0x30, 0x33, 0x33, 0x30, 0x1A, 0x13, 0x0F, 0x13, 0x13, 0x1A, 0x0F, 0x1A, + 0x13, 0x1A, 0x30, 0x0D, 0x0D, 0x0D, 0x0E, 0x35, 0x38, 0x36, 0x1E, 0x13, 0x13, 0x1A, 0x02, 0x73, + 0x4C, 0x2C, 0x09, 0x06, 0x08, 0x0A, 0x1D, 0x2B, 0x31, 0x36, 0x48, 0x49, 0x01, 0x57, 0x7B, 0x00, + 0x36, 0x09, 0x31, 0x4E, 0x30, 0x13, 0x13, 0x16, 0x1C, 0x30, 0x39, 0x4A, 0x78, 0x5A, 0x49, 0x4D, + 0x1D, 0x30, 0x9B, 0xBE, 0x74, 0x3B, 0x16, 0x17, 0x17, 0x17, 0x22, 0x3E, 0x57, 0x40, 0x05, 0x3C, + 0x13, 0x3E, 0xB4, 0xC6, 0xC1, 0x76, 0x4B, 0x27, 0x26, 0x26, 0x26, 0x22, 0x45, 0x81, 0xC4, 0x3E, + 0x22, 0x2A, 0x58, 0xBA, 0xC1, 0xBE, 0x82, 0x59, 0x3E, 0x2A, 0x2A, 0x28, 0x42, 0x62, 0x7C, 0x44, + 0x42, 0x43, 0x43, 0x77, 0xB3, 0x99, 0xB0, 0x9B, 0x75, 0x55, 0x43, 0x43, 0x46, 0x62, 0x97, 0x53, + 0x4F, 0x4F, 0x5B, 0x60, 0x96, 0xB2, 0x7F, 0xB1, 0xB4, 0x7F, 0x54, 0x4F, 0x5B, 0x79, 0x03, 0x61, + 0x5E, 0x5F, 0x69, 0x6C, 0x7A, 0xB8, 0xB4, 0xBA, 0xC3, 0xB4, 0x64, 0x5F, 0x65, 0x7D, 0x6A, 0x6C, + 0x66, 0x66, 0x84, 0x8A, 0x84, 0x8D, 0xBF, 0xC7, 0xC7, 0xC7, 0x98, 0x66, 0x6F, 0x47, 0x8A, 0x9C, + 0x70, 0x6E, 0x8E, 0xA0, 0xA0, 0xA0, 0xA8, 0xA9, 0xBD, 0xC0, 0x83, 0x72, 0x8E, 0x8C, 0x7E, 0x8A, + 0x8E, 0x87, 0x95, 0xA8, 0xAE, 0xAE, 0xA8, 0xA8, 0xAE, 0xA8, 0x88, 0x95, 0x72, 0xFF, 0x9D, 0x6E, + 0x91, 0xA0, 0x95, 0xA5, 0xBC, 0xBC, 0xBC, 0xBC, 0xAB, 0xA4, 0x95, 0x52, 0xAE, 0x9D, 0x00, 0xA8, + 0x88, 0x95, 0xAB, 0xA3, 0xAB, 0xAF, 0xAF, 0xAF, 0xA5, 0xA5, 0x95, 0xAF, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1B, 0x82, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x25, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x82, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x32, 0x82, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, + 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x4F, 0x82, 0x45, + 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4D, 0x82, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4B, 0x82, 0x45, + 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x49, 0x82, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x47, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x45, 0x82, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0D, 0x57, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, + 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x62, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5E, 0x82, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, + 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x5A, 0x82, 0x45, 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x58, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x44, + 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x3B, 0x82, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x82, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6C, 0x82, 0x45, + 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6B, 0x82, 0x45, + 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x64, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x60, 0x82, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0B, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x82, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x82, 0x44, 0x0A, 0x01, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6A, 0x83, 0x45, + 0x0D, 0x6D, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x76, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, + 0x0C, 0x78, 0x82, 0x45, 0x0C, 0x79, 0x82, 0x45, 0x0D, 0x7A, 0x82, 0x45, 0x0D, 0x7B, 0x83, 0x45, + 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7E, 0x84, 0x46, 0x0C, 0x7F, 0x84, 0x46, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, + 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, + 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x82, 0x83, 0x45, + 0x0C, 0x81, 0x84, 0x46, 0x0C, 0x81, 0x84, 0x45, 0x0C, 0x80, 0x84, 0x46, 0x0C, 0x80, 0x83, 0x46, + 0x0D, 0x7F, 0x83, 0x46, 0x0D, 0x7E, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0D, 0x7D, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0D, 0x7C, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, + 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x79, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, + 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x45, 0x0C, 0x05, 0x81, 0x44, + 0x0A, 0x03, 0x83, 0x45, 0x0D, 0x02, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4C, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7D, 0x82, 0x45, 0x0C, 0x7F, 0x82, 0x45, 0x0C, 0x81, 0x82, 0x45, + 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x84, 0x82, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, + 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x44, 0x0B, 0x8E, 0x82, 0x45, + 0x0B, 0x8F, 0x83, 0x45, 0x0B, 0x90, 0x83, 0x45, 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, + 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, 0x0A, 0x91, 0x84, 0x44, 0x0A, 0x91, 0x84, 0x45, + 0x0B, 0x92, 0x84, 0x44, 0x0A, 0x92, 0x83, 0x45, 0x0B, 0x93, 0x83, 0x44, 0x0A, 0x92, 0x82, 0x45, + 0x0B, 0x93, 0x83, 0x45, 0x0B, 0x92, 0x83, 0x45, 0x0B, 0x92, 0x84, 0x45, 0x0B, 0x91, 0x83, 0x46, + 0x0C, 0x90, 0x84, 0x46, 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, + 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x7F, 0x82, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x7B, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, + 0x0B, 0x04, 0x84, 0x46, 0x0F, 0x03, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x09, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x82, 0x45, + 0x0C, 0x8A, 0x82, 0x45, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0B, 0x95, 0x83, 0x45, + 0x0B, 0x96, 0x83, 0x45, 0x0B, 0x98, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x44, 0x0A, 0x99, 0x82, 0x45, + 0x0B, 0x99, 0x81, 0x44, 0x0B, 0x9A, 0x81, 0x42, 0x09, 0x9B, 0x83, 0x45, 0x0B, 0x9C, 0x84, 0x46, + 0x0C, 0x9C, 0x85, 0x48, 0x0F, 0x9E, 0x86, 0x49, 0x10, 0xA1, 0x87, 0x4A, 0x12, 0xA1, 0x86, 0x4A, + 0x13, 0xA2, 0x86, 0x4A, 0x13, 0xA2, 0x87, 0x49, 0x13, 0xA3, 0x86, 0x4A, 0x14, 0xA4, 0x86, 0x49, + 0x13, 0xA4, 0x86, 0x49, 0x13, 0xA2, 0x84, 0x48, 0x12, 0xA1, 0x84, 0x47, 0x11, 0xA0, 0x83, 0x46, + 0x10, 0x9F, 0x82, 0x45, 0x0E, 0xA0, 0x80, 0x43, 0x0B, 0x9F, 0x81, 0x42, 0x0B, 0x9E, 0x82, 0x44, + 0x0C, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x44, 0x0C, 0x9C, 0x83, 0x44, + 0x0B, 0x9A, 0x82, 0x43, 0x0A, 0x99, 0x83, 0x45, 0x0B, 0x97, 0x83, 0x45, 0x0B, 0x96, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0D, 0x91, 0x83, 0x45, 0x0C, 0x90, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, + 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, + 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x45, 0x0E, 0x02, 0x85, 0x49, 0x14, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x82, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x54, 0x82, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, + 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, + 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x8A, 0x82, 0x45, + 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8F, 0x82, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x94, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x46, + 0x0D, 0x9C, 0x83, 0x45, 0x0D, 0x9D, 0x82, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9F, 0x82, 0x44, + 0x0B, 0xA1, 0x83, 0x44, 0x0B, 0xA1, 0x82, 0x44, 0x0A, 0xA3, 0x82, 0x46, 0x0C, 0xA6, 0x85, 0x49, + 0x0F, 0xA8, 0x89, 0x4C, 0x14, 0xAA, 0x8D, 0x52, 0x1B, 0xAD, 0x8F, 0x56, 0x22, 0xAE, 0x91, 0x5B, + 0x28, 0xB2, 0x93, 0x5F, 0x30, 0xB6, 0x95, 0x62, 0x36, 0xBA, 0x96, 0x64, 0x3B, 0xBD, 0x97, 0x65, + 0x3C, 0xBF, 0x97, 0x66, 0x3D, 0xC0, 0x96, 0x67, 0x3C, 0xC2, 0x97, 0x68, 0x3C, 0xC0, 0x97, 0x69, + 0x3C, 0xC0, 0x97, 0x68, 0x3C, 0xBE, 0x98, 0x67, 0x3B, 0xBE, 0x97, 0x64, 0x38, 0xBC, 0x96, 0x63, + 0x35, 0xBA, 0x93, 0x5E, 0x2E, 0xB6, 0x8F, 0x59, 0x27, 0xB3, 0x8A, 0x51, 0x1C, 0xAF, 0x88, 0x4B, + 0x15, 0xAC, 0x84, 0x46, 0x10, 0xA9, 0x82, 0x44, 0x0C, 0xA9, 0x82, 0x43, 0x0B, 0xA8, 0x82, 0x43, + 0x0A, 0xA8, 0x83, 0x43, 0x0A, 0xA5, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x44, 0x0A, 0xA3, 0x83, 0x45, + 0x0B, 0xA2, 0x84, 0x45, 0x0C, 0xA1, 0x84, 0x46, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, + 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x45, + 0x0C, 0x98, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x91, 0x82, 0x45, + 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x87, 0x82, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x80, 0x82, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2B, 0x82, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x05, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x46, 0x0D, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0D, 0x81, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, + 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x84, 0x45, 0x0C, 0xA3, 0x84, 0x45, 0x0B, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x46, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x44, 0x0C, 0xAA, 0x84, 0x47, 0x0F, 0xAA, 0x88, 0x4B, + 0x14, 0xAC, 0x8B, 0x50, 0x1C, 0xB3, 0x91, 0x59, 0x2A, 0xB9, 0x98, 0x63, 0x39, 0xC0, 0x9D, 0x6A, + 0x42, 0xC7, 0x9E, 0x6F, 0x4C, 0xCC, 0xA0, 0x74, 0x52, 0xD2, 0xA0, 0x77, 0x57, 0xD9, 0x9F, 0x77, + 0x5A, 0xE1, 0x9D, 0x77, 0x5B, 0xE7, 0x9C, 0x76, 0x5A, 0xED, 0x9B, 0x74, 0x5A, 0xF0, 0x9A, 0x74, + 0x5A, 0xF3, 0x9A, 0x74, 0x5A, 0xF3, 0x9B, 0x75, 0x5A, 0xF4, 0x9B, 0x75, 0x5B, 0xF3, 0x9C, 0x77, + 0x5C, 0xF2, 0x9C, 0x77, 0x5C, 0xF2, 0x9D, 0x78, 0x5E, 0xF1, 0x9E, 0x78, 0x5E, 0xEE, 0x9E, 0x78, + 0x5D, 0xE9, 0xA1, 0x78, 0x5C, 0xE2, 0x9F, 0x78, 0x59, 0xDC, 0x9F, 0x76, 0x54, 0xD5, 0x9D, 0x71, + 0x4C, 0xD1, 0x9D, 0x6C, 0x43, 0xCA, 0x98, 0x66, 0x3B, 0xC6, 0x94, 0x5E, 0x2E, 0xBF, 0x8D, 0x54, + 0x22, 0xB8, 0x87, 0x4C, 0x16, 0xB5, 0x84, 0x47, 0x11, 0xAF, 0x83, 0x45, 0x0E, 0xAC, 0x82, 0x45, + 0x0D, 0xAB, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x44, 0x0C, 0xA8, 0x84, 0x45, + 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, + 0x0C, 0xA1, 0x83, 0x45, 0x0D, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x92, 0x82, 0x45, + 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, + 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0D, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x82, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x95, 0x82, 0x45, 0x0C, 0x99, 0x83, 0x45, 0x0D, 0x9C, 0x82, 0x45, + 0x0C, 0x9F, 0x83, 0x45, 0x0D, 0xA1, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, + 0x0C, 0xA7, 0x83, 0x44, 0x0B, 0xA9, 0x83, 0x45, 0x0B, 0xAA, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x47, + 0x0B, 0xAE, 0x8A, 0x4C, 0x13, 0xB2, 0x8E, 0x54, 0x21, 0xB9, 0x95, 0x5F, 0x32, 0xC3, 0x98, 0x69, + 0x42, 0xCD, 0x9E, 0x72, 0x50, 0xD6, 0xA1, 0x78, 0x59, 0xDF, 0xA0, 0x78, 0x5A, 0xE7, 0x9E, 0x77, + 0x59, 0xEF, 0x9B, 0x75, 0x58, 0xF6, 0x99, 0x73, 0x56, 0xFA, 0x98, 0x72, 0x57, 0xFC, 0x99, 0x73, + 0x58, 0xFE, 0x9B, 0x74, 0x59, 0xFF, 0x9B, 0x74, 0x5A, 0xFF, 0x9B, 0x75, 0x5B, 0xFF, 0x9B, 0x75, + 0x5B, 0xFE, 0x9B, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x99, 0x74, + 0x5B, 0xFF, 0x99, 0x74, 0x5B, 0xFE, 0x99, 0x75, 0x5C, 0xFF, 0x9B, 0x76, 0x5D, 0xFE, 0x9C, 0x77, + 0x5D, 0xFF, 0x9D, 0x77, 0x5D, 0xFD, 0x9D, 0x77, 0x5C, 0xFD, 0x9F, 0x79, 0x5D, 0xFA, 0xA1, 0x7B, + 0x5F, 0xF8, 0xA4, 0x7C, 0x62, 0xF2, 0xA5, 0x7F, 0x63, 0xEE, 0xA5, 0x7D, 0x61, 0xE5, 0xA2, 0x7A, + 0x59, 0xDC, 0x9D, 0x70, 0x4C, 0xD1, 0x97, 0x65, 0x39, 0xCA, 0x8F, 0x57, 0x25, 0xC1, 0x89, 0x4D, + 0x18, 0xB9, 0x84, 0x47, 0x10, 0xB4, 0x83, 0x44, 0x0C, 0xB2, 0x83, 0x43, 0x0B, 0xAE, 0x83, 0x45, + 0x0C, 0xAD, 0x83, 0x45, 0x0B, 0xAC, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA9, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x45, 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x82, 0x45, + 0x0C, 0xA2, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9A, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x82, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x82, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0F, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0D, 0x70, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0D, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x99, 0x83, 0x44, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0D, 0xA2, 0x83, 0x45, 0x0C, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA9, 0x84, 0x45, + 0x0D, 0xAC, 0x84, 0x45, 0x0E, 0xAE, 0x88, 0x4A, 0x13, 0xB1, 0x8E, 0x54, 0x21, 0xBA, 0x99, 0x62, + 0x37, 0xC4, 0x9E, 0x6F, 0x4C, 0xD0, 0xA2, 0x77, 0x58, 0xDE, 0xA1, 0x7A, 0x5E, 0xE9, 0x9F, 0x78, + 0x5E, 0xF3, 0x9A, 0x75, 0x5B, 0xFA, 0x96, 0x71, 0x57, 0xFD, 0x92, 0x6C, 0x52, 0xFF, 0x8F, 0x68, + 0x4E, 0xFF, 0x8B, 0x65, 0x4A, 0xFF, 0x8A, 0x63, 0x47, 0xFF, 0x87, 0x5F, 0x44, 0xFF, 0x87, 0x5D, + 0x42, 0xFF, 0x85, 0x5B, 0x41, 0xFF, 0x83, 0x5A, 0x3F, 0xFF, 0x82, 0x59, 0x3E, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x82, 0x57, 0x3C, 0xFF, 0x82, 0x56, 0x3B, 0xFF, 0x81, 0x56, 0x3B, 0xFF, 0x82, 0x57, + 0x3D, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x84, 0x5B, 0x41, 0xFF, 0x86, 0x5E, 0x43, 0xFF, 0x88, 0x60, + 0x45, 0xFF, 0x8A, 0x62, 0x48, 0xFF, 0x8C, 0x65, 0x4A, 0xFF, 0x8F, 0x69, 0x4E, 0xFF, 0x92, 0x6D, + 0x52, 0xFF, 0x95, 0x70, 0x55, 0xFF, 0x97, 0x72, 0x58, 0xFE, 0x99, 0x74, 0x5A, 0xFD, 0x9B, 0x78, + 0x5E, 0xFA, 0xA0, 0x7B, 0x61, 0xF6, 0xA0, 0x7D, 0x61, 0xEF, 0xA3, 0x7C, 0x5D, 0xE4, 0xA0, 0x78, + 0x54, 0xD8, 0x9C, 0x6C, 0x41, 0xCC, 0x92, 0x5B, 0x2C, 0xC1, 0x89, 0x4D, 0x17, 0xB9, 0x83, 0x45, + 0x0E, 0xB3, 0x84, 0x45, 0x0C, 0xB0, 0x83, 0x45, 0x0C, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x45, + 0x0D, 0xAC, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x45, 0x0D, 0xA9, 0x83, 0x45, + 0x0C, 0xA6, 0x83, 0x45, 0x0D, 0xA4, 0x83, 0x45, 0x0C, 0xA1, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x82, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x49, + 0x12, 0x01, 0x88, 0x4C, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x47, 0x0F, 0x01, 0x83, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x95, 0x83, 0x44, 0x0D, 0x99, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x46, 0x0C, 0xA8, 0x86, 0x48, 0x0F, 0xAB, 0x88, 0x4D, + 0x14, 0xB1, 0x93, 0x5C, 0x29, 0xBC, 0x9A, 0x6B, 0x42, 0xCB, 0x9F, 0x75, 0x54, 0xDD, 0x9F, 0x79, + 0x59, 0xEB, 0x9C, 0x76, 0x59, 0xF5, 0x96, 0x6F, 0x53, 0xFC, 0x92, 0x6A, 0x4E, 0xFF, 0x8F, 0x66, + 0x4B, 0xFF, 0x8A, 0x60, 0x44, 0xFF, 0x87, 0x5B, 0x40, 0xFF, 0x84, 0x57, 0x3C, 0xFF, 0x80, 0x53, + 0x37, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x76, 0x48, 0x2D, 0xFF, 0x74, 0x45, + 0x2C, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x71, 0x44, 0x2A, 0xFF, 0x71, 0x43, 0x2A, 0xFF, 0x70, 0x43, + 0x2A, 0xFF, 0x71, 0x43, 0x2B, 0xFF, 0x71, 0x44, 0x2B, 0xFF, 0x71, 0x45, 0x2C, 0xFF, 0x71, 0x45, + 0x2C, 0xFF, 0x72, 0x46, 0x2D, 0xFF, 0x72, 0x47, 0x2D, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4A, + 0x31, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x7B, 0x50, 0x37, 0xFF, 0x7E, 0x52, 0x3A, 0xFF, 0x81, 0x55, + 0x3D, 0xFF, 0x85, 0x5A, 0x42, 0xFF, 0x88, 0x5E, 0x46, 0xFF, 0x8E, 0x66, 0x4D, 0xFF, 0x92, 0x6B, + 0x52, 0xFF, 0x97, 0x70, 0x57, 0xFF, 0x9A, 0x75, 0x5B, 0xFF, 0x9F, 0x79, 0x5D, 0xFE, 0xA2, 0x7B, + 0x60, 0xFB, 0xA5, 0x7E, 0x62, 0xF2, 0xA4, 0x7D, 0x5F, 0xE5, 0xA0, 0x75, 0x53, 0xD5, 0x97, 0x65, + 0x38, 0xC8, 0x8B, 0x52, 0x1D, 0xBC, 0x85, 0x46, 0x0E, 0xB3, 0x83, 0x43, 0x0B, 0xAF, 0x83, 0x46, + 0x0D, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x46, 0x0C, 0xAC, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x73, 0x82, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x4A, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0D, 0x4F, 0x83, 0x45, + 0x0D, 0x5A, 0x83, 0x45, 0x0D, 0x63, 0x82, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8D, 0x84, 0x45, + 0x0C, 0x93, 0x84, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x85, 0x47, 0x11, 0xA3, 0x8F, 0x52, 0x1F, 0xAC, 0x99, 0x64, 0x39, 0xBC, 0xA1, 0x75, + 0x50, 0xD2, 0xA2, 0x7B, 0x5D, 0xE3, 0x9F, 0x78, 0x5C, 0xF3, 0x98, 0x72, 0x56, 0xFA, 0x90, 0x6B, + 0x4F, 0xFD, 0x8B, 0x64, 0x47, 0xFF, 0x86, 0x5C, 0x40, 0xFF, 0x80, 0x55, 0x38, 0xFF, 0x7C, 0x4E, + 0x33, 0xFF, 0x77, 0x49, 0x2E, 0xFF, 0x74, 0x46, 0x2C, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x70, 0x43, + 0x29, 0xFF, 0x6F, 0x41, 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x6E, 0x41, 0x26, 0xFF, 0x6F, 0x41, + 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x71, 0x43, + 0x29, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x46, + 0x2B, 0xFF, 0x72, 0x46, 0x2B, 0xFF, 0x73, 0x47, 0x2C, 0xFF, 0x74, 0x47, 0x2D, 0xFF, 0x75, 0x48, + 0x2E, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4B, 0x31, 0xFF, 0x77, 0x4B, 0x32, 0xFF, 0x78, 0x4C, + 0x32, 0xFF, 0x7A, 0x4D, 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7D, 0x51, 0x38, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x84, 0x5A, 0x40, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x8D, 0x66, 0x4C, 0xFF, 0x91, 0x6C, + 0x52, 0xFF, 0x96, 0x71, 0x56, 0xFE, 0x9C, 0x77, 0x5C, 0xFD, 0xA1, 0x7C, 0x61, 0xF8, 0xA3, 0x7F, + 0x63, 0xEC, 0xA4, 0x7A, 0x59, 0xDA, 0x9C, 0x6D, 0x44, 0xC6, 0x90, 0x57, 0x25, 0xB8, 0x86, 0x48, + 0x11, 0xAF, 0x84, 0x45, 0x0D, 0xA9, 0x84, 0x46, 0x0C, 0xA5, 0x83, 0x45, 0x0D, 0xA3, 0x83, 0x45, + 0x0C, 0xA2, 0x83, 0x44, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0D, 0x9B, 0x83, 0x45, + 0x0C, 0x97, 0x83, 0x45, 0x0D, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x5D, 0x82, 0x45, 0x0C, 0x66, 0x82, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x77, 0x83, 0x44, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x85, 0x84, 0x45, + 0x0B, 0x8B, 0x84, 0x45, 0x0C, 0x8F, 0x84, 0x46, 0x0C, 0x92, 0x84, 0x47, 0x0F, 0x97, 0x89, 0x4E, + 0x19, 0xA1, 0x96, 0x60, 0x33, 0xB1, 0x9F, 0x73, 0x4F, 0xCB, 0xA0, 0x79, 0x5A, 0xE5, 0x9B, 0x74, + 0x56, 0xF4, 0x93, 0x6B, 0x4F, 0xFD, 0x8E, 0x64, 0x49, 0xFF, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x52, + 0x37, 0xFE, 0x77, 0x49, 0x2E, 0xFF, 0x70, 0x42, 0x27, 0xFF, 0x6F, 0x3F, 0x23, 0xFF, 0x6D, 0x3E, + 0x22, 0xFF, 0x6C, 0x3D, 0x22, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3F, + 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6F, 0x41, + 0x26, 0xFF, 0x70, 0x42, 0x26, 0xFF, 0x71, 0x43, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x44, + 0x29, 0xFF, 0x73, 0x44, 0x29, 0xFF, 0x74, 0x45, 0x2A, 0xFF, 0x74, 0x46, 0x2A, 0xFF, 0x74, 0x46, + 0x2B, 0xFF, 0x74, 0x47, 0x2B, 0xFF, 0x75, 0x48, 0x2C, 0xFF, 0x76, 0x49, 0x2D, 0xFF, 0x76, 0x49, + 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x77, 0x4B, 0x30, 0xFF, 0x78, 0x4B, 0x30, 0xFF, 0x78, 0x4B, + 0x31, 0xFF, 0x79, 0x4B, 0x31, 0xFF, 0x78, 0x4C, 0x31, 0xFF, 0x79, 0x4C, 0x32, 0xFF, 0x7A, 0x4D, + 0x34, 0xFF, 0x7C, 0x4F, 0x36, 0xFF, 0x7F, 0x52, 0x38, 0xFF, 0x82, 0x55, 0x3B, 0xFF, 0x86, 0x5B, + 0x41, 0xFF, 0x8C, 0x63, 0x4A, 0xFF, 0x91, 0x69, 0x4F, 0xFF, 0x96, 0x70, 0x55, 0xFF, 0x9E, 0x77, + 0x5B, 0xFF, 0xA4, 0x7D, 0x61, 0xFC, 0xA7, 0x81, 0x65, 0xF1, 0xA7, 0x7E, 0x60, 0xDB, 0x9D, 0x6E, + 0x46, 0xC2, 0x8E, 0x56, 0x23, 0xB0, 0x84, 0x45, 0x0E, 0xA3, 0x82, 0x43, 0x0A, 0x9D, 0x83, 0x45, + 0x0C, 0x9B, 0x83, 0x44, 0x0B, 0x98, 0x84, 0x46, 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0D, 0x90, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x84, 0x83, 0x45, + 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x69, 0x83, 0x45, + 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, 0x0C, 0x09, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0D, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x81, 0x44, 0x0B, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, 0x0D, 0x3B, 0x83, 0x45, 0x0C, 0x44, 0x82, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0D, 0x5D, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x71, 0x83, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0B, 0x7B, 0x83, 0x44, + 0x0C, 0x80, 0x82, 0x43, 0x0C, 0x84, 0x8B, 0x4E, 0x1A, 0x8E, 0x99, 0x64, 0x39, 0xA4, 0xA3, 0x77, + 0x53, 0xC5, 0xA2, 0x7A, 0x5D, 0xE0, 0x9A, 0x73, 0x57, 0xF3, 0x93, 0x6B, 0x4E, 0xFB, 0x8B, 0x5F, + 0x42, 0xFE, 0x82, 0x55, 0x38, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x73, 0x45, 0x28, 0xFF, 0x6F, 0x40, + 0x25, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, + 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3D, 0x20, 0xFF, 0x6D, 0x3E, 0x20, 0xFF, 0x6E, 0x3F, + 0x21, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x70, 0x41, 0x23, 0xFF, 0x71, 0x42, + 0x24, 0xFF, 0x72, 0x43, 0x25, 0xFF, 0x73, 0x43, 0x26, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x28, 0xFF, 0x76, 0x46, 0x29, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x76, 0x47, + 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x78, 0x49, 0x2B, 0xFF, 0x78, 0x49, + 0x2C, 0xFF, 0x79, 0x4A, 0x2C, 0xFF, 0x79, 0x4A, 0x2D, 0xFF, 0x79, 0x4B, 0x2D, 0xFF, 0x79, 0x4B, + 0x2E, 0xFF, 0x79, 0x4C, 0x2E, 0xFF, 0x79, 0x4C, 0x2F, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x79, 0x4C, + 0x31, 0xFF, 0x7A, 0x4C, 0x31, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x7D, 0x4F, 0x34, 0xFF, 0x7E, 0x51, + 0x36, 0xFF, 0x80, 0x53, 0x39, 0xFF, 0x83, 0x58, 0x3D, 0xFF, 0x88, 0x5E, 0x44, 0xFF, 0x8F, 0x66, + 0x4C, 0xFF, 0x95, 0x6D, 0x53, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0x9E, 0x79, 0x60, 0xFD, 0xA4, 0x80, + 0x66, 0xEE, 0xA7, 0x7F, 0x60, 0xD4, 0x9E, 0x6F, 0x47, 0xB6, 0x8D, 0x52, 0x1F, 0xA1, 0x84, 0x45, + 0x0D, 0x93, 0x83, 0x44, 0x0A, 0x8C, 0x84, 0x45, 0x0B, 0x88, 0x84, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x7E, 0x83, 0x45, 0x0D, 0x79, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0D, 0x6E, 0x83, 0x45, 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x58, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x82, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x05, 0x82, 0x44, 0x0D, 0x03, 0x82, 0x44, 0x0E, 0x02, 0x83, 0x45, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0D, 0x1D, 0x83, 0x45, + 0x0D, 0x25, 0x83, 0x45, 0x0D, 0x2C, 0x83, 0x45, 0x0D, 0x34, 0x83, 0x45, 0x0C, 0x3C, 0x82, 0x45, + 0x0B, 0x45, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0D, 0x53, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0D, 0x65, 0x85, 0x47, 0x0D, 0x6B, 0x83, 0x44, 0x0A, 0x71, 0x82, 0x46, + 0x0C, 0x77, 0x91, 0x5C, 0x2A, 0x89, 0xA1, 0x74, 0x4E, 0xAC, 0xA3, 0x7B, 0x5C, 0xD4, 0x9E, 0x74, + 0x57, 0xED, 0x93, 0x68, 0x4C, 0xFA, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x75, 0x46, + 0x2A, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x6B, 0x3D, 0x1F, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x69, 0x3A, + 0x1D, 0xFF, 0x69, 0x39, 0x1D, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3B, + 0x1E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x6D, 0x3D, 0x1F, 0xFF, 0x6E, 0x3E, 0x1F, 0xFF, 0x6F, 0x3F, + 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x71, 0x41, 0x21, 0xFF, 0x72, 0x42, 0x22, 0xFF, 0x73, 0x43, + 0x23, 0xFF, 0x74, 0x44, 0x24, 0xFF, 0x75, 0x44, 0x24, 0xFF, 0x76, 0x45, 0x25, 0xFF, 0x77, 0x46, + 0x26, 0xFF, 0x77, 0x47, 0x27, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x7A, 0x49, 0x2A, 0xFF, 0x7A, 0x4A, + 0x2A, 0xFF, 0x7B, 0x4A, 0x2B, 0xFF, 0x7A, 0x4B, 0x2B, 0xFF, 0x7B, 0x4B, 0x2C, 0xFF, 0x7A, 0x4C, + 0x2C, 0xFF, 0x7B, 0x4C, 0x2D, 0xFF, 0x7B, 0x4C, 0x2E, 0xFF, 0x7B, 0x4C, 0x2F, 0xFF, 0x7B, 0x4D, + 0x2F, 0xFF, 0x7B, 0x4D, 0x30, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7C, 0x4E, 0x32, 0xFF, 0x7D, 0x4F, + 0x33, 0xFF, 0x7E, 0x50, 0x34, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x80, 0x53, 0x38, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x88, 0x5E, 0x43, 0xFF, 0x8E, 0x65, 0x4B, 0xFF, 0x96, 0x6E, 0x54, 0xFF, 0x9E, 0x77, + 0x5D, 0xFF, 0xA4, 0x7E, 0x62, 0xF9, 0xA7, 0x83, 0x65, 0xE6, 0xA8, 0x7F, 0x5E, 0xC5, 0x9A, 0x68, + 0x3A, 0xA1, 0x8A, 0x4F, 0x18, 0x8C, 0x81, 0x42, 0x09, 0x80, 0x82, 0x43, 0x0A, 0x7B, 0x84, 0x46, + 0x0C, 0x79, 0x84, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0D, 0x68, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x36, 0x82, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x26, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x19, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0E, 0x02, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x0F, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, 0x0D, 0x19, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x44, 0x0B, 0x46, 0x84, 0x45, 0x0B, 0x4D, 0x84, 0x46, + 0x0E, 0x53, 0x83, 0x44, 0x0B, 0x59, 0x84, 0x45, 0x0A, 0x61, 0x8F, 0x57, 0x24, 0x6E, 0xA4, 0x76, + 0x4E, 0x91, 0xA4, 0x7C, 0x5E, 0xBC, 0x9D, 0x75, 0x58, 0xE4, 0x95, 0x6B, 0x4D, 0xF7, 0x89, 0x5D, + 0x3E, 0xFD, 0x7E, 0x50, 0x32, 0xFE, 0x76, 0x46, 0x2B, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6A, 0x3A, + 0x1D, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x68, 0x38, 0x1A, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x69, 0x39, + 0x1A, 0xFF, 0x6A, 0x39, 0x1B, 0xFF, 0x6B, 0x3A, 0x1B, 0xFF, 0x6C, 0x3A, 0x1C, 0xFF, 0x6E, 0x3B, + 0x1D, 0xFF, 0x6F, 0x3C, 0x1D, 0xFF, 0x6F, 0x3E, 0x1E, 0xFF, 0x70, 0x3F, 0x1F, 0xFF, 0x72, 0x40, + 0x20, 0xFF, 0x73, 0x41, 0x20, 0xFF, 0x74, 0x42, 0x21, 0xFF, 0x75, 0x43, 0x22, 0xFF, 0x76, 0x45, + 0x23, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x78, 0x46, 0x24, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x79, 0x47, + 0x25, 0xFF, 0x7A, 0x48, 0x26, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7C, 0x4A, + 0x28, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7D, 0x4C, 0x2A, 0xFF, 0x7D, 0x4D, + 0x2A, 0xFF, 0x7E, 0x4D, 0x2B, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4D, 0x2C, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4F, + 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x30, 0xFF, 0x7D, 0x4F, + 0x31, 0xFF, 0x7E, 0x4F, 0x31, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x7E, 0x51, 0x33, 0xFF, 0x7F, 0x52, + 0x35, 0xFF, 0x80, 0x54, 0x37, 0xFF, 0x83, 0x57, 0x3C, 0xFF, 0x89, 0x5E, 0x44, 0xFF, 0x91, 0x68, + 0x4D, 0xFF, 0x97, 0x6F, 0x53, 0xFE, 0x9D, 0x77, 0x5C, 0xFD, 0xA2, 0x7D, 0x63, 0xF3, 0xA7, 0x83, + 0x67, 0xD5, 0xA7, 0x7D, 0x5A, 0xAD, 0x98, 0x63, 0x36, 0x8A, 0x85, 0x47, 0x10, 0x74, 0x81, 0x42, + 0x09, 0x67, 0x83, 0x44, 0x0B, 0x64, 0x84, 0x45, 0x0B, 0x62, 0x83, 0x44, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x46, 0x0D, 0x56, 0x83, 0x45, 0x0C, 0x50, 0x84, 0x45, 0x0D, 0x4A, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x20, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x08, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x44, + 0x0A, 0x04, 0x81, 0x44, 0x0B, 0x03, 0x83, 0x48, 0x12, 0x01, 0x8C, 0x53, 0x1E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x44, 0x0A, 0x01, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0D, 0x09, 0x83, 0x45, 0x0D, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, + 0x0D, 0x19, 0x83, 0x45, 0x0C, 0x1E, 0x82, 0x45, 0x0C, 0x24, 0x84, 0x44, 0x0C, 0x29, 0x84, 0x46, + 0x0D, 0x2F, 0x84, 0x45, 0x0C, 0x34, 0x84, 0x45, 0x0B, 0x3A, 0x83, 0x44, 0x0B, 0x40, 0x7F, 0x40, + 0x05, 0x46, 0x85, 0x47, 0x0F, 0x52, 0x99, 0x69, 0x3E, 0x68, 0xAB, 0x81, 0x62, 0x98, 0xA3, 0x7A, + 0x5B, 0xD4, 0x97, 0x6D, 0x50, 0xF5, 0x8B, 0x60, 0x44, 0xFF, 0x81, 0x54, 0x37, 0xFF, 0x76, 0x46, + 0x29, 0xFF, 0x6F, 0x3E, 0x21, 0xFE, 0x69, 0x39, 0x1C, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x66, 0x35, + 0x18, 0xFF, 0x67, 0x35, 0x18, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x68, 0x37, 0x18, 0xFF, 0x69, 0x38, + 0x19, 0xFF, 0x6B, 0x39, 0x1A, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6E, 0x3C, 0x1C, 0xFF, 0x70, 0x3D, + 0x1D, 0xFF, 0x72, 0x3E, 0x1D, 0xFF, 0x73, 0x40, 0x1E, 0xFF, 0x74, 0x42, 0x1F, 0xFF, 0x75, 0x43, + 0x20, 0xFF, 0x76, 0x44, 0x21, 0xFF, 0x77, 0x45, 0x21, 0xFF, 0x78, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7B, 0x49, 0x24, 0xFF, 0x7C, 0x4A, 0x25, 0xFF, 0x7C, 0x4A, + 0x25, 0xFF, 0x7D, 0x4A, 0x25, 0xFF, 0x7E, 0x4B, 0x27, 0xFF, 0x7F, 0x4C, 0x27, 0xFF, 0x7F, 0x4D, + 0x28, 0xFF, 0x7F, 0x4D, 0x28, 0xFF, 0x7F, 0x4E, 0x29, 0xFF, 0x80, 0x4E, 0x29, 0xFF, 0x80, 0x4F, + 0x2A, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x80, 0x4F, 0x2B, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x81, 0x50, + 0x2C, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x80, 0x51, + 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2F, 0xFF, 0x7F, 0x4F, 0x2F, 0xFF, 0x7F, 0x4F, + 0x30, 0xFF, 0x7F, 0x4F, 0x30, 0xFF, 0x7F, 0x50, 0x31, 0xFF, 0x7F, 0x51, 0x32, 0xFF, 0x7F, 0x51, + 0x33, 0xFF, 0x7F, 0x52, 0x34, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x81, 0x55, 0x39, 0xFF, 0x85, 0x59, + 0x3E, 0xFF, 0x8B, 0x62, 0x46, 0xFF, 0x92, 0x6B, 0x4F, 0xFF, 0x9A, 0x73, 0x57, 0xFF, 0xA3, 0x7C, + 0x60, 0xFA, 0xA7, 0x81, 0x65, 0xE6, 0xAA, 0x86, 0x68, 0xBA, 0xA3, 0x76, 0x50, 0x8A, 0x8C, 0x52, + 0x1F, 0x67, 0x83, 0x43, 0x0A, 0x58, 0x82, 0x42, 0x0A, 0x53, 0x83, 0x45, 0x0B, 0x4F, 0x84, 0x46, + 0x0B, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0D, 0x43, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, + 0x0D, 0x38, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x11, 0x82, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x44, 0x0B, 0x05, 0x82, 0x44, + 0x0A, 0x03, 0x81, 0x44, 0x0D, 0x02, 0x8D, 0x55, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x45, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x05, 0x82, 0x45, + 0x0D, 0x07, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, + 0x0E, 0x13, 0x83, 0x45, 0x0E, 0x18, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0B, 0x21, 0x83, 0x44, + 0x0A, 0x24, 0x87, 0x46, 0x0D, 0x2A, 0x83, 0x41, 0x09, 0x31, 0x7C, 0x3D, 0x04, 0x35, 0x91, 0x57, + 0x24, 0x45, 0xAA, 0x80, 0x5C, 0x6A, 0xAC, 0x86, 0x69, 0xAA, 0x9E, 0x75, 0x57, 0xE5, 0x90, 0x66, + 0x48, 0xFC, 0x85, 0x59, 0x3B, 0xFF, 0x7D, 0x4D, 0x2F, 0xFF, 0x71, 0x3F, 0x21, 0xFF, 0x6B, 0x39, + 0x1B, 0xFF, 0x68, 0x36, 0x17, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x34, + 0x15, 0xFF, 0x69, 0x35, 0x16, 0xFF, 0x6A, 0x36, 0x16, 0xFF, 0x6B, 0x36, 0x17, 0xFF, 0x6C, 0x38, + 0x17, 0xFF, 0x6D, 0x39, 0x18, 0xFF, 0x6E, 0x3B, 0x19, 0xFF, 0x6F, 0x3C, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x3F, 0x1C, 0xFF, 0x74, 0x41, 0x1C, 0xFF, 0x76, 0x42, 0x1D, 0xFF, 0x77, 0x43, + 0x1E, 0xFF, 0x79, 0x45, 0x1F, 0xFF, 0x7A, 0x46, 0x21, 0xFF, 0x7B, 0x47, 0x21, 0xFF, 0x7C, 0x48, + 0x22, 0xFF, 0x7D, 0x49, 0x24, 0xFF, 0x7E, 0x4B, 0x25, 0xFF, 0x7F, 0x4C, 0x25, 0xFF, 0x7F, 0x4C, + 0x25, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x81, 0x4D, 0x27, 0xFF, 0x81, 0x4E, + 0x28, 0xFF, 0x82, 0x4E, 0x28, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x50, + 0x2A, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x84, 0x51, 0x2C, 0xFF, 0x83, 0x51, + 0x2C, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x83, 0x51, 0x2E, 0xFF, 0x83, 0x52, + 0x2E, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x81, 0x52, + 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x31, 0xFF, 0x81, 0x51, + 0x31, 0xFF, 0x81, 0x51, 0x32, 0xFF, 0x81, 0x52, 0x33, 0xFF, 0x81, 0x52, 0x34, 0xFF, 0x82, 0x54, + 0x37, 0xFF, 0x84, 0x57, 0x3A, 0xFF, 0x88, 0x5D, 0x40, 0xFF, 0x8F, 0x66, 0x49, 0xFF, 0x98, 0x70, + 0x55, 0xFF, 0x9F, 0x78, 0x5C, 0xFE, 0xA5, 0x80, 0x63, 0xF2, 0xAC, 0x87, 0x6B, 0xCC, 0xAE, 0x87, + 0x66, 0x93, 0x9A, 0x66, 0x3A, 0x62, 0x86, 0x46, 0x0D, 0x47, 0x81, 0x3F, 0x05, 0x3F, 0x84, 0x44, + 0x0B, 0x3B, 0x84, 0x46, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, + 0x0C, 0x2C, 0x84, 0x46, 0x0D, 0x27, 0x83, 0x45, 0x0C, 0x24, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, + 0x0C, 0x02, 0x85, 0x49, 0x12, 0x01, 0xA3, 0x71, 0x44, 0x01, 0x9F, 0x71, 0x4C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x81, 0x44, + 0x0B, 0x05, 0x82, 0x45, 0x0C, 0x07, 0x82, 0x46, 0x0C, 0x09, 0x83, 0x46, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x84, 0x46, 0x0C, 0x16, 0x84, 0x45, 0x0D, 0x19, 0x86, 0x47, + 0x09, 0x1D, 0x78, 0x37, 0x00, 0x21, 0x7E, 0x42, 0x07, 0x27, 0x9D, 0x6B, 0x3A, 0x3A, 0xB0, 0x8A, + 0x6A, 0x6E, 0xA7, 0x82, 0x67, 0xBC, 0x97, 0x6E, 0x51, 0xED, 0x88, 0x5C, 0x3E, 0xFD, 0x7C, 0x4E, + 0x30, 0xFF, 0x73, 0x42, 0x24, 0xFF, 0x68, 0x35, 0x16, 0xFF, 0x63, 0x2F, 0x10, 0xFF, 0x61, 0x2E, + 0x0F, 0xFF, 0x60, 0x2D, 0x0E, 0xFF, 0x61, 0x2D, 0x0D, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x65, 0x2F, + 0x0E, 0xFF, 0x66, 0x30, 0x0F, 0xFF, 0x68, 0x31, 0x10, 0xFF, 0x6A, 0x32, 0x10, 0xFF, 0x6B, 0x34, + 0x10, 0xFF, 0x6C, 0x36, 0x11, 0xFF, 0x6E, 0x37, 0x12, 0xFF, 0x6F, 0x39, 0x13, 0xFF, 0x71, 0x3B, + 0x14, 0xFF, 0x73, 0x3C, 0x16, 0xFF, 0x74, 0x3E, 0x17, 0xFF, 0x76, 0x3F, 0x18, 0xFF, 0x77, 0x41, + 0x18, 0xFF, 0x79, 0x42, 0x1A, 0xFF, 0x7A, 0x44, 0x1C, 0xFF, 0x7C, 0x46, 0x1E, 0xFF, 0x7C, 0x47, + 0x1E, 0xFF, 0x7D, 0x48, 0x20, 0xFF, 0x7E, 0x4A, 0x22, 0xFF, 0x80, 0x4B, 0x23, 0xFF, 0x80, 0x4D, + 0x24, 0xFF, 0x81, 0x4D, 0x24, 0xFF, 0x81, 0x4E, 0x25, 0xFF, 0x82, 0x4E, 0x26, 0xFF, 0x82, 0x4F, + 0x27, 0xFF, 0x84, 0x4F, 0x28, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x85, 0x52, + 0x2A, 0xFF, 0x85, 0x52, 0x2A, 0xFF, 0x85, 0x53, 0x2B, 0xFF, 0x86, 0x53, 0x2B, 0xFF, 0x85, 0x53, + 0x2C, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, 0x2D, 0xFF, 0x86, 0x53, 0x2E, 0xFF, 0x85, 0x54, + 0x2E, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x84, 0x54, + 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x84, 0x53, 0x30, 0xFF, 0x84, 0x52, 0x30, 0xFF, 0x83, 0x52, + 0x31, 0xFF, 0x82, 0x52, 0x31, 0xFF, 0x82, 0x53, 0x32, 0xFF, 0x82, 0x52, 0x33, 0xFF, 0x81, 0x53, + 0x34, 0xFF, 0x82, 0x54, 0x35, 0xFF, 0x82, 0x55, 0x36, 0xFF, 0x84, 0x59, 0x3B, 0xFF, 0x8A, 0x60, + 0x44, 0xFF, 0x95, 0x6D, 0x51, 0xFF, 0x9F, 0x78, 0x5C, 0xFF, 0xA4, 0x7E, 0x62, 0xF7, 0xAB, 0x85, + 0x69, 0xDA, 0xB3, 0x8C, 0x6F, 0x9B, 0xA8, 0x7B, 0x57, 0x58, 0x89, 0x4E, 0x18, 0x39, 0x7A, 0x38, + 0x00, 0x30, 0x82, 0x41, 0x07, 0x2C, 0x84, 0x47, 0x0B, 0x28, 0x84, 0x46, 0x0D, 0x25, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x44, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x17, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x01, 0x87, 0x49, 0x12, 0x01, 0x9B, 0x69, 0x3A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x48, + 0x10, 0x01, 0x84, 0x47, 0x0F, 0x02, 0x83, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0A, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x81, 0x45, 0x0B, 0x04, 0x82, 0x46, 0x0B, 0x06, 0x82, 0x46, 0x0A, 0x08, 0x83, 0x47, + 0x0B, 0x0A, 0x84, 0x47, 0x0A, 0x0C, 0x7F, 0x3F, 0x08, 0x0E, 0x80, 0x3F, 0x04, 0x12, 0x77, 0x36, + 0x00, 0x17, 0x8C, 0x52, 0x1C, 0x1B, 0xB2, 0x89, 0x63, 0x37, 0xB0, 0x8C, 0x6F, 0x79, 0x9F, 0x78, + 0x5D, 0xCB, 0x96, 0x6A, 0x4C, 0xF3, 0x86, 0x58, 0x38, 0xFD, 0x75, 0x45, 0x25, 0xFF, 0x6B, 0x38, + 0x18, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x61, 0x2A, 0x0A, 0xFF, 0x61, 0x2A, 0x09, 0xFF, 0x5F, 0x29, + 0x08, 0xFF, 0x60, 0x2A, 0x07, 0xFF, 0x61, 0x2A, 0x07, 0xFF, 0x63, 0x2A, 0x07, 0xFF, 0x64, 0x2B, + 0x08, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x6A, 0x31, + 0x09, 0xFF, 0x6B, 0x32, 0x09, 0xFF, 0x6C, 0x33, 0x0A, 0xFF, 0x6D, 0x34, 0x0B, 0xFF, 0x6F, 0x35, + 0x0B, 0xFF, 0x70, 0x36, 0x0C, 0xFF, 0x71, 0x37, 0x0D, 0xFF, 0x72, 0x38, 0x0D, 0xFF, 0x74, 0x3A, + 0x0E, 0xFF, 0x75, 0x3B, 0x0E, 0xFF, 0x76, 0x3C, 0x10, 0xFF, 0x77, 0x3D, 0x11, 0xFF, 0x78, 0x40, + 0x13, 0xFF, 0x7A, 0x41, 0x16, 0xFF, 0x7B, 0x43, 0x18, 0xFF, 0x7D, 0x45, 0x1B, 0xFF, 0x7F, 0x48, + 0x1D, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x81, 0x4D, 0x21, 0xFF, 0x83, 0x4E, 0x24, 0xFF, 0x83, 0x4F, + 0x25, 0xFF, 0x85, 0x51, 0x27, 0xFF, 0x86, 0x52, 0x28, 0xFF, 0x88, 0x53, 0x29, 0xFF, 0x87, 0x53, + 0x2A, 0xFF, 0x88, 0x53, 0x2A, 0xFF, 0x88, 0x54, 0x2A, 0xFF, 0x88, 0x54, 0x2B, 0xFF, 0x88, 0x55, + 0x2B, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, + 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2F, 0xFF, 0x88, 0x55, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x86, 0x55, + 0x31, 0xFF, 0x85, 0x54, 0x31, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x54, 0x32, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x82, 0x53, 0x33, 0xFF, 0x83, 0x54, 0x34, 0xFF, 0x83, 0x54, 0x35, 0xFF, 0x84, 0x56, + 0x39, 0xFF, 0x89, 0x5D, 0x40, 0xFF, 0x92, 0x68, 0x4B, 0xFF, 0x9A, 0x72, 0x56, 0xFF, 0xA2, 0x7C, + 0x62, 0xFC, 0xA8, 0x83, 0x68, 0xE5, 0xAF, 0x8D, 0x71, 0xA5, 0xB5, 0x90, 0x6F, 0x54, 0x98, 0x64, + 0x37, 0x31, 0x76, 0x35, 0x00, 0x24, 0x7E, 0x3F, 0x00, 0x1C, 0x85, 0x47, 0x0B, 0x19, 0x84, 0x47, + 0x0E, 0x19, 0x84, 0x45, 0x0D, 0x18, 0x84, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0D, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x83, 0x45, + 0x0D, 0x01, 0x84, 0x48, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x49, 0x11, 0x01, 0x83, 0x46, 0x0C, 0x01, 0x83, 0x44, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x46, 0x0D, 0x03, 0x83, 0x48, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0E, 0x06, 0x86, 0x41, 0x0F, 0x08, 0x7C, 0x38, 0x04, 0x0B, 0x73, 0x33, 0x00, 0x0F, 0xA3, 0x6F, + 0x41, 0x13, 0xCA, 0xA5, 0x8A, 0x30, 0xAB, 0x84, 0x68, 0x7E, 0x99, 0x70, 0x54, 0xD5, 0x8F, 0x65, + 0x46, 0xF8, 0x83, 0x55, 0x35, 0xFF, 0x6F, 0x3D, 0x1C, 0xFF, 0x65, 0x30, 0x0F, 0xFF, 0x5F, 0x29, + 0x09, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x60, 0x28, 0x06, 0xFF, 0x60, 0x29, + 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2C, + 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x2F, 0x06, 0xFF, 0x6B, 0x31, + 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6F, 0x34, 0x08, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x71, 0x36, 0x08, 0xFF, 0x72, 0x37, 0x09, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x74, 0x39, + 0x09, 0xFF, 0x76, 0x39, 0x0A, 0xFF, 0x76, 0x3A, 0x0A, 0xFF, 0x77, 0x3A, 0x0A, 0xFF, 0x77, 0x3B, + 0x09, 0xFF, 0x78, 0x3B, 0x0A, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7A, 0x3E, 0x0C, 0xFF, 0x7B, 0x3F, + 0x0D, 0xFF, 0x7D, 0x41, 0x10, 0xFF, 0x7E, 0x43, 0x12, 0xFF, 0x80, 0x45, 0x15, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x84, 0x4C, 0x1D, 0xFF, 0x85, 0x4F, 0x20, 0xFF, 0x87, 0x51, 0x24, 0xFF, 0x88, 0x53, + 0x27, 0xFF, 0x89, 0x53, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x8A, 0x55, 0x2A, 0xFF, 0x89, 0x56, + 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x57, 0x2B, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, + 0x2D, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, + 0x2F, 0xFF, 0x8A, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x88, 0x57, + 0x30, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x86, 0x56, 0x31, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x54, 0x32, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x54, + 0x34, 0xFF, 0x85, 0x56, 0x37, 0xFF, 0x87, 0x5A, 0x3B, 0xFF, 0x8E, 0x63, 0x45, 0xFF, 0x97, 0x70, + 0x54, 0xFF, 0xA2, 0x7C, 0x60, 0xFD, 0xA8, 0x83, 0x66, 0xEF, 0xAD, 0x8B, 0x6E, 0xB1, 0xBC, 0x9B, + 0x7E, 0x51, 0xAB, 0x7F, 0x57, 0x27, 0x76, 0x35, 0x00, 0x18, 0x7D, 0x37, 0x00, 0x14, 0x85, 0x43, + 0x0D, 0x13, 0x83, 0x43, 0x0C, 0x10, 0x83, 0x46, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0D, 0x0B, 0x83, 0x45, 0x0C, 0x09, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x02, 0x81, 0x44, 0x0B, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4A, 0x12, 0x01, 0x84, 0x46, + 0x0E, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x86, 0x4A, 0x0F, 0x02, 0x85, 0x47, 0x14, 0x02, 0x69, 0x1E, + 0x00, 0x03, 0x62, 0x12, 0x00, 0x06, 0x78, 0x32, 0x0B, 0x09, 0xC0, 0x99, 0x6C, 0x0F, 0xD8, 0xB4, + 0x9C, 0x30, 0xA9, 0x83, 0x65, 0x88, 0x93, 0x6A, 0x4E, 0xDD, 0x90, 0x64, 0x44, 0xF8, 0x81, 0x52, + 0x31, 0xFE, 0x6C, 0x39, 0x17, 0xFF, 0x64, 0x2E, 0x0C, 0xFF, 0x62, 0x2A, 0x08, 0xFF, 0x5F, 0x27, + 0x05, 0xFF, 0x60, 0x28, 0x04, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x63, 0x2B, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2E, 0x05, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x6A, 0x30, + 0x06, 0xFF, 0x6C, 0x32, 0x07, 0xFF, 0x6D, 0x32, 0x06, 0xFF, 0x6E, 0x33, 0x06, 0xFF, 0x6F, 0x34, + 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, 0x07, 0xFF, 0x73, 0x37, 0x07, 0xFF, 0x74, 0x38, + 0x07, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, + 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7D, 0x40, + 0x0D, 0xFF, 0x7D, 0x41, 0x0E, 0xFF, 0x7E, 0x43, 0x11, 0xFF, 0x7F, 0x46, 0x14, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x85, 0x4D, 0x1E, 0xFF, 0x87, 0x51, 0x22, 0xFF, 0x8A, 0x55, 0x26, 0xFF, 0x8B, 0x56, + 0x28, 0xFF, 0x8C, 0x58, 0x2A, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8C, 0x58, + 0x2C, 0xFF, 0x8C, 0x58, 0x2C, 0xFF, 0x8C, 0x59, 0x2D, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2E, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, + 0x2F, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x89, 0x57, 0x31, 0xFF, 0x88, 0x57, + 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x31, 0xFF, 0x86, 0x56, 0x32, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x55, 0x33, 0xFF, 0x85, 0x56, 0x35, 0xFF, 0x87, 0x59, 0x38, 0xFF, 0x8C, 0x61, + 0x43, 0xFF, 0x97, 0x6E, 0x51, 0xFF, 0xA4, 0x7E, 0x61, 0xFF, 0xAA, 0x85, 0x66, 0xF5, 0xAD, 0x8A, + 0x6D, 0xB7, 0xC1, 0xA2, 0x85, 0x52, 0xBA, 0x98, 0x76, 0x24, 0x7D, 0x3F, 0x18, 0x11, 0x6A, 0x22, + 0x00, 0x0E, 0x73, 0x2E, 0x00, 0x0A, 0x83, 0x48, 0x0F, 0x08, 0x85, 0x47, 0x0E, 0x07, 0x83, 0x44, + 0x0C, 0x06, 0x84, 0x45, 0x0D, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3D, 0x12, 0x01, 0x58, 0x04, + 0x00, 0x02, 0x5D, 0x0E, 0x03, 0x05, 0xC3, 0xA4, 0x85, 0x0A, 0xDF, 0xC6, 0xAC, 0x2D, 0xA1, 0x7A, + 0x5D, 0x88, 0x8D, 0x66, 0x4C, 0xDF, 0x92, 0x66, 0x45, 0xFB, 0x82, 0x51, 0x2E, 0xFF, 0x68, 0x34, + 0x12, 0xFF, 0x61, 0x2B, 0x09, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x60, 0x27, 0x06, 0xFF, 0x60, 0x28, + 0x05, 0xFF, 0x62, 0x29, 0x04, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2D, + 0x06, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x69, 0x30, 0x06, 0xFF, 0x6B, 0x31, 0x06, 0xFF, 0x6B, 0x32, + 0x06, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6E, 0x34, 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, + 0x07, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3B, + 0x08, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7A, 0x3D, + 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, + 0x0C, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x80, 0x42, 0x0D, 0xFF, 0x81, 0x45, 0x10, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x87, 0x4E, + 0x1A, 0xFF, 0x89, 0x52, 0x20, 0xFF, 0x8B, 0x55, 0x25, 0xFF, 0x8D, 0x57, 0x29, 0xFF, 0x8D, 0x58, + 0x2A, 0xFF, 0x8D, 0x59, 0x2B, 0xFF, 0x8D, 0x5A, 0x2C, 0xFF, 0x8E, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, + 0x2D, 0xFF, 0x8D, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, + 0x2F, 0xFF, 0x8D, 0x59, 0x2F, 0xFF, 0x8C, 0x59, 0x30, 0xFF, 0x8C, 0x59, 0x31, 0xFF, 0x8A, 0x59, + 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x57, + 0x32, 0xFF, 0x87, 0x56, 0x32, 0xFF, 0x86, 0x56, 0x33, 0xFF, 0x86, 0x57, 0x34, 0xFF, 0x86, 0x58, + 0x37, 0xFF, 0x8A, 0x5E, 0x3F, 0xFF, 0x95, 0x6B, 0x4E, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xAB, 0x86, + 0x6A, 0xF9, 0xB2, 0x91, 0x76, 0xBA, 0xC2, 0xA6, 0x89, 0x52, 0xC5, 0xA1, 0x82, 0x1D, 0x75, 0x33, + 0x0D, 0x0B, 0x6A, 0x1B, 0x00, 0x08, 0x7E, 0x3E, 0x09, 0x05, 0x83, 0x46, 0x0C, 0x04, 0x83, 0x45, + 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x5B, + 0x40, 0x01, 0xCF, 0xB4, 0x99, 0x06, 0xD5, 0xB9, 0x9F, 0x29, 0xAB, 0x83, 0x62, 0x88, 0x93, 0x69, + 0x48, 0xE1, 0x94, 0x69, 0x45, 0xFB, 0x81, 0x50, 0x2E, 0xFE, 0x6A, 0x34, 0x11, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x61, 0x28, 0x05, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x63, 0x2A, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x31, + 0x06, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x33, 0x08, 0xFF, 0x6C, 0x34, + 0x08, 0xFF, 0x6E, 0x35, 0x08, 0xFF, 0x70, 0x36, 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x77, 0x3B, 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7A, 0x3E, + 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x41, + 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0A, 0xFF, 0x82, 0x43, 0x0A, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x44, + 0x0D, 0xFF, 0x81, 0x45, 0x0F, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x86, 0x4D, 0x1A, 0xFF, 0x88, 0x51, + 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8E, 0x59, 0x2A, 0xFF, 0x8F, 0x5B, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2D, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5B, + 0x2F, 0xFF, 0x8E, 0x5B, 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8B, 0x5A, 0x31, 0xFF, 0x8A, 0x59, 0x31, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x87, 0x57, 0x32, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x87, 0x57, + 0x34, 0xFF, 0x87, 0x58, 0x35, 0xFF, 0x8A, 0x5D, 0x3E, 0xFF, 0x96, 0x6C, 0x4C, 0xFF, 0xA3, 0x7C, + 0x5C, 0xFF, 0xA8, 0x83, 0x68, 0xF8, 0xB1, 0x90, 0x77, 0xB8, 0xBE, 0xA1, 0x88, 0x51, 0xC3, 0xA6, + 0x8A, 0x18, 0x9F, 0x6D, 0x4F, 0x04, 0x90, 0x4A, 0x1E, 0x03, 0x79, 0x39, 0x04, 0x01, 0x7C, 0x3F, + 0x08, 0x01, 0x84, 0x48, 0x0F, 0x02, 0x81, 0x45, 0x0D, 0x02, 0x83, 0x46, 0x0F, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD6, + 0xBF, 0x01, 0xDB, 0xBF, 0xA6, 0x25, 0xA8, 0x81, 0x63, 0x80, 0x96, 0x6D, 0x4E, 0xDE, 0x91, 0x65, + 0x43, 0xFC, 0x80, 0x4E, 0x2A, 0xFF, 0x69, 0x34, 0x11, 0xFF, 0x62, 0x2B, 0x07, 0xFF, 0x61, 0x29, + 0x05, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6B, 0x32, + 0x07, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x6D, 0x36, + 0x09, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x70, 0x38, 0x08, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x76, 0x3B, + 0x09, 0xFF, 0x78, 0x3C, 0x0A, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x41, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x42, + 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, + 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x83, 0x45, + 0x0D, 0xFF, 0x84, 0x44, 0x0D, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x85, 0x45, 0x0D, 0xFF, 0x85, 0x46, + 0x0F, 0xFF, 0x86, 0x48, 0x12, 0xFF, 0x89, 0x4E, 0x19, 0xFF, 0x8C, 0x54, 0x21, 0xFF, 0x8E, 0x58, + 0x27, 0xFF, 0x90, 0x5A, 0x2B, 0xFF, 0x90, 0x5C, 0x2D, 0xFF, 0x90, 0x5B, 0x2E, 0xFF, 0x90, 0x5C, + 0x2E, 0xFF, 0x90, 0x5C, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, + 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5B, 0x31, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x88, 0x58, 0x32, 0xFF, 0x88, 0x57, + 0x33, 0xFF, 0x88, 0x58, 0x33, 0xFF, 0x88, 0x59, 0x36, 0xFF, 0x8B, 0x5D, 0x3C, 0xFF, 0x96, 0x6C, + 0x4B, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xA9, 0x86, 0x6A, 0xF7, 0xB3, 0x92, 0x76, 0xAE, 0xBB, 0x9D, + 0x81, 0x49, 0xC8, 0xAA, 0x8F, 0x12, 0xC0, 0xA2, 0x86, 0x01, 0xA7, 0x74, 0x46, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x49, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC2, + 0xB3, 0x1F, 0xB1, 0x86, 0x69, 0x79, 0x99, 0x6D, 0x4A, 0xD9, 0x92, 0x65, 0x43, 0xFB, 0x7F, 0x4D, + 0x29, 0xFF, 0x6B, 0x34, 0x10, 0xFF, 0x63, 0x2B, 0x07, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x64, 0x2B, + 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, 0x07, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6A, 0x30, + 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x08, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6D, 0x34, + 0x08, 0xFF, 0x6D, 0x36, 0x09, 0xFF, 0x6D, 0x37, 0x09, 0xFF, 0x69, 0x35, 0x08, 0xFF, 0x68, 0x35, + 0x08, 0xFF, 0x6B, 0x38, 0x09, 0xFF, 0x6C, 0x37, 0x07, 0xFF, 0x6F, 0x39, 0x08, 0xFF, 0x74, 0x3B, + 0x0A, 0xFF, 0x77, 0x3D, 0x0B, 0xFF, 0x7B, 0x3E, 0x0B, 0xFF, 0x7E, 0x40, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0D, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0D, 0xFF, 0x84, 0x46, 0x0D, 0xFF, 0x84, 0x47, 0x10, 0xFF, 0x86, 0x4B, + 0x16, 0xFF, 0x8A, 0x52, 0x1F, 0xFF, 0x8E, 0x57, 0x25, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, + 0x2E, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8E, 0x5B, + 0x31, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x57, 0x32, 0xFF, 0x89, 0x58, 0x33, 0xFF, 0x89, 0x59, 0x35, 0xFF, 0x8C, 0x5D, + 0x3C, 0xFF, 0x97, 0x6C, 0x4C, 0xFF, 0xA5, 0x7F, 0x62, 0xFF, 0xAB, 0x87, 0x69, 0xF2, 0xB7, 0x96, + 0x7A, 0xA7, 0xC2, 0xA4, 0x8A, 0x46, 0xCA, 0xAF, 0x95, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC7, 0xB8, 0x1B, 0xAD, 0x89, + 0x6B, 0x6E, 0x9A, 0x70, 0x4C, 0xD2, 0x93, 0x67, 0x45, 0xFA, 0x7F, 0x4E, 0x2B, 0xFF, 0x6C, 0x35, + 0x12, 0xFF, 0x64, 0x2C, 0x08, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, + 0x06, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x33, + 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6D, 0x34, 0x07, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x6C, 0x35, 0x08, 0xFF, 0x6A, 0x36, 0x09, 0xFF, 0x69, 0x39, 0x0D, 0xFF, 0x6A, 0x3D, + 0x12, 0xFF, 0x64, 0x36, 0x0C, 0xFF, 0x63, 0x35, 0x09, 0xFF, 0x6A, 0x3A, 0x09, 0xFF, 0x6F, 0x3B, + 0x09, 0xFF, 0x75, 0x3D, 0x0B, 0xFF, 0x7B, 0x3F, 0x0C, 0xFF, 0x7E, 0x41, 0x0C, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x47, 0x0D, 0xFF, 0x86, 0x46, + 0x0D, 0xFF, 0x86, 0x47, 0x0E, 0xFF, 0x87, 0x4A, 0x12, 0xFF, 0x8B, 0x4F, 0x18, 0xFF, 0x8F, 0x56, + 0x21, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x92, 0x5D, 0x2D, 0xFF, 0x93, 0x5D, 0x2F, 0xFF, 0x92, 0x5E, + 0x2F, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x90, 0x5D, + 0x31, 0xFF, 0x8F, 0x5D, 0x31, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8A, 0x58, 0x33, 0xFF, 0x8A, 0x5A, + 0x37, 0xFF, 0x8F, 0x60, 0x3F, 0xFF, 0x98, 0x6D, 0x4E, 0xFE, 0xA7, 0x80, 0x63, 0xFF, 0xAF, 0x8B, + 0x6E, 0xEC, 0xB7, 0x96, 0x7A, 0x98, 0xC7, 0xA9, 0x92, 0x37, 0xD0, 0xBA, 0xA4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xAB, 0x96, 0x0D, 0xB3, 0x93, 0x74, 0x61, 0xA7, 0x82, + 0x61, 0xCB, 0x95, 0x69, 0x46, 0xF8, 0x83, 0x51, 0x2C, 0xFE, 0x6F, 0x38, 0x14, 0xFF, 0x67, 0x2F, + 0x0A, 0xFF, 0x64, 0x2A, 0x05, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2C, 0x06, 0xFF, 0x69, 0x2E, + 0x07, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6F, 0x34, 0x07, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x37, 0x10, 0xFF, 0x76, 0x4F, 0x29, 0xFF, 0xA1, 0x86, + 0x6D, 0xFF, 0x98, 0x7C, 0x64, 0xFF, 0x71, 0x48, 0x23, 0xFF, 0x66, 0x3C, 0x0E, 0xFF, 0x65, 0x38, + 0x07, 0xFF, 0x6D, 0x3B, 0x0A, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x7C, 0x41, 0x0B, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x87, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x4A, + 0x10, 0xFF, 0x89, 0x4E, 0x16, 0xFF, 0x8C, 0x54, 0x1F, 0xFF, 0x91, 0x5B, 0x29, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x94, 0x5F, 0x2F, 0xFF, 0x93, 0x5F, 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x92, 0x5E, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5C, + 0x32, 0xFF, 0x8E, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8C, 0x59, 0x32, 0xFF, 0x8B, 0x59, + 0x33, 0xFF, 0x8C, 0x5B, 0x37, 0xFF, 0x90, 0x61, 0x3F, 0xFF, 0x99, 0x6E, 0x4D, 0xFF, 0xAB, 0x84, + 0x66, 0xFF, 0xB0, 0x8D, 0x6F, 0xE5, 0xB8, 0x97, 0x7C, 0x8D, 0xD4, 0xB9, 0xA4, 0x2C, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xE3, 0xD7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x07, 0xC0, 0xA1, 0x85, 0x47, 0xAF, 0x8A, 0x69, 0xB5, 0x9B, 0x71, + 0x4C, 0xF2, 0x85, 0x54, 0x2F, 0xFF, 0x72, 0x3C, 0x16, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6A, 0x2E, 0x07, 0xFF, 0x6B, 0x30, + 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x71, 0x36, + 0x08, 0xFF, 0x70, 0x37, 0x08, 0xFF, 0x6E, 0x37, 0x07, 0xFF, 0x69, 0x35, 0x07, 0xFF, 0x62, 0x33, + 0x07, 0xFF, 0x63, 0x3A, 0x12, 0xFF, 0x7A, 0x5D, 0x36, 0xFF, 0xB2, 0xA1, 0x8C, 0xFF, 0xE6, 0xDB, + 0xD5, 0xFF, 0xE0, 0xD6, 0xCE, 0xFF, 0xAD, 0x9C, 0x8B, 0xFF, 0x81, 0x60, 0x3D, 0xFF, 0x67, 0x3F, + 0x15, 0xFF, 0x65, 0x3A, 0x0B, 0xFF, 0x70, 0x3E, 0x09, 0xFF, 0x76, 0x3F, 0x09, 0xFF, 0x7C, 0x42, + 0x0A, 0xFF, 0x81, 0x44, 0x0B, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x89, 0x4A, 0x0F, 0xFF, 0x8B, 0x4E, 0x14, 0xFF, 0x8F, 0x55, + 0x1F, 0xFF, 0x93, 0x5C, 0x29, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x31, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8D, 0x5A, + 0x32, 0xFF, 0x8C, 0x5A, 0x33, 0xFF, 0x8E, 0x5E, 0x39, 0xFF, 0x91, 0x63, 0x40, 0xFF, 0x9A, 0x71, + 0x50, 0xFF, 0xAD, 0x86, 0x67, 0xFF, 0xB4, 0x90, 0x72, 0xDB, 0xBE, 0x9E, 0x85, 0x78, 0xD9, 0xC4, + 0xB6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCA, 0xAE, 0x92, 0x33, 0xB9, 0x97, 0x79, 0x9D, 0x9D, 0x73, 0x4F, 0xE9, 0x8B, 0x5A, + 0x35, 0xFD, 0x77, 0x41, 0x1A, 0xFF, 0x6C, 0x33, 0x0D, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x68, 0x2D, + 0x07, 0xFF, 0x69, 0x2D, 0x07, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6C, 0x31, 0x07, 0xFF, 0x6F, 0x33, + 0x08, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x70, 0x38, + 0x07, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6A, 0x35, 0x07, 0xFF, 0x65, 0x36, 0x0A, 0xFF, 0x6E, 0x48, + 0x22, 0xFF, 0x98, 0x7F, 0x68, 0xFF, 0xB4, 0xA6, 0x98, 0xFF, 0xA1, 0x96, 0x86, 0xFF, 0xC7, 0xC0, + 0xB5, 0xFF, 0xEF, 0xEB, 0xE8, 0xFF, 0xED, 0xE6, 0xE2, 0xFF, 0xBF, 0xB1, 0xA5, 0xFF, 0x90, 0x6F, + 0x54, 0xFF, 0x6D, 0x48, 0x20, 0xFF, 0x67, 0x3D, 0x0E, 0xFF, 0x6D, 0x3E, 0x0C, 0xFF, 0x75, 0x41, + 0x0B, 0xFF, 0x7C, 0x43, 0x0B, 0xFF, 0x82, 0x46, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x88, 0x4A, + 0x10, 0xFF, 0x8A, 0x4E, 0x16, 0xFF, 0x8E, 0x56, 0x1F, 0xFF, 0x93, 0x5D, 0x2A, 0xFF, 0x96, 0x5F, + 0x2E, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5B, + 0x32, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8E, 0x5C, 0x34, 0xFF, 0x8F, 0x5F, 0x3A, 0xFF, 0x93, 0x65, + 0x43, 0xFF, 0x9E, 0x75, 0x53, 0xFF, 0xAF, 0x89, 0x69, 0xFE, 0xB9, 0x97, 0x7A, 0xCA, 0xC2, 0xA7, + 0x90, 0x62, 0xCE, 0xB6, 0xA1, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAE, + 0x97, 0x1C, 0xC1, 0xA0, 0x83, 0x7E, 0xA0, 0x78, 0x57, 0xDC, 0x8E, 0x5F, 0x3A, 0xFC, 0x79, 0x44, + 0x1D, 0xFF, 0x6D, 0x34, 0x0F, 0xFF, 0x69, 0x2F, 0x08, 0xFF, 0x68, 0x2D, 0x08, 0xFF, 0x6A, 0x2E, + 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, + 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x71, 0x39, 0x08, 0xFF, 0x6F, 0x39, + 0x07, 0xFF, 0x68, 0x37, 0x07, 0xFF, 0x62, 0x38, 0x09, 0xFF, 0x72, 0x52, 0x2C, 0xFF, 0xAC, 0x9C, + 0x8B, 0xFF, 0xD9, 0xD5, 0xD1, 0xFF, 0xDC, 0xDC, 0xD9, 0xFF, 0xC6, 0xBD, 0xB6, 0xFF, 0x96, 0x8E, + 0x7F, 0xFF, 0xA6, 0xA0, 0x94, 0xFF, 0xD7, 0xD5, 0xCD, 0xFF, 0xEC, 0xEA, 0xE2, 0xFF, 0xD2, 0xC8, + 0xBD, 0xFF, 0x9C, 0x85, 0x6E, 0xFF, 0x71, 0x4F, 0x2B, 0xFF, 0x68, 0x40, 0x14, 0xFF, 0x6F, 0x3F, + 0x10, 0xFF, 0x74, 0x3F, 0x0B, 0xFF, 0x7B, 0x44, 0x0C, 0xFF, 0x81, 0x46, 0x0D, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8A, 0x4A, + 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8B, 0x4C, 0x10, 0xFF, 0x8D, 0x51, 0x16, 0xFF, 0x91, 0x59, + 0x22, 0xFF, 0x95, 0x5E, 0x2A, 0xFF, 0x95, 0x60, 0x2E, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x32, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8F, 0x5D, 0x35, 0xFF, 0x92, 0x61, + 0x3C, 0xFF, 0x95, 0x68, 0x44, 0xFF, 0xA2, 0x7A, 0x59, 0xFF, 0xB0, 0x8B, 0x6D, 0xF2, 0xBA, 0x99, + 0x7F, 0xB2, 0xC6, 0xAA, 0x91, 0x42, 0xCD, 0xB4, 0x9D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC5, 0xB0, 0x0E, 0xC0, 0xA1, + 0x87, 0x57, 0xA5, 0x7E, 0x5C, 0xC6, 0x95, 0x68, 0x44, 0xF9, 0x80, 0x4C, 0x25, 0xFF, 0x72, 0x38, + 0x11, 0xFF, 0x6C, 0x30, 0x09, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x74, 0x38, + 0x08, 0xFF, 0x73, 0x39, 0x08, 0xFF, 0x72, 0x3A, 0x08, 0xFF, 0x70, 0x3A, 0x08, 0xFF, 0x68, 0x37, + 0x07, 0xFF, 0x64, 0x39, 0x0D, 0xFF, 0x75, 0x55, 0x30, 0xFF, 0xB0, 0x9F, 0x91, 0xFF, 0xDF, 0xDB, + 0xDA, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xD3, 0xCB, + 0xC3, 0xFF, 0x90, 0x86, 0x74, 0xFF, 0x9D, 0x92, 0x83, 0xFF, 0xCD, 0xC9, 0xBD, 0xFF, 0xE5, 0xE1, + 0xD9, 0xFF, 0xDF, 0xD9, 0xD1, 0xFF, 0xB4, 0xA1, 0x90, 0xFF, 0x7F, 0x60, 0x3C, 0xFF, 0x71, 0x49, + 0x1C, 0xFF, 0x70, 0x42, 0x12, 0xFF, 0x72, 0x40, 0x0C, 0xFF, 0x79, 0x44, 0x0E, 0xFF, 0x80, 0x47, + 0x0D, 0xFF, 0x85, 0x49, 0x0E, 0xFF, 0x88, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4C, + 0x11, 0xFF, 0x8C, 0x52, 0x1A, 0xFF, 0x91, 0x59, 0x24, 0xFF, 0x96, 0x5F, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x32, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x90, 0x5E, + 0x36, 0xFF, 0x93, 0x63, 0x3B, 0xFF, 0x99, 0x6E, 0x4A, 0xFF, 0xA7, 0x7E, 0x5C, 0xFF, 0xB3, 0x8F, + 0x71, 0xE7, 0xC2, 0xA2, 0x88, 0x8E, 0xCC, 0xB3, 0x9B, 0x28, 0xCE, 0xB5, 0x9E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xB8, 0xA3, 0x3A, 0xAE, 0x8C, + 0x6D, 0x9C, 0x9B, 0x6F, 0x4A, 0xF3, 0x88, 0x57, 0x30, 0xFF, 0x76, 0x3E, 0x17, 0xFF, 0x6D, 0x32, + 0x0B, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x08, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x75, 0x3B, 0x08, 0xFF, 0x71, 0x3B, 0x07, 0xFF, 0x6A, 0x38, 0x06, 0xFF, 0x68, 0x3B, + 0x0A, 0xFF, 0x75, 0x54, 0x2F, 0xFF, 0xAC, 0x9D, 0x8D, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xE3, 0xE2, + 0xE1, 0xFF, 0xE3, 0xE1, 0xE0, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xE3, 0xE5, + 0xE3, 0xFF, 0xCE, 0xC9, 0xBF, 0xFF, 0x97, 0x8A, 0x77, 0xFF, 0x90, 0x83, 0x6F, 0xFF, 0xC1, 0xB9, + 0xAA, 0xFF, 0xE0, 0xDB, 0xD4, 0xFF, 0xDE, 0xD9, 0xD3, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0x8E, 0x72, + 0x52, 0xFF, 0x75, 0x4D, 0x21, 0xFF, 0x71, 0x44, 0x14, 0xFF, 0x72, 0x41, 0x0E, 0xFF, 0x78, 0x44, + 0x0C, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4D, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0E, 0xFF, 0x8C, 0x4B, 0x0F, 0xFF, 0x8D, 0x4F, 0x13, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x95, 0x5D, + 0x27, 0xFF, 0x97, 0x60, 0x2D, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, + 0x32, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, + 0x32, 0xFF, 0x92, 0x5F, 0x36, 0xFF, 0x95, 0x66, 0x3F, 0xFF, 0xA0, 0x75, 0x50, 0xFF, 0xAC, 0x85, + 0x64, 0xFE, 0xBA, 0x96, 0x78, 0xD1, 0xCA, 0xAC, 0x93, 0x63, 0xCF, 0xB6, 0xA0, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8B, 0x16, 0xBE, 0x9E, 0x81, 0x7A, 0xA6, 0x7D, + 0x5C, 0xDB, 0x91, 0x61, 0x39, 0xFF, 0x7E, 0x47, 0x1F, 0xFF, 0x71, 0x35, 0x0E, 0xFF, 0x6D, 0x31, + 0x09, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, + 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x75, 0x3B, + 0x08, 0xFF, 0x74, 0x3B, 0x09, 0xFF, 0x6C, 0x39, 0x08, 0xFF, 0x6A, 0x3C, 0x0E, 0xFF, 0x73, 0x51, + 0x2B, 0xFF, 0xAC, 0x9B, 0x8A, 0xFF, 0xE1, 0xDD, 0xDA, 0xFF, 0xE6, 0xE5, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE3, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE5, + 0xE7, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xA0, 0x97, 0x87, 0xFF, 0x84, 0x77, + 0x62, 0xFF, 0xA4, 0x9A, 0x88, 0xFF, 0xD5, 0xD0, 0xC6, 0xFF, 0xDF, 0xDC, 0xD8, 0xFF, 0xD1, 0xCB, + 0xC1, 0xFF, 0xA0, 0x89, 0x70, 0xFF, 0x7C, 0x56, 0x2B, 0xFF, 0x70, 0x45, 0x14, 0xFF, 0x70, 0x42, + 0x0C, 0xFF, 0x77, 0x45, 0x0E, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x88, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x10, 0xFF, 0x8D, 0x51, + 0x16, 0xFF, 0x92, 0x58, 0x22, 0xFF, 0x96, 0x60, 0x2B, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, + 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x94, 0x5F, 0x32, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x33, 0xFF, 0x93, 0x62, 0x37, 0xFF, 0x9A, 0x6B, 0x44, 0xFF, 0xA6, 0x7C, + 0x59, 0xFF, 0xB2, 0x8B, 0x6B, 0xF8, 0xBC, 0x99, 0x7D, 0xAE, 0xCB, 0xAE, 0x96, 0x3B, 0xE3, 0xD2, + 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC2, 0xA3, 0x85, 0x05, 0xBA, 0x99, 0x7D, 0x47, 0xAC, 0x86, 0x65, 0xBD, 0x96, 0x69, + 0x45, 0xF9, 0x86, 0x52, 0x2A, 0xFF, 0x75, 0x3C, 0x14, 0xFF, 0x6D, 0x32, 0x0A, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x31, 0x07, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, + 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3B, 0x08, 0xFF, 0x75, 0x3C, + 0x08, 0xFF, 0x6F, 0x3A, 0x08, 0xFF, 0x6B, 0x3B, 0x0A, 0xFF, 0x72, 0x4F, 0x27, 0xFF, 0xA8, 0x96, + 0x83, 0xFF, 0xE4, 0xE0, 0xDA, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xDC, 0xDB, 0xD5, 0xFF, 0xAA, 0xA1, + 0x92, 0xFF, 0x85, 0x76, 0x60, 0xFF, 0x95, 0x88, 0x72, 0xFF, 0xC2, 0xBC, 0xB0, 0xFF, 0xE1, 0xDE, + 0xD9, 0xFF, 0xDC, 0xD8, 0xD1, 0xFF, 0xAF, 0x9D, 0x8B, 0xFF, 0x83, 0x62, 0x3C, 0xFF, 0x73, 0x4A, + 0x1D, 0xFF, 0x6F, 0x43, 0x11, 0xFF, 0x77, 0x45, 0x0D, 0xFF, 0x7E, 0x46, 0x0D, 0xFF, 0x83, 0x49, + 0x0D, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8E, 0x4E, 0x12, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x97, 0x5E, 0x27, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x93, 0x60, 0x34, 0xFF, 0x95, 0x64, 0x3A, 0xFF, 0x9E, 0x72, + 0x4D, 0xFF, 0xAC, 0x83, 0x61, 0xFF, 0xB6, 0x90, 0x72, 0xE8, 0xC6, 0xA4, 0x8B, 0x7C, 0xE0, 0xCE, + 0xBD, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCE, 0xB3, 0x99, 0x22, 0xB8, 0x94, 0x76, 0x8D, 0x9F, 0x74, 0x4F, 0xE7, 0x8D, 0x5B, + 0x34, 0xFF, 0x7C, 0x44, 0x1A, 0xFF, 0x71, 0x36, 0x0D, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x70, 0x33, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3C, 0x09, 0xFF, 0x78, 0x3D, 0x09, 0xFF, 0x76, 0x3D, 0x09, 0xFF, 0x72, 0x3B, + 0x07, 0xFF, 0x6D, 0x3D, 0x0D, 0xFF, 0x6F, 0x48, 0x22, 0xFF, 0xA3, 0x90, 0x7B, 0xFF, 0xE1, 0xDD, + 0xD8, 0xFF, 0xE8, 0xE9, 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE3, 0xE2, + 0xDF, 0xFF, 0xB3, 0xAB, 0xA0, 0xFF, 0x81, 0x75, 0x5C, 0xFF, 0x85, 0x78, 0x5F, 0xFF, 0xAF, 0xA7, + 0x99, 0xFF, 0xDE, 0xDB, 0xD7, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xC6, 0xBA, 0xAC, 0xFF, 0x8E, 0x71, + 0x51, 0xFF, 0x73, 0x4E, 0x21, 0xFF, 0x70, 0x46, 0x12, 0xFF, 0x75, 0x47, 0x10, 0xFF, 0x7B, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x87, 0x4B, 0x0D, 0xFF, 0x8B, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x10, 0xFF, 0x8E, 0x51, 0x16, 0xFF, 0x93, 0x5B, + 0x22, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x97, 0x62, 0x2F, 0xFF, 0x96, 0x62, 0x30, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x60, 0x32, 0xFF, 0x94, 0x61, 0x35, 0xFF, 0x98, 0x68, + 0x3F, 0xFF, 0xA3, 0x78, 0x52, 0xFF, 0xB3, 0x8D, 0x6B, 0xFB, 0xBF, 0x9B, 0x7E, 0xC2, 0xCA, 0xB0, + 0x97, 0x4F, 0xD0, 0xBA, 0xA3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, + 0x97, 0x07, 0xCA, 0xAD, 0x94, 0x5C, 0xAE, 0x88, 0x68, 0xC6, 0x96, 0x67, 0x40, 0xFD, 0x82, 0x4D, + 0x24, 0xFF, 0x75, 0x3A, 0x11, 0xFF, 0x70, 0x34, 0x0A, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x71, 0x34, + 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x78, 0x3A, 0x09, 0xFF, 0x7A, 0x3D, + 0x0A, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x78, 0x3F, 0x09, 0xFF, 0x76, 0x3E, 0x09, 0xFF, 0x71, 0x3C, + 0x09, 0xFF, 0x6D, 0x46, 0x19, 0xFF, 0x96, 0x7F, 0x65, 0xFF, 0xDD, 0xD9, 0xD1, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xE8, 0xE8, 0xFF, 0xEB, 0xE9, + 0xEA, 0xFF, 0xE5, 0xE5, 0xE3, 0xFF, 0xBB, 0xB7, 0xAA, 0xFF, 0x85, 0x79, 0x60, 0xFF, 0x84, 0x72, + 0x58, 0xFF, 0x99, 0x8C, 0x7B, 0xFF, 0xCF, 0xC8, 0xC2, 0xFF, 0xE4, 0xE0, 0xDC, 0xFF, 0xD2, 0xC9, + 0xC0, 0xFF, 0x99, 0x85, 0x6D, 0xFF, 0x74, 0x52, 0x2B, 0xFF, 0x6F, 0x47, 0x16, 0xFF, 0x75, 0x45, + 0x10, 0xFF, 0x79, 0x44, 0x0C, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x86, 0x4A, 0x0E, 0xFF, 0x8A, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x90, 0x51, + 0x13, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x96, 0x5F, 0x29, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x95, 0x61, 0x33, 0xFF, 0x97, 0x65, + 0x39, 0xFF, 0x9C, 0x6E, 0x44, 0xFF, 0xA9, 0x81, 0x5D, 0xFF, 0xB8, 0x93, 0x72, 0xE8, 0xC0, 0x9E, + 0x82, 0x8D, 0xCA, 0xB1, 0x96, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA8, + 0x8B, 0x22, 0xBA, 0x98, 0x7A, 0x9A, 0xA3, 0x78, 0x55, 0xEC, 0x8E, 0x5A, 0x30, 0xFF, 0x7C, 0x42, + 0x18, 0xFF, 0x74, 0x37, 0x0C, 0xFF, 0x72, 0x35, 0x09, 0xFF, 0x72, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x77, 0x39, 0x08, 0xFF, 0x79, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x7B, 0x42, 0x0B, 0xFF, 0x75, 0x40, 0x0C, 0xFF, 0x6F, 0x43, + 0x16, 0xFF, 0x8D, 0x74, 0x57, 0xFF, 0xD4, 0xCD, 0xC2, 0xFF, 0xE5, 0xE5, 0xE1, 0xFF, 0xE3, 0xE4, + 0xE3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xC4, 0xC1, 0xBA, 0xFF, 0x90, 0x83, + 0x72, 0xFF, 0x7F, 0x6C, 0x52, 0xFF, 0x87, 0x78, 0x61, 0xFF, 0xBC, 0xB5, 0xA6, 0xFF, 0xE1, 0xDC, + 0xD6, 0xFF, 0xDE, 0xD9, 0xD2, 0xFF, 0xB0, 0xA0, 0x8E, 0xFF, 0x81, 0x64, 0x3F, 0xFF, 0x74, 0x4E, + 0x1C, 0xFF, 0x74, 0x47, 0x11, 0xFF, 0x76, 0x45, 0x0D, 0xFF, 0x7D, 0x47, 0x0E, 0xFF, 0x84, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4E, 0x0F, 0xFF, 0x8E, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x51, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4F, 0x12, 0xFF, 0x91, 0x55, 0x1B, 0xFF, 0x95, 0x5D, 0x27, 0xFF, 0x98, 0x61, + 0x2D, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x96, 0x62, + 0x34, 0xFF, 0x99, 0x67, 0x3B, 0xFF, 0xA2, 0x77, 0x4F, 0xFF, 0xB3, 0x8B, 0x67, 0xFD, 0xBE, 0x9B, + 0x7A, 0xC5, 0xCA, 0xAC, 0x93, 0x54, 0xD9, 0xC6, 0xB1, 0x07, 0xE0, 0xCE, 0xBD, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, 0x84, 0x06, 0xB7, 0x96, + 0x78, 0x55, 0xAF, 0x87, 0x65, 0xCC, 0x98, 0x69, 0x41, 0xFD, 0x87, 0x4E, 0x22, 0xFF, 0x78, 0x3C, + 0x11, 0xFF, 0x73, 0x36, 0x0A, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7D, 0x41, + 0x0A, 0xFF, 0x7D, 0x42, 0x0A, 0xFF, 0x7B, 0x44, 0x0D, 0xFF, 0x73, 0x42, 0x0F, 0xFF, 0x88, 0x65, + 0x41, 0xFF, 0xCE, 0xC4, 0xB3, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE6, 0xE4, 0xE4, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xE8, 0xEA, 0xE9, 0xFF, 0xCA, 0xC9, + 0xC3, 0xFF, 0x97, 0x8D, 0x7D, 0xFF, 0x82, 0x6F, 0x56, 0xFF, 0x7C, 0x6B, 0x51, 0xFF, 0xAE, 0xA3, + 0x91, 0xFF, 0xDE, 0xD9, 0xD4, 0xFF, 0xDD, 0xD8, 0xD5, 0xFF, 0xBB, 0xB0, 0xA5, 0xFF, 0x8C, 0x72, + 0x51, 0xFF, 0x78, 0x53, 0x23, 0xFF, 0x74, 0x48, 0x14, 0xFF, 0x75, 0x45, 0x0F, 0xFF, 0x7C, 0x47, + 0x0D, 0xFF, 0x84, 0x4A, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x8F, 0x51, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x10, 0xFF, 0x91, 0x53, 0x18, 0xFF, 0x95, 0x5B, + 0x24, 0xFF, 0x98, 0x60, 0x2B, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x97, 0x62, 0x31, 0xFF, 0x96, 0x62, + 0x32, 0xFF, 0x99, 0x65, 0x37, 0xFF, 0x9F, 0x6E, 0x44, 0xFF, 0xAC, 0x82, 0x5C, 0xFF, 0xB9, 0x94, + 0x72, 0xEC, 0xCB, 0xA9, 0x8E, 0x8C, 0xDC, 0xC5, 0xB2, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB1, 0x9A, 0x20, 0xB5, 0x92, + 0x72, 0x94, 0xA6, 0x78, 0x50, 0xEA, 0x92, 0x5C, 0x34, 0xFF, 0x7F, 0x44, 0x17, 0xFF, 0x76, 0x38, + 0x0C, 0xFF, 0x74, 0x36, 0x09, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x77, 0x38, 0x09, 0xFF, 0x79, 0x3B, + 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x7F, 0x43, + 0x0A, 0xFF, 0x7F, 0x44, 0x0D, 0xFF, 0x78, 0x41, 0x0E, 0xFF, 0x83, 0x59, 0x2D, 0xFF, 0xC3, 0xB5, + 0xA2, 0xFF, 0xE3, 0xE2, 0xDD, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xD3, 0xD1, 0xCE, 0xFF, 0xA1, 0x96, 0x87, 0xFF, 0x7F, 0x6B, 0x51, 0xFF, 0x73, 0x61, + 0x44, 0xFF, 0x93, 0x87, 0x73, 0xFF, 0xD0, 0xC9, 0xC3, 0xFF, 0xDF, 0xDB, 0xD9, 0xFF, 0xC9, 0xC1, + 0xBA, 0xFF, 0xA0, 0x8A, 0x72, 0xFF, 0x7F, 0x5D, 0x2F, 0xFF, 0x72, 0x4A, 0x16, 0xFF, 0x72, 0x45, + 0x0E, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x83, 0x4B, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8E, 0x50, + 0x0F, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x10, 0xFF, 0x90, 0x52, + 0x16, 0xFF, 0x94, 0x59, 0x20, 0xFF, 0x98, 0x60, 0x2A, 0xFF, 0x9A, 0x63, 0x2F, 0xFF, 0x97, 0x62, + 0x31, 0xFF, 0x99, 0x64, 0x35, 0xFF, 0x9D, 0x69, 0x3D, 0xFF, 0xA4, 0x78, 0x50, 0xFF, 0xB3, 0x8C, + 0x68, 0xFC, 0xC5, 0xA1, 0x83, 0xC2, 0xD8, 0xBD, 0xA5, 0x4F, 0xDD, 0xC6, 0xAD, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC5, 0xAE, 0x05, 0xD6, 0xBE, 0xA7, 0x4E, 0xB2, 0x8E, + 0x6D, 0xC0, 0x9B, 0x69, 0x3E, 0xFB, 0x87, 0x4F, 0x25, 0xFF, 0x79, 0x3C, 0x10, 0xFF, 0x75, 0x37, + 0x0B, 0xFF, 0x76, 0x37, 0x08, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x83, 0x55, 0x25, 0xFF, 0xBF, 0xA8, 0x8D, 0xFF, 0xDF, 0xDD, + 0xD6, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xDB, 0xDD, 0xD9, 0xFF, 0xA6, 0xA0, 0x91, 0xFF, 0x7F, 0x6B, + 0x52, 0xFF, 0x71, 0x5D, 0x41, 0xFF, 0x8B, 0x7D, 0x67, 0xFF, 0xC2, 0xBA, 0xB1, 0xFF, 0xDE, 0xDA, + 0xD8, 0xFF, 0xD3, 0xCE, 0xCA, 0xFF, 0xAA, 0x98, 0x87, 0xFF, 0x85, 0x66, 0x3F, 0xFF, 0x76, 0x4F, + 0x20, 0xFF, 0x71, 0x46, 0x12, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x81, 0x4A, 0x0E, 0xFF, 0x87, 0x4E, + 0x0F, 0xFF, 0x8D, 0x50, 0x0F, 0xFF, 0x8F, 0x51, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x94, 0x53, + 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x8F, 0x4F, + 0x0F, 0xFF, 0x91, 0x52, 0x14, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x99, 0x64, 0x32, 0xFF, 0x9D, 0x68, 0x3A, 0xFF, 0x9F, 0x6F, 0x45, 0xFF, 0xAD, 0x83, + 0x5D, 0xFF, 0xBB, 0x97, 0x75, 0xE7, 0xC8, 0xA7, 0x8D, 0x83, 0xC5, 0xAA, 0x8C, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB7, 0x9C, 0x18, 0xCB, 0xAC, 0x90, 0x7E, 0xA9, 0x80, + 0x5C, 0xE1, 0x93, 0x5E, 0x31, 0xFF, 0x81, 0x45, 0x19, 0xFF, 0x79, 0x3A, 0x0D, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x08, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7F, 0x40, + 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8A, 0x4B, + 0x11, 0xFF, 0x82, 0x47, 0x09, 0xFF, 0x92, 0x68, 0x35, 0xFF, 0xD4, 0xC3, 0xB9, 0xFF, 0xE8, 0xE6, + 0xE2, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, + 0xEA, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEF, 0xEF, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xE2, 0xE6, 0xE3, 0xFF, 0xB5, 0xAF, + 0xA6, 0xFF, 0x82, 0x70, 0x59, 0xFF, 0x6E, 0x5D, 0x40, 0xFF, 0x79, 0x6A, 0x50, 0xFF, 0xB1, 0xA7, + 0x96, 0xFF, 0xDD, 0xDA, 0xD7, 0xFF, 0xDB, 0xD8, 0xD5, 0xFF, 0xBC, 0xB0, 0xA3, 0xFF, 0x90, 0x75, + 0x54, 0xFF, 0x76, 0x53, 0x25, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x77, 0x4A, 0x13, 0xFF, 0x7F, 0x4B, + 0x10, 0xFF, 0x86, 0x4D, 0x0F, 0xFF, 0x8C, 0x50, 0x10, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x52, 0x13, 0xFF, 0x92, 0x57, 0x1B, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x9A, 0x63, 0x2E, 0xFF, 0x9C, 0x66, 0x34, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xAA, 0x7E, + 0x56, 0xFF, 0xB9, 0x91, 0x6B, 0xFC, 0xBC, 0x95, 0x76, 0xB8, 0xCC, 0xB0, 0x91, 0x3D, 0xF9, 0xFF, + 0xFB, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xB1, 0x97, 0x02, 0xC0, 0xA3, 0x86, 0x35, 0xBA, 0x93, 0x70, 0xAF, 0xA0, 0x71, + 0x49, 0xF5, 0x90, 0x56, 0x28, 0xFF, 0x80, 0x42, 0x15, 0xFF, 0x79, 0x3A, 0x0C, 0xFF, 0x78, 0x39, + 0x08, 0xFF, 0x79, 0x3A, 0x08, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7E, 0x40, 0x09, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x8B, 0x4C, + 0x0F, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x84, 0x4F, 0x10, 0xFF, 0xAA, 0x8F, 0x6E, 0xFF, 0xE1, 0xDF, + 0xDA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xF0, 0xF0, 0xFF, 0xEE, 0xF1, 0xF1, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xC3, 0xC1, 0xBA, 0xFF, 0x85, 0x75, 0x5F, 0xFF, 0x71, 0x5F, 0x3F, 0xFF, 0x7C, 0x6C, + 0x49, 0xFF, 0x9E, 0x92, 0x7D, 0xFF, 0xD2, 0xCD, 0xC9, 0xFF, 0xDF, 0xDC, 0xDB, 0xFF, 0xCB, 0xC2, + 0xBB, 0xFF, 0x9C, 0x88, 0x70, 0xFF, 0x7A, 0x59, 0x31, 0xFF, 0x73, 0x4C, 0x19, 0xFF, 0x78, 0x49, + 0x13, 0xFF, 0x7D, 0x49, 0x10, 0xFF, 0x85, 0x4E, 0x11, 0xFF, 0x8C, 0x50, 0x11, 0xFF, 0x91, 0x53, + 0x11, 0xFF, 0x95, 0x55, 0x12, 0xFF, 0x96, 0x56, 0x12, 0xFF, 0x96, 0x55, 0x12, 0xFF, 0x96, 0x55, + 0x12, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x91, 0x53, 0x12, 0xFF, 0x93, 0x58, + 0x1C, 0xFF, 0x98, 0x5F, 0x26, 0xFF, 0x9B, 0x64, 0x2E, 0xFF, 0x9C, 0x68, 0x36, 0xFF, 0xA4, 0x76, + 0x4B, 0xFF, 0xB2, 0x89, 0x61, 0xFF, 0xB6, 0x8C, 0x6A, 0xDE, 0xE2, 0xC7, 0xAD, 0x69, 0xFE, 0xFF, + 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xE8, 0xDB, 0x0A, 0xC3, 0xA1, 0x84, 0x62, 0xB0, 0x81, 0x58, 0xD8, 0x9A, 0x66, + 0x3D, 0xFD, 0x8B, 0x4F, 0x20, 0xFF, 0x7D, 0x3E, 0x0F, 0xFF, 0x7A, 0x3A, 0x0A, 0xFF, 0x7B, 0x3B, + 0x09, 0xFF, 0x7C, 0x3D, 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, + 0x0E, 0xFF, 0x8A, 0x4D, 0x0F, 0xFF, 0x8A, 0x51, 0x13, 0xFF, 0x8A, 0x5B, 0x20, 0xFF, 0xB6, 0x9F, + 0x84, 0xFF, 0xE8, 0xE4, 0xE0, 0xFF, 0xEE, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF1, 0xF0, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xEF, 0xF1, + 0xF2, 0xFF, 0xED, 0xEF, 0xF0, 0xFF, 0xCE, 0xCD, 0xC9, 0xFF, 0x8E, 0x81, 0x6F, 0xFF, 0x75, 0x64, + 0x44, 0xFF, 0x77, 0x65, 0x42, 0xFF, 0x8F, 0x80, 0x67, 0xFF, 0xC9, 0xC5, 0xBB, 0xFF, 0xE2, 0xDF, + 0xDE, 0xFF, 0xD8, 0xD3, 0xCD, 0xFF, 0xB0, 0xA2, 0x8F, 0xFF, 0x85, 0x6A, 0x46, 0xFF, 0x79, 0x54, + 0x23, 0xFF, 0x78, 0x4C, 0x18, 0xFF, 0x7C, 0x4C, 0x12, 0xFF, 0x83, 0x4E, 0x12, 0xFF, 0x8B, 0x51, + 0x12, 0xFF, 0x91, 0x55, 0x13, 0xFF, 0x95, 0x56, 0x13, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, + 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x53, + 0x13, 0xFF, 0x94, 0x57, 0x1A, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0x9C, 0x66, 0x32, 0xFF, 0xA0, 0x6F, + 0x40, 0xFF, 0xAE, 0x83, 0x59, 0xFF, 0xB6, 0x8A, 0x66, 0xF1, 0xD6, 0xBD, 0xA0, 0x9B, 0xE3, 0xCF, + 0xBB, 0x26, 0xDC, 0xC7, 0xB0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xF3, 0xEA, 0x1F, 0xC9, 0xA6, 0x88, 0x8D, 0xA9, 0x77, 0x4C, 0xF1, 0x92, 0x5D, + 0x32, 0xFF, 0x86, 0x48, 0x18, 0xFF, 0x7B, 0x3C, 0x0C, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x7D, 0x3C, + 0x09, 0xFF, 0x7F, 0x3F, 0x09, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8D, 0x4D, 0x0F, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x51, 0x11, 0xFF, 0x8D, 0x53, 0x13, 0xFF, 0x94, 0x68, + 0x2D, 0xFF, 0xCA, 0xB3, 0x9C, 0xFF, 0xED, 0xE9, 0xE5, 0xFF, 0xEF, 0xEE, 0xEF, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF4, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0x95, 0x8A, + 0x73, 0xFF, 0x78, 0x66, 0x44, 0xFF, 0x7E, 0x6A, 0x46, 0xFF, 0x85, 0x73, 0x55, 0xFF, 0xBB, 0xB2, + 0xA2, 0xFF, 0xE2, 0xDF, 0xDC, 0xFF, 0xDF, 0xDA, 0xD7, 0xFF, 0xBC, 0xB2, 0xA4, 0xFF, 0x8F, 0x77, + 0x56, 0xFF, 0x7D, 0x5A, 0x2C, 0xFF, 0x78, 0x4E, 0x1A, 0xFF, 0x7A, 0x4B, 0x14, 0xFF, 0x82, 0x4E, + 0x12, 0xFF, 0x8B, 0x51, 0x13, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x96, 0x58, 0x13, 0xFF, 0x97, 0x59, + 0x14, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, + 0x14, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x99, 0x5A, + 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x92, 0x53, 0x12, 0xFF, 0x94, 0x57, 0x1B, 0xFF, 0x9A, 0x60, 0x29, 0xFF, 0x9F, 0x6B, + 0x39, 0xFF, 0xA8, 0x79, 0x4C, 0xFF, 0xB3, 0x87, 0x62, 0xFC, 0xBB, 0x9C, 0x7A, 0xC2, 0xCA, 0xAB, + 0x8E, 0x49, 0xD1, 0xBB, 0xA0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xC1, + 0xB0, 0x03, 0xDB, 0xC5, 0xB0, 0x3A, 0xBB, 0x96, 0x76, 0xBA, 0xA4, 0x72, 0x44, 0xF9, 0x8F, 0x56, + 0x26, 0xFF, 0x82, 0x44, 0x12, 0xFF, 0x7C, 0x3C, 0x0B, 0xFF, 0x7E, 0x3D, 0x0A, 0xFF, 0x80, 0x3E, + 0x0A, 0xFF, 0x82, 0x41, 0x09, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x87, 0x46, 0x0B, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x90, 0x53, 0x11, 0xFF, 0x89, 0x56, + 0x18, 0xFF, 0x9E, 0x76, 0x42, 0xFF, 0xD8, 0xC8, 0xB9, 0xFF, 0xF2, 0xED, 0xE8, 0xFF, 0xEE, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF3, 0xF5, 0xFF, 0xE5, 0xE5, + 0xE2, 0xFF, 0xA4, 0x9D, 0x8D, 0xFF, 0x7B, 0x6A, 0x4C, 0xFF, 0x7A, 0x64, 0x42, 0xFF, 0x7A, 0x65, + 0x45, 0xFF, 0xAA, 0x9D, 0x89, 0xFF, 0xDB, 0xD7, 0xD4, 0xFF, 0xE5, 0xE2, 0xE0, 0xFF, 0xCC, 0xC7, + 0xBD, 0xFF, 0xA5, 0x92, 0x7A, 0xFF, 0x84, 0x64, 0x38, 0xFF, 0x79, 0x52, 0x1E, 0xFF, 0x79, 0x4D, + 0x15, 0xFF, 0x7F, 0x4F, 0x14, 0xFF, 0x8A, 0x54, 0x13, 0xFF, 0x92, 0x57, 0x14, 0xFF, 0x96, 0x59, + 0x14, 0xFF, 0x98, 0x5A, 0x15, 0xFF, 0x9A, 0x5A, 0x14, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x99, 0x58, + 0x12, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x12, 0xFF, 0x95, 0x57, 0x1B, 0xFF, 0x9D, 0x64, + 0x2F, 0xFF, 0xA4, 0x72, 0x43, 0xFF, 0xB0, 0x81, 0x57, 0xFF, 0xC6, 0xA2, 0x80, 0xDD, 0xC7, 0xA7, + 0x8B, 0x74, 0xD8, 0xBB, 0x9F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, + 0xA4, 0x0A, 0xC6, 0xA7, 0x88, 0x5E, 0xB1, 0x87, 0x64, 0xD6, 0xA0, 0x6A, 0x39, 0xFC, 0x8D, 0x51, + 0x20, 0xFF, 0x7E, 0x3F, 0x0F, 0xFF, 0x7D, 0x3D, 0x0A, 0xFF, 0x7F, 0x3D, 0x0A, 0xFF, 0x81, 0x40, + 0x0A, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x89, 0x48, 0x0C, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x94, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0E, 0xFF, 0x8C, 0x53, + 0x0F, 0xFF, 0x8F, 0x5B, 0x1B, 0xFF, 0xA7, 0x87, 0x5D, 0xFF, 0xE2, 0xD8, 0xCE, 0xFF, 0xF0, 0xEE, + 0xEC, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF2, + 0xF5, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xB4, 0xB0, 0xA4, 0xFF, 0x83, 0x75, 0x5A, 0xFF, 0x7A, 0x66, + 0x45, 0xFF, 0x76, 0x62, 0x3F, 0xFF, 0x9E, 0x91, 0x7B, 0xFF, 0xD9, 0xD4, 0xCF, 0xFF, 0xE4, 0xE1, + 0xE0, 0xFF, 0xD8, 0xD3, 0xCE, 0xFF, 0xAE, 0xA0, 0x8E, 0xFF, 0x8A, 0x6E, 0x49, 0xFF, 0x7B, 0x56, + 0x27, 0xFF, 0x76, 0x4D, 0x18, 0xFF, 0x7E, 0x50, 0x14, 0xFF, 0x88, 0x53, 0x14, 0xFF, 0x8F, 0x57, + 0x15, 0xFF, 0x95, 0x59, 0x15, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, + 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x58, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x12, 0xFF, 0x99, 0x5C, + 0x22, 0xFF, 0xA1, 0x6C, 0x3B, 0xFF, 0xA7, 0x78, 0x4E, 0xFF, 0xC2, 0x9C, 0x76, 0xF3, 0xD4, 0xB1, + 0x8E, 0x9A, 0xD5, 0xBA, 0xA3, 0x2C, 0xA7, 0x96, 0x7E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xB7, + 0x97, 0x18, 0xC8, 0xA9, 0x8A, 0x84, 0xA8, 0x7C, 0x56, 0xE9, 0x9B, 0x63, 0x33, 0xFD, 0x88, 0x4B, + 0x1A, 0xFF, 0x80, 0x40, 0x0D, 0xFF, 0x80, 0x3E, 0x0A, 0xFF, 0x81, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x0F, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x94, 0x56, + 0x0F, 0xFF, 0x90, 0x56, 0x12, 0xFF, 0x92, 0x62, 0x27, 0xFF, 0xB6, 0x9B, 0x7D, 0xFF, 0xE8, 0xE2, + 0xD5, 0xFF, 0xF3, 0xF0, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xC3, 0xBF, 0xB8, 0xFF, 0x92, 0x83, + 0x68, 0xFF, 0x7D, 0x68, 0x44, 0xFF, 0x71, 0x5C, 0x38, 0xFF, 0x8C, 0x7D, 0x63, 0xFF, 0xCF, 0xCA, + 0xBF, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xDD, 0xDB, 0xD7, 0xFF, 0xC1, 0xB7, 0xAC, 0xFF, 0x96, 0x7E, + 0x60, 0xFF, 0x7B, 0x5B, 0x2D, 0xFF, 0x77, 0x51, 0x1B, 0xFF, 0x7D, 0x52, 0x19, 0xFF, 0x87, 0x54, + 0x16, 0xFF, 0x8F, 0x57, 0x15, 0xFF, 0x95, 0x5A, 0x17, 0xFF, 0x99, 0x5C, 0x18, 0xFF, 0x9C, 0x5D, + 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9C, 0x5B, + 0x13, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x5A, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x94, 0x55, + 0x15, 0xFF, 0x9C, 0x63, 0x2B, 0xFF, 0xA3, 0x75, 0x47, 0xFF, 0xC2, 0x99, 0x70, 0xFF, 0xD8, 0xB4, + 0x89, 0xBC, 0xB9, 0xA4, 0x8B, 0x41, 0x00, 0x24, 0x4C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xAC, + 0x8E, 0x2C, 0xC0, 0x97, 0x73, 0xA9, 0xA4, 0x74, 0x49, 0xF6, 0x96, 0x5C, 0x2B, 0xFE, 0x87, 0x49, + 0x18, 0xFF, 0x81, 0x41, 0x0D, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x86, 0x45, + 0x0A, 0xFF, 0x88, 0x48, 0x0B, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x5A, + 0x13, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x92, 0x5C, 0x19, 0xFF, 0x9C, 0x71, 0x38, 0xFF, 0xC1, 0xAE, + 0x94, 0xFF, 0xE9, 0xE7, 0xDE, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF2, 0xFF, 0xEF, 0xF0, + 0xF2, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF2, 0xFF, 0xEA, 0xEC, 0xED, 0xFF, 0xD0, 0xD0, + 0xCB, 0xFF, 0x99, 0x8F, 0x78, 0xFF, 0x7C, 0x67, 0x45, 0xFF, 0x74, 0x5E, 0x38, 0xFF, 0x8C, 0x78, + 0x5A, 0xFF, 0xC6, 0xBC, 0xAE, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xCC, 0xC5, + 0xBC, 0xFF, 0xA1, 0x8F, 0x77, 0xFF, 0x7F, 0x62, 0x39, 0xFF, 0x78, 0x53, 0x21, 0xFF, 0x7E, 0x52, + 0x1A, 0xFF, 0x85, 0x53, 0x17, 0xFF, 0x8E, 0x58, 0x18, 0xFF, 0x95, 0x5A, 0x19, 0xFF, 0x99, 0x5D, + 0x18, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x18, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5C, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9C, 0x5A, 0x12, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x98, 0x5A, 0x1B, 0xFF, 0xA2, 0x71, 0x3D, 0xFF, 0xB9, 0x8C, 0x61, 0xFF, 0xD4, 0xAC, + 0x81, 0xD9, 0xA8, 0x92, 0x71, 0x62, 0x03, 0x26, 0x4C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0x03, 0xCE, 0xB1, + 0x94, 0x45, 0xB3, 0x83, 0x56, 0xCB, 0xA2, 0x6E, 0x40, 0xFD, 0x93, 0x5A, 0x29, 0xFF, 0x85, 0x46, + 0x14, 0xFF, 0x82, 0x41, 0x0C, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x88, 0x47, + 0x0B, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9D, 0x5F, + 0x17, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x99, 0x5D, 0x17, 0xFF, 0x97, 0x63, 0x20, 0xFF, 0xA3, 0x7A, + 0x48, 0xFF, 0xCD, 0xBF, 0xAD, 0xFF, 0xE8, 0xE8, 0xE2, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xF0, + 0xF0, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xA9, 0xA0, 0x90, 0xFF, 0x80, 0x6D, 0x4B, 0xFF, 0x73, 0x60, + 0x39, 0xFF, 0x82, 0x6F, 0x4E, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0xDF, 0xE0, 0xDB, 0xFF, 0xE1, 0xE2, + 0xE1, 0xFF, 0xD7, 0xD4, 0xCC, 0xFF, 0xB4, 0xA8, 0x93, 0xFF, 0x89, 0x71, 0x4A, 0xFF, 0x7C, 0x5B, + 0x2A, 0xFF, 0x7E, 0x56, 0x20, 0xFF, 0x84, 0x56, 0x1A, 0xFF, 0x8C, 0x58, 0x19, 0xFF, 0x94, 0x5C, + 0x1A, 0xFF, 0x9B, 0x5F, 0x1B, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x61, 0x1B, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA0, 0x61, 0x1B, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, + 0x1C, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x61, 0x19, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0x9F, 0x5E, 0x16, 0xFF, 0x9E, 0x5D, + 0x13, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x99, 0x58, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x55, 0x13, 0xFF, 0x9F, 0x67, 0x2D, 0xFF, 0xB3, 0x85, 0x56, 0xFF, 0xC5, 0x9F, + 0x75, 0xEC, 0xC5, 0xA7, 0x87, 0x7F, 0xC6, 0xB3, 0xA0, 0x1B, 0xA8, 0xA0, 0x96, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x0B, 0xD7, 0xB8, + 0x9D, 0x5D, 0xAB, 0x7C, 0x4C, 0xE4, 0x9D, 0x69, 0x39, 0xFF, 0x92, 0x56, 0x25, 0xFF, 0x84, 0x44, + 0x10, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x85, 0x43, 0x0A, 0xFF, 0x88, 0x47, 0x0B, 0xFF, 0x8A, 0x49, + 0x0C, 0xFF, 0x8D, 0x4C, 0x0C, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9B, 0x5A, + 0x12, 0xFF, 0x9D, 0x5C, 0x14, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA0, 0x61, 0x19, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0x9C, 0x61, 0x1D, 0xFF, 0x9A, 0x66, + 0x27, 0xFF, 0xAC, 0x89, 0x5C, 0xFF, 0xD3, 0xCB, 0xBC, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xE6, 0xE6, 0xE5, 0xFF, 0xBA, 0xB4, 0xA7, 0xFF, 0x81, 0x70, + 0x4E, 0xFF, 0x73, 0x5E, 0x36, 0xFF, 0x84, 0x70, 0x4B, 0xFF, 0xAA, 0x9C, 0x84, 0xFF, 0xD9, 0xD7, + 0xD0, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xDF, 0xDB, 0xD8, 0xFF, 0xBF, 0xB6, 0xA7, 0xFF, 0x91, 0x7B, + 0x5A, 0xFF, 0x7F, 0x5F, 0x31, 0xFF, 0x7E, 0x56, 0x21, 0xFF, 0x83, 0x55, 0x1C, 0xFF, 0x8C, 0x58, + 0x1A, 0xFF, 0x95, 0x5C, 0x1C, 0xFF, 0x9A, 0x60, 0x1B, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0xA0, 0x63, + 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1B, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1D, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1B, 0xFF, 0xA2, 0x62, 0x1A, 0xFF, 0xA1, 0x61, + 0x18, 0xFF, 0xA0, 0x5E, 0x15, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9D, 0x5C, 0x11, 0xFF, 0x9C, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x10, 0xFF, 0x9A, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x0F, 0xFF, 0x98, 0x57, 0x0F, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x95, 0x56, 0x12, 0xFF, 0x9B, 0x5E, 0x1E, 0xFF, 0xAC, 0x7B, 0x49, 0xFF, 0xB8, 0x90, + 0x65, 0xF6, 0xC9, 0xAC, 0x8B, 0x9F, 0xDB, 0xC3, 0xA7, 0x29, 0xDB, 0xC2, 0xA9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xD4, 0x15, 0xCC, 0xAC, + 0x8D, 0x7C, 0xAD, 0x7D, 0x4D, 0xED, 0x9C, 0x66, 0x34, 0xFF, 0x8F, 0x51, 0x1C, 0xFF, 0x85, 0x44, + 0x0F, 0xFF, 0x86, 0x44, 0x0C, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8A, 0x49, 0x0B, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x94, 0x52, 0x0E, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9F, 0x60, + 0x18, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA3, 0x65, 0x1E, 0xFF, 0xA2, 0x65, 0x1E, 0xFF, 0x9F, 0x63, 0x1E, 0xFF, 0x9B, 0x62, + 0x1E, 0xFF, 0x9B, 0x69, 0x2A, 0xFF, 0xB5, 0x95, 0x6E, 0xFF, 0xD9, 0xD3, 0xCA, 0xFF, 0xE8, 0xE8, + 0xE6, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xE9, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xC8, 0xC5, + 0xBC, 0xFF, 0x89, 0x7B, 0x5F, 0xFF, 0x73, 0x61, 0x3B, 0xFF, 0x7D, 0x68, 0x43, 0xFF, 0x9B, 0x8A, + 0x6F, 0xFF, 0xD2, 0xCF, 0xC1, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xCF, 0xCB, + 0xC0, 0xFF, 0xA2, 0x92, 0x7A, 0xFF, 0x87, 0x69, 0x3E, 0xFF, 0x7F, 0x5A, 0x26, 0xFF, 0x81, 0x57, + 0x1E, 0xFF, 0x89, 0x59, 0x1D, 0xFF, 0x93, 0x5E, 0x1D, 0xFF, 0x9B, 0x61, 0x1D, 0xFF, 0x9F, 0x63, + 0x1D, 0xFF, 0xA1, 0x64, 0x1D, 0xFF, 0xA2, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA3, 0x64, 0x1B, 0xFF, 0xA2, 0x62, 0x17, 0xFF, 0xA0, 0x60, 0x15, 0xFF, 0x9F, 0x5E, + 0x13, 0xFF, 0x9F, 0x5D, 0x13, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9C, 0x5B, 0x10, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x97, 0x56, + 0x0F, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x9A, 0x5C, 0x1B, 0xFF, 0xA9, 0x71, 0x3A, 0xFF, 0xB6, 0x87, + 0x58, 0xFB, 0xCC, 0xB0, 0x8B, 0xBB, 0xE0, 0xC6, 0xAC, 0x3A, 0xDF, 0xCA, 0xB2, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC9, 0xAF, 0x25, 0xC8, 0xA6, + 0x81, 0x97, 0xAA, 0x78, 0x45, 0xF4, 0x9B, 0x61, 0x2F, 0xFF, 0x8C, 0x4D, 0x18, 0xFF, 0x87, 0x45, + 0x0F, 0xFF, 0x88, 0x45, 0x0C, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x4B, 0x0C, 0xFF, 0x8E, 0x4E, + 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0xA0, 0x61, 0x1A, 0xFF, 0xA2, 0x64, + 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA3, 0x66, 0x1F, 0xFF, 0x9F, 0x65, + 0x1D, 0xFF, 0x9B, 0x62, 0x1F, 0xFF, 0xA1, 0x72, 0x33, 0xFF, 0xBC, 0xA4, 0x86, 0xFF, 0xE0, 0xDC, + 0xD6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEB, 0xEB, 0xED, 0xFF, 0xEB, 0xEA, + 0xEC, 0xFF, 0xD6, 0xD3, 0xCE, 0xFF, 0x93, 0x87, 0x6C, 0xFF, 0x7A, 0x66, 0x3F, 0xFF, 0x82, 0x6D, + 0x45, 0xFF, 0x92, 0x7F, 0x5E, 0xFF, 0xC7, 0xC0, 0xB0, 0xFF, 0xE6, 0xE3, 0xE2, 0xFF, 0xE4, 0xE0, + 0xE1, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xB0, 0xA4, 0x90, 0xFF, 0x8E, 0x74, 0x4E, 0xFF, 0x80, 0x5D, + 0x2D, 0xFF, 0x7F, 0x57, 0x20, 0xFF, 0x87, 0x5A, 0x1E, 0xFF, 0x91, 0x5D, 0x1E, 0xFF, 0x98, 0x61, + 0x1E, 0xFF, 0x9E, 0x63, 0x1E, 0xFF, 0xA1, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x20, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xA4, 0x64, 0x1A, 0xFF, 0xA2, 0x62, + 0x17, 0xFF, 0xA1, 0x5F, 0x14, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0xA0, 0x5D, 0x12, 0xFF, 0x9E, 0x5D, + 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x0F, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x98, 0x5A, 0x17, 0xFF, 0xA7, 0x6C, 0x31, 0xFF, 0xB4, 0x80, + 0x4D, 0xFD, 0xC8, 0xAA, 0x85, 0xCC, 0xDD, 0xC8, 0xB0, 0x50, 0xE0, 0xCA, 0xB4, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC9, 0xB0, 0x03, 0xDB, 0xC1, 0xA5, 0x2F, 0xC0, 0x9E, + 0x7A, 0xB0, 0xAA, 0x75, 0x40, 0xF8, 0x9A, 0x5F, 0x2C, 0xFF, 0x8D, 0x4D, 0x17, 0xFF, 0x88, 0x46, + 0x0D, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA5, 0x68, + 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA3, 0x67, + 0x20, 0xFF, 0xA0, 0x66, 0x20, 0xFF, 0x9A, 0x64, 0x22, 0xFF, 0xA2, 0x7A, 0x41, 0xFF, 0xC3, 0xB1, + 0x9A, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE5, + 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xEA, 0xE9, 0xEB, 0xFF, 0xDF, 0xDE, 0xD9, 0xFF, 0xA3, 0x99, 0x86, 0xFF, 0x7C, 0x6A, + 0x48, 0xFF, 0x7E, 0x6A, 0x43, 0xFF, 0x85, 0x71, 0x4E, 0xFF, 0xBC, 0xB1, 0x9D, 0xFF, 0xE1, 0xDE, + 0xDA, 0xFF, 0xE7, 0xE4, 0xE3, 0xFF, 0xDA, 0xD8, 0xD4, 0xFF, 0xC2, 0xBA, 0xAE, 0xFF, 0x9B, 0x84, + 0x64, 0xFF, 0x82, 0x63, 0x33, 0xFF, 0x7F, 0x5A, 0x23, 0xFF, 0x85, 0x5C, 0x21, 0xFF, 0x90, 0x5E, + 0x1F, 0xFF, 0x98, 0x61, 0x1E, 0xFF, 0x9E, 0x65, 0x1F, 0xFF, 0xA2, 0x67, 0x20, 0xFF, 0xA5, 0x68, + 0x20, 0xFF, 0xA7, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x68, 0x20, 0xFF, 0xA6, 0x68, + 0x1E, 0xFF, 0xA4, 0x65, 0x1A, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9F, 0x5E, + 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x59, 0x15, 0xFF, 0xA7, 0x6B, 0x2E, 0xFF, 0xB2, 0x7B, + 0x46, 0xFF, 0xC5, 0xA4, 0x7B, 0xD9, 0xDC, 0xC5, 0xAB, 0x69, 0xDF, 0xC9, 0xB0, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xC3, 0xA8, 0x04, 0xD7, 0xBD, 0xA2, 0x3D, 0xBC, 0x9A, + 0x74, 0xC4, 0xA8, 0x71, 0x3A, 0xFD, 0x98, 0x5C, 0x28, 0xFF, 0x8D, 0x4C, 0x15, 0xFF, 0x8A, 0x48, + 0x0D, 0xFF, 0x8B, 0x48, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x90, 0x4E, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x99, 0x57, 0x12, 0xFF, 0x9C, 0x5B, 0x15, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA5, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA8, 0x6A, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA5, 0x69, 0x21, 0xFF, 0x9F, 0x67, 0x20, 0xFF, 0x9C, 0x69, 0x25, 0xFF, 0xAA, 0x83, + 0x4D, 0xFF, 0xC9, 0xBC, 0xAD, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE2, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE8, 0xEA, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xEB, 0xE8, 0xEB, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xB1, 0xA9, + 0x96, 0xFF, 0x83, 0x72, 0x50, 0xFF, 0x7F, 0x69, 0x42, 0xFF, 0x83, 0x6E, 0x48, 0xFF, 0xB0, 0xA5, + 0x8F, 0xFF, 0xDD, 0xD9, 0xD5, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xCC, 0xC5, + 0xBB, 0xFF, 0xA4, 0x92, 0x76, 0xFF, 0x85, 0x69, 0x3D, 0xFF, 0x7E, 0x5C, 0x27, 0xFF, 0x86, 0x5C, + 0x22, 0xFF, 0x8E, 0x5D, 0x1F, 0xFF, 0x97, 0x62, 0x21, 0xFF, 0x9E, 0x65, 0x22, 0xFF, 0xA4, 0x69, + 0x21, 0xFF, 0xA7, 0x6A, 0x22, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x22, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x17, 0xFF, 0xA1, 0x60, + 0x14, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9B, 0x5A, 0x10, 0xFF, 0x9C, 0x5D, 0x15, 0xFF, 0xA3, 0x66, 0x28, 0xFF, 0xB2, 0x7A, + 0x42, 0xFF, 0xC4, 0x9F, 0x76, 0xE4, 0xDA, 0xC0, 0xA4, 0x82, 0xDD, 0xC4, 0xAA, 0x17, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA3, 0x06, 0xD5, 0xBA, 0x9D, 0x4F, 0xBC, 0x98, + 0x70, 0xD8, 0xA7, 0x6E, 0x38, 0xFD, 0x96, 0x58, 0x23, 0xFF, 0x8E, 0x4D, 0x14, 0xFF, 0x8C, 0x49, + 0x0E, 0xFF, 0x8D, 0x49, 0x0B, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0x9D, 0x5D, 0x18, 0xFF, 0xA1, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, + 0x25, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xA6, 0x6B, 0x23, 0xFF, 0xA0, 0x68, 0x22, 0xFF, 0x9C, 0x6C, + 0x2A, 0xFF, 0xAD, 0x8E, 0x63, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE4, 0xE6, 0xE5, 0xFF, 0xE3, 0xE6, + 0xE6, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE8, 0xE7, 0xEA, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xBF, 0xB9, 0xAE, 0xFF, 0x8F, 0x7D, 0x5C, 0xFF, 0x82, 0x6B, 0x42, 0xFF, 0x7D, 0x68, + 0x41, 0xFF, 0xA1, 0x94, 0x7A, 0xFF, 0xD7, 0xD3, 0xCB, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDD, 0xDD, + 0xDC, 0xFF, 0xD3, 0xCF, 0xC9, 0xFF, 0xB5, 0xA7, 0x91, 0xFF, 0x8E, 0x76, 0x4F, 0xFF, 0x81, 0x62, + 0x2F, 0xFF, 0x85, 0x5F, 0x27, 0xFF, 0x8E, 0x60, 0x23, 0xFF, 0x96, 0x63, 0x22, 0xFF, 0x9F, 0x68, + 0x23, 0xFF, 0xA5, 0x6C, 0x24, 0xFF, 0xA8, 0x6C, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAA, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6C, 0x23, 0xFF, 0xA9, 0x6A, 0x20, 0xFF, 0xA6, 0x66, + 0x1A, 0xFF, 0xA3, 0x62, 0x15, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x5E, 0x11, 0xFF, 0x9F, 0x5D, + 0x11, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA3, 0x66, 0x23, 0xFF, 0xAF, 0x77, + 0x3D, 0xFF, 0xC3, 0x9D, 0x72, 0xEA, 0xD6, 0xB9, 0x99, 0x95, 0xD9, 0xBF, 0xA1, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA1, 0x0A, 0xD6, 0xBA, 0x9C, 0x62, 0xBB, 0x95, + 0x6B, 0xDE, 0xA4, 0x69, 0x33, 0xFD, 0x96, 0x57, 0x1F, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8E, 0x4B, + 0x0D, 0xFF, 0x8F, 0x4B, 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x94, 0x52, 0x0F, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x9D, 0x5D, 0x19, 0xFF, 0xA2, 0x63, 0x1F, 0xFF, 0xA5, 0x68, 0x23, 0xFF, 0xA6, 0x6A, + 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xAB, 0x6D, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xA8, 0x6C, 0x25, 0xFF, 0xA1, 0x6A, + 0x25, 0xFF, 0xA1, 0x73, 0x32, 0xFF, 0xB2, 0x97, 0x71, 0xFF, 0xD4, 0xCD, 0xC5, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDD, 0xDE, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE5, 0xE4, + 0xE7, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xCB, 0xC9, 0xC1, 0xFF, 0x97, 0x8A, 0x6B, 0xFF, 0x7F, 0x6A, + 0x43, 0xFF, 0x7C, 0x67, 0x3E, 0xFF, 0x9A, 0x8A, 0x6C, 0xFF, 0xD2, 0xCA, 0xC0, 0xFF, 0xE0, 0xE0, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xD8, 0xD4, 0xD1, 0xFF, 0xBF, 0xB5, 0xA5, 0xFF, 0x94, 0x7F, + 0x5D, 0xFF, 0x82, 0x65, 0x36, 0xFF, 0x86, 0x5F, 0x2A, 0xFF, 0x8D, 0x60, 0x25, 0xFF, 0x95, 0x64, + 0x24, 0xFF, 0x9E, 0x68, 0x25, 0xFF, 0xA4, 0x6C, 0x25, 0xFF, 0xA9, 0x6E, 0x25, 0xFF, 0xAA, 0x6E, + 0x26, 0xFF, 0xAB, 0x6F, 0x25, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x25, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAA, 0x6C, + 0x22, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x16, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xA0, 0x5E, + 0x12, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0xA5, 0x67, 0x21, 0xFF, 0xAF, 0x77, + 0x38, 0xFF, 0xC2, 0x9A, 0x6F, 0xF3, 0xD3, 0xB5, 0x93, 0xA4, 0xD6, 0xB9, 0x9A, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA1, 0x0E, 0xD7, 0xBC, 0x9D, 0x72, 0xBB, 0x96, + 0x6B, 0xE3, 0xA3, 0x67, 0x30, 0xFE, 0x97, 0x57, 0x1D, 0xFF, 0x90, 0x4F, 0x13, 0xFF, 0x90, 0x4C, + 0x0D, 0xFF, 0x91, 0x4D, 0x0C, 0xFF, 0x94, 0x50, 0x0E, 0xFF, 0x98, 0x57, 0x14, 0xFF, 0x9E, 0x5F, + 0x1C, 0xFF, 0xA2, 0x65, 0x22, 0xFF, 0xA5, 0x69, 0x25, 0xFF, 0xA7, 0x6B, 0x26, 0xFF, 0xA9, 0x6D, + 0x27, 0xFF, 0xAA, 0x6E, 0x27, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x6F, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAC, 0x70, 0x28, 0xFF, 0xAB, 0x70, 0x28, 0xFF, 0xA8, 0x6E, + 0x26, 0xFF, 0xA3, 0x6D, 0x28, 0xFF, 0xA1, 0x76, 0x3B, 0xFF, 0xB9, 0xA4, 0x88, 0xFF, 0xD5, 0xD0, + 0xC7, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD9, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDA, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xD4, 0xD0, + 0xCB, 0xFF, 0xC9, 0xC0, 0xB0, 0xFF, 0xC8, 0xC1, 0xAF, 0xFF, 0xD7, 0xD8, 0xD0, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xD4, 0xD3, 0xCE, 0xFF, 0xA5, 0x99, + 0x7F, 0xFF, 0x81, 0x6D, 0x43, 0xFF, 0x7B, 0x69, 0x3E, 0xFF, 0x92, 0x81, 0x62, 0xFF, 0xC8, 0xBF, + 0xB0, 0xFF, 0xDA, 0xD9, 0xD5, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDA, 0xD8, 0xD7, 0xFF, 0xCC, 0xC7, + 0xBB, 0xFF, 0xA4, 0x95, 0x7B, 0xFF, 0x88, 0x6C, 0x42, 0xFF, 0x84, 0x61, 0x2D, 0xFF, 0x8B, 0x62, + 0x26, 0xFF, 0x93, 0x64, 0x25, 0xFF, 0x9E, 0x6A, 0x26, 0xFF, 0xA6, 0x6E, 0x27, 0xFF, 0xA9, 0x6F, + 0x27, 0xFF, 0xAB, 0x6F, 0x27, 0xFF, 0xAC, 0x71, 0x27, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, + 0x27, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA2, 0x60, + 0x12, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x61, 0x15, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xAF, 0x77, + 0x33, 0xFF, 0xC0, 0x99, 0x6E, 0xF8, 0xD5, 0xB5, 0x93, 0xB6, 0xD5, 0xB7, 0x96, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA0, 0x12, 0xD7, 0xBD, 0x9E, 0x7F, 0xBB, 0x95, + 0x69, 0xE4, 0xA2, 0x64, 0x2C, 0xFD, 0x97, 0x57, 0x1C, 0xFF, 0x92, 0x50, 0x13, 0xFF, 0x92, 0x4E, + 0x0D, 0xFF, 0x93, 0x4F, 0x0E, 0xFF, 0x97, 0x55, 0x13, 0xFF, 0x9D, 0x5E, 0x1C, 0xFF, 0xA2, 0x65, + 0x23, 0xFF, 0xA6, 0x6A, 0x27, 0xFF, 0xA7, 0x6C, 0x28, 0xFF, 0xAA, 0x6E, 0x28, 0xFF, 0xAB, 0x6E, + 0x29, 0xFF, 0xAC, 0x6F, 0x29, 0xFF, 0xAD, 0x70, 0x29, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAE, 0x72, 0x29, 0xFF, 0xAD, 0x71, + 0x29, 0xFF, 0xAA, 0x70, 0x29, 0xFF, 0xA4, 0x70, 0x2D, 0xFF, 0xA7, 0x81, 0x4A, 0xFF, 0xBD, 0xAD, + 0x96, 0xFF, 0xD4, 0xD1, 0xCD, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD7, 0xD9, + 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, + 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDC, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD0, 0xCA, 0xBF, 0xFF, 0xA4, 0x93, + 0x76, 0xFF, 0x94, 0x7C, 0x52, 0xFF, 0x96, 0x7C, 0x4F, 0xFF, 0xBD, 0xAF, 0x96, 0xFF, 0xDB, 0xD9, + 0xD3, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE2, 0xE4, + 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDC, 0xDC, + 0xDB, 0xFF, 0xB4, 0xAC, 0x98, 0xFF, 0x84, 0x71, 0x4B, 0xFF, 0x7D, 0x69, 0x3E, 0xFF, 0x95, 0x83, + 0x61, 0xFF, 0xC3, 0xB9, 0xA6, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDB, 0xD8, + 0xD8, 0xFF, 0xD2, 0xCD, 0xC7, 0xFF, 0xB2, 0xA6, 0x8F, 0xFF, 0x8F, 0x78, 0x51, 0xFF, 0x84, 0x64, + 0x32, 0xFF, 0x88, 0x61, 0x28, 0xFF, 0x92, 0x65, 0x27, 0xFF, 0x9D, 0x69, 0x28, 0xFF, 0xA4, 0x6D, + 0x28, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAC, 0x72, 0x29, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x72, 0x2A, 0xFF, 0xAE, 0x70, 0x27, 0xFF, 0xAA, 0x6A, 0x1F, 0xFF, 0xA4, 0x62, + 0x15, 0xFF, 0xA3, 0x60, 0x14, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA6, 0x67, 0x1E, 0xFF, 0xB1, 0x77, + 0x30, 0xFF, 0xBF, 0x97, 0x6A, 0xFF, 0xD5, 0xB5, 0x92, 0xC5, 0xD6, 0xB7, 0x95, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA0, 0x15, 0xD7, 0xBC, 0x9E, 0x87, 0xBE, 0x95, + 0x69, 0xE8, 0xA2, 0x64, 0x2B, 0xFF, 0x97, 0x56, 0x1A, 0xFF, 0x93, 0x50, 0x12, 0xFF, 0x94, 0x50, + 0x10, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0x9E, 0x5F, 0x1E, 0xFF, 0xA2, 0x66, 0x25, 0xFF, 0xA6, 0x6A, + 0x28, 0xFF, 0xA8, 0x6D, 0x29, 0xFF, 0xAA, 0x6E, 0x2A, 0xFF, 0xAB, 0x70, 0x2A, 0xFF, 0xAD, 0x71, + 0x2A, 0xFF, 0xAE, 0x72, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB0, 0x75, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xAD, 0x73, 0x2C, 0xFF, 0xAA, 0x71, 0x2B, 0xFF, 0xA4, 0x72, 0x2F, 0xFF, 0xA9, 0x86, + 0x54, 0xFF, 0xC3, 0xB6, 0xA6, 0xFF, 0xD3, 0xD3, 0xCE, 0xFF, 0xD9, 0xD8, 0xD9, 0xFF, 0xD7, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD8, 0xD9, + 0xD9, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xD9, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD8, 0xDA, + 0xDB, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xB3, 0xA8, 0x95, 0xFF, 0x8B, 0x74, + 0x4D, 0xFF, 0x8A, 0x6F, 0x44, 0xFF, 0x8B, 0x6E, 0x40, 0xFF, 0xA6, 0x8C, 0x60, 0xFF, 0xD6, 0xCF, + 0xC5, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE3, 0xE4, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE0, 0xE1, 0xDF, 0xFF, 0xC1, 0xBB, 0xAE, 0xFF, 0x8C, 0x7C, 0x5A, 0xFF, 0x7F, 0x6F, + 0x47, 0xFF, 0x92, 0x82, 0x60, 0xFF, 0xB9, 0xAD, 0x98, 0xFF, 0xD5, 0xD4, 0xCC, 0xFF, 0xDA, 0xD9, + 0xDA, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xD7, 0xD5, 0xD0, 0xFF, 0xC0, 0xB8, 0xA9, 0xFF, 0x9B, 0x85, + 0x64, 0xFF, 0x87, 0x69, 0x39, 0xFF, 0x89, 0x64, 0x2C, 0xFF, 0x91, 0x66, 0x2A, 0xFF, 0x9C, 0x6B, + 0x29, 0xFF, 0xA4, 0x6E, 0x29, 0xFF, 0xA9, 0x71, 0x2B, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAA, 0x6A, + 0x20, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA3, 0x63, 0x17, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xB2, 0x75, + 0x2E, 0xFF, 0xC1, 0x97, 0x69, 0xFF, 0xD4, 0xB4, 0x91, 0xD7, 0xD5, 0xB6, 0x94, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0xA0, 0x19, 0xD8, 0xBC, 0x9D, 0x8F, 0xBF, 0x95, + 0x66, 0xEA, 0xA2, 0x63, 0x29, 0xFE, 0x98, 0x56, 0x1A, 0xFF, 0x95, 0x52, 0x14, 0xFF, 0x98, 0x54, + 0x14, 0xFF, 0x9C, 0x5C, 0x1C, 0xFF, 0xA3, 0x66, 0x26, 0xFF, 0xA6, 0x6B, 0x2A, 0xFF, 0xA8, 0x6D, + 0x2B, 0xFF, 0xAB, 0x6F, 0x2B, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xAF, 0x75, 0x2C, 0xFF, 0xAB, 0x73, 0x2D, 0xFF, 0xA6, 0x75, + 0x33, 0xFF, 0xAF, 0x8F, 0x61, 0xFF, 0xC6, 0xBE, 0xB0, 0xFF, 0xD4, 0xD3, 0xCF, 0xFF, 0xD5, 0xD5, + 0xD6, 0xFF, 0xD5, 0xD6, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD7, 0xD9, 0xD5, 0xFF, 0xAB, 0xA1, 0x8A, 0xFF, 0x84, 0x6F, + 0x44, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x84, 0x68, 0x3B, 0xFF, 0x9A, 0x7C, 0x4C, 0xFF, 0xCF, 0xC3, + 0xB3, 0xFF, 0xDB, 0xDA, 0xD7, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xE0, 0xDF, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE1, 0xE2, + 0xE4, 0xFF, 0xE2, 0xE2, 0xE4, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xD0, 0xCC, 0xC5, 0xFF, 0x98, 0x8B, + 0x6D, 0xFF, 0x87, 0x76, 0x4F, 0xFF, 0x93, 0x82, 0x60, 0xFF, 0xB6, 0xA8, 0x91, 0xFF, 0xD1, 0xCE, + 0xC6, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xDC, 0xDA, 0xDA, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCA, 0xC4, + 0xB8, 0xFF, 0xA4, 0x93, 0x76, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x87, 0x65, 0x2F, 0xFF, 0x91, 0x68, + 0x2C, 0xFF, 0x9B, 0x6B, 0x2A, 0xFF, 0xA2, 0x6F, 0x2B, 0xFF, 0xA9, 0x72, 0x2C, 0xFF, 0xAE, 0x75, + 0x2C, 0xFF, 0xB1, 0x76, 0x2C, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x76, + 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2E, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB2, 0x76, 0x2E, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAB, 0x6C, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA7, 0x67, 0x1D, 0xFF, 0xAF, 0x72, + 0x2C, 0xFF, 0xC2, 0x98, 0x67, 0xFF, 0xD4, 0xB5, 0x91, 0xE4, 0xD6, 0xB6, 0x93, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0x9F, 0x19, 0xD9, 0xBD, 0x9E, 0x94, 0xBF, 0x93, + 0x63, 0xED, 0xA3, 0x64, 0x29, 0xFF, 0x9B, 0x59, 0x1C, 0xFF, 0x98, 0x56, 0x18, 0xFF, 0x9D, 0x5D, + 0x1F, 0xFF, 0xA1, 0x65, 0x27, 0xFF, 0xA5, 0x6A, 0x2B, 0xFF, 0xA8, 0x6D, 0x2C, 0xFF, 0xAB, 0x6F, + 0x2C, 0xFF, 0xAD, 0x71, 0x2D, 0xFF, 0xAE, 0x72, 0x2D, 0xFF, 0xAF, 0x73, 0x2D, 0xFF, 0xB0, 0x75, + 0x2E, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB3, 0x79, 0x2E, 0xFF, 0xB1, 0x78, 0x2E, 0xFF, 0xB0, 0x77, 0x30, 0xFF, 0xAA, 0x75, + 0x2E, 0xFF, 0xA7, 0x78, 0x35, 0xFF, 0xB1, 0x95, 0x70, 0xFF, 0xCB, 0xC5, 0xBC, 0xFF, 0xD5, 0xD6, + 0xD3, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCB, 0xC5, 0xB7, 0xFF, 0x99, 0x89, + 0x64, 0xFF, 0x85, 0x70, 0x43, 0xFF, 0x86, 0x6E, 0x41, 0xFF, 0x9A, 0x81, 0x5A, 0xFF, 0xC3, 0xB2, + 0x97, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0xDE, 0xDF, 0xE1, 0xFF, 0xDD, 0xDD, 0xD7, 0xFF, 0xDC, 0xDD, + 0xD8, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE1, 0xE0, 0xD9, 0xFF, 0xE2, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE3, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE3, + 0xE3, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD3, 0xD1, + 0xCB, 0xFF, 0xA6, 0x9B, 0x85, 0xFF, 0x89, 0x7A, 0x58, 0xFF, 0x8F, 0x7E, 0x5E, 0xFF, 0xA7, 0x99, + 0x80, 0xFF, 0xD0, 0xCC, 0xC0, 0xFF, 0xDC, 0xDA, 0xD9, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xDA, 0xDA, + 0xD8, 0xFF, 0xD1, 0xCE, 0xC8, 0xFF, 0xB3, 0xA5, 0x8F, 0xFF, 0x91, 0x79, 0x4E, 0xFF, 0x8A, 0x6A, + 0x34, 0xFF, 0x90, 0x6A, 0x2F, 0xFF, 0x99, 0x6C, 0x2C, 0xFF, 0xA2, 0x70, 0x2D, 0xFF, 0xAA, 0x74, + 0x2E, 0xFF, 0xB0, 0x77, 0x2F, 0xFF, 0xB2, 0x78, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x30, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB2, 0x77, + 0x2F, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xAC, 0x6D, 0x24, 0xFF, 0xB0, 0x73, + 0x2E, 0xFF, 0xC2, 0x98, 0x66, 0xFF, 0xD5, 0xB5, 0x90, 0xEF, 0xD6, 0xB7, 0x92, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x1A, 0xD9, 0xBC, 0x9C, 0x96, 0xBF, 0x92, + 0x60, 0xED, 0xA4, 0x67, 0x2B, 0xFF, 0x9E, 0x5E, 0x21, 0xFF, 0x9C, 0x5C, 0x20, 0xFF, 0xA2, 0x65, + 0x28, 0xFF, 0xA5, 0x6A, 0x2C, 0xFF, 0xA7, 0x6C, 0x2D, 0xFF, 0xAB, 0x6F, 0x2E, 0xFF, 0xAC, 0x71, + 0x2E, 0xFF, 0xAF, 0x73, 0x2E, 0xFF, 0xB0, 0x74, 0x2F, 0xFF, 0xB1, 0x76, 0x2F, 0xFF, 0xB2, 0x77, + 0x30, 0xFF, 0xB3, 0x78, 0x30, 0xFF, 0xB4, 0x79, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x30, 0xFF, 0xB4, 0x7A, 0x30, 0xFF, 0xB3, 0x7A, 0x31, 0xFF, 0xAF, 0x78, + 0x30, 0xFF, 0xAD, 0x78, 0x32, 0xFF, 0xAB, 0x82, 0x45, 0xFF, 0xBA, 0xA5, 0x8B, 0xFF, 0xD1, 0xCD, + 0xC6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD6, 0xD7, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, + 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD5, 0xD7, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xCB, 0xC6, + 0xC2, 0xFF, 0xBC, 0xB8, 0xAE, 0xFF, 0xB8, 0xB4, 0x9F, 0xFF, 0xB6, 0xAC, 0x8E, 0xFF, 0xAD, 0x9D, + 0x77, 0xFF, 0xB5, 0xAB, 0x97, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xC4, 0xB6, 0x96, 0xFF, 0xBA, 0xAB, + 0x8D, 0xFF, 0xB8, 0xA7, 0x91, 0xFF, 0xB7, 0xA6, 0x8F, 0xFF, 0xC1, 0xB4, 0xA2, 0xFF, 0xD2, 0xCC, + 0xC2, 0xFF, 0xDD, 0xDC, 0xD1, 0xFF, 0xDE, 0xDE, 0xD7, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE0, 0xDF, + 0xE0, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xB3, 0xA9, 0x94, 0xFF, 0x93, 0x84, 0x63, 0xFF, 0x91, 0x81, + 0x5F, 0xFF, 0xA5, 0x97, 0x7B, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xDC, 0xDB, 0xDA, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xBC, 0xB1, 0xA0, 0xFF, 0x98, 0x82, + 0x5B, 0xFF, 0x8B, 0x6C, 0x3A, 0xFF, 0x8F, 0x6A, 0x31, 0xFF, 0x98, 0x6C, 0x2E, 0xFF, 0xA2, 0x71, + 0x2F, 0xFF, 0xAA, 0x75, 0x30, 0xFF, 0xB0, 0x79, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAF, 0x73, 0x2C, 0xFF, 0xB0, 0x75, + 0x31, 0xFF, 0xC3, 0x9B, 0x67, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD6, 0xB7, 0x92, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x19, 0xD9, 0xBC, 0x9C, 0x95, 0xBD, 0x8F, + 0x5E, 0xEE, 0xA6, 0x6E, 0x34, 0xFF, 0xA3, 0x67, 0x2C, 0xFF, 0xA3, 0x66, 0x2C, 0xFF, 0xA6, 0x6A, + 0x2E, 0xFF, 0xA8, 0x6D, 0x2F, 0xFF, 0xAA, 0x6F, 0x2F, 0xFF, 0xAC, 0x72, 0x30, 0xFF, 0xAF, 0x74, + 0x31, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB2, 0x77, 0x32, 0xFF, 0xB3, 0x78, 0x32, 0xFF, 0xB4, 0x7A, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7D, 0x32, 0xFF, 0xB4, 0x7C, + 0x33, 0xFF, 0xB4, 0x7F, 0x3A, 0xFF, 0xB2, 0x83, 0x3F, 0xFF, 0xB3, 0x93, 0x63, 0xFF, 0xC2, 0xB3, + 0x9D, 0xFF, 0xD3, 0xD2, 0xCD, 0xFF, 0xD7, 0xD7, 0xD5, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD4, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD5, 0xD6, + 0xD4, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD9, 0xD9, 0xD8, 0xFF, 0xD1, 0xCE, 0xC3, 0xFF, 0xB1, 0x9F, + 0x7F, 0xFF, 0x9F, 0x89, 0x66, 0xFF, 0xA9, 0x98, 0x73, 0xFF, 0xB0, 0xA0, 0x80, 0xFF, 0xB7, 0xAA, + 0x8D, 0xFF, 0xC9, 0xC2, 0xAC, 0xFF, 0xBB, 0xAF, 0x96, 0xFF, 0xA9, 0x94, 0x73, 0xFF, 0xA1, 0x8B, + 0x69, 0xFF, 0xA6, 0x91, 0x70, 0xFF, 0xB2, 0xA5, 0x8B, 0xFF, 0xCC, 0xC7, 0xB9, 0xFF, 0xE4, 0xE2, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xE0, 0xDF, 0xDF, 0xFF, 0xDB, 0xDB, 0xD6, 0xFF, 0xBA, 0xB4, 0xA4, 0xFF, 0x9A, 0x8D, + 0x6F, 0xFF, 0x92, 0x82, 0x61, 0xFF, 0x9C, 0x8D, 0x6F, 0xFF, 0xC7, 0xC1, 0xB1, 0xFF, 0xDD, 0xDD, + 0xDA, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD9, 0xD7, 0xD5, 0xFF, 0xCD, 0xC5, + 0xB8, 0xFF, 0xA5, 0x92, 0x70, 0xFF, 0x8F, 0x72, 0x42, 0xFF, 0x8E, 0x6B, 0x34, 0xFF, 0x98, 0x6D, + 0x2F, 0xFF, 0xA1, 0x71, 0x2F, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB2, 0x7B, 0x33, 0xFF, 0xB5, 0x7C, + 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB6, 0x7B, 0x33, 0xFF, 0xB5, 0x7B, + 0x32, 0xFF, 0xB4, 0x7A, 0x32, 0xFF, 0xB3, 0x79, 0x32, 0xFF, 0xB5, 0x7C, 0x37, 0xFF, 0xB5, 0x7F, + 0x3C, 0xFF, 0xC6, 0x9E, 0x6B, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD7, 0xB8, 0x94, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC0, 0xA1, 0x15, 0xDA, 0xBD, 0x9D, 0x93, 0xBF, 0x93, + 0x62, 0xED, 0xAD, 0x76, 0x3E, 0xFF, 0xAA, 0x70, 0x38, 0xFF, 0xA8, 0x6C, 0x32, 0xFF, 0xA8, 0x6D, + 0x31, 0xFF, 0xAB, 0x6F, 0x30, 0xFF, 0xAC, 0x72, 0x31, 0xFF, 0xAF, 0x74, 0x32, 0xFF, 0xB0, 0x76, + 0x33, 0xFF, 0xB2, 0x78, 0x33, 0xFF, 0xB4, 0x79, 0x34, 0xFF, 0xB5, 0x7B, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7D, 0x34, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x80, 0x35, 0xFF, 0xB9, 0x81, 0x38, 0xFF, 0xBC, 0x86, + 0x40, 0xFF, 0xBE, 0x8B, 0x49, 0xFF, 0xBB, 0x8C, 0x4B, 0xFF, 0xB6, 0x8D, 0x50, 0xFF, 0xBA, 0x9A, + 0x6B, 0xFF, 0xCA, 0xBD, 0xAD, 0xFF, 0xD6, 0xD6, 0xD3, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD6, 0xD8, 0xD7, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD7, 0xD9, + 0xD8, 0xFF, 0xD8, 0xDA, 0xD9, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xC1, 0xB9, + 0xA5, 0xFF, 0x9F, 0x8A, 0x64, 0xFF, 0xA3, 0x91, 0x69, 0xFF, 0xC3, 0xB3, 0x98, 0xFF, 0xDE, 0xD6, + 0xC8, 0xFF, 0xE1, 0xE2, 0xE0, 0xFF, 0xD9, 0xD8, 0xD2, 0xFF, 0xB2, 0xA4, 0x84, 0xFF, 0x9C, 0x88, + 0x63, 0xFF, 0x98, 0x83, 0x5E, 0xFF, 0x95, 0x81, 0x59, 0xFF, 0xA8, 0x9A, 0x7E, 0xFF, 0xD4, 0xD1, + 0xCC, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xDF, 0xE0, 0xFF, 0xE1, 0xE0, 0xE2, 0xFF, 0xDE, 0xDD, 0xDA, 0xFF, 0xC1, 0xBD, + 0xAE, 0xFF, 0x9F, 0x94, 0x77, 0xFF, 0x97, 0x86, 0x65, 0xFF, 0x9D, 0x8D, 0x6D, 0xFF, 0xC1, 0xBB, + 0xAC, 0xFF, 0xDE, 0xDD, 0xDB, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDC, 0xDA, + 0xD9, 0xFF, 0xD3, 0xCD, 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x90, 0x77, 0x4B, 0xFF, 0x8F, 0x6C, + 0x37, 0xFF, 0x98, 0x6E, 0x31, 0xFF, 0xA4, 0x74, 0x33, 0xFF, 0xAE, 0x79, 0x35, 0xFF, 0xB4, 0x7D, + 0x35, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x34, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, + 0x35, 0xFF, 0xBA, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB8, 0x7D, 0x34, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7C, 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xB8, 0x80, 0x3E, 0xFF, 0xBB, 0x86, + 0x45, 0xFF, 0xC9, 0xA2, 0x72, 0xFF, 0xD6, 0xB7, 0x93, 0xE9, 0xD9, 0xBA, 0x96, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC2, 0xA4, 0x15, 0xDC, 0xBE, 0x9E, 0x8C, 0xC3, 0x9A, + 0x6C, 0xEB, 0xB5, 0x80, 0x48, 0xFF, 0xAE, 0x76, 0x3D, 0xFF, 0xAB, 0x70, 0x36, 0xFF, 0xAA, 0x70, + 0x33, 0xFF, 0xAD, 0x72, 0x32, 0xFF, 0xAE, 0x74, 0x34, 0xFF, 0xB0, 0x77, 0x35, 0xFF, 0xB3, 0x79, + 0x35, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB7, 0x7D, 0x36, 0xFF, 0xB7, 0x7E, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x80, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x8A, 0x46, 0xFF, 0xC3, 0x91, + 0x4F, 0xFF, 0xC2, 0x91, 0x52, 0xFF, 0xC1, 0x91, 0x52, 0xFF, 0xBD, 0x90, 0x52, 0xFF, 0xB7, 0x90, + 0x56, 0xFF, 0xBE, 0xA1, 0x7A, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, + 0xD9, 0xFF, 0xD8, 0xD9, 0xDA, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xCE, 0xCE, + 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x9E, 0x8C, 0x6B, 0xFF, 0xAF, 0x9F, 0x82, 0xFF, 0xDB, 0xD2, + 0xC5, 0xFF, 0xE5, 0xE1, 0xE1, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xCA, 0xC6, 0xB5, 0xFF, 0xA2, 0x93, + 0x6F, 0xFF, 0x99, 0x87, 0x5B, 0xFF, 0x8E, 0x7C, 0x55, 0xFF, 0xAA, 0x9D, 0x84, 0xFF, 0xD6, 0xD4, + 0xCE, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, + 0xDE, 0xFF, 0xC9, 0xC6, 0xBC, 0xFF, 0xA8, 0x9C, 0x81, 0xFF, 0x9A, 0x8A, 0x69, 0xFF, 0x99, 0x8B, + 0x6C, 0xFF, 0xBE, 0xB6, 0xA4, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xDD, 0xDC, 0xDC, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xDA, 0xD6, 0xCD, 0xFF, 0xBB, 0xAF, 0x98, 0xFF, 0x9A, 0x80, + 0x55, 0xFF, 0x95, 0x72, 0x3C, 0xFF, 0x9F, 0x75, 0x36, 0xFF, 0xA8, 0x78, 0x35, 0xFF, 0xB1, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x36, 0xFF, 0xB9, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB9, 0x7F, 0x36, 0xFF, 0xB8, 0x7F, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB7, 0x7E, 0x38, 0xFF, 0xB9, 0x83, 0x41, 0xFF, 0xBF, 0x8C, + 0x4B, 0xFF, 0xCC, 0xA7, 0x7B, 0xFF, 0xDA, 0xBB, 0x98, 0xE1, 0xDB, 0xBD, 0x9A, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC2, 0xA4, 0x11, 0xDF, 0xC1, 0xA1, 0x84, 0xC9, 0xA2, + 0x75, 0xE6, 0xB8, 0x85, 0x4F, 0xFF, 0xB2, 0x7B, 0x41, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAC, 0x72, + 0x34, 0xFF, 0xAF, 0x74, 0x34, 0xFF, 0xB0, 0x76, 0x35, 0xFF, 0xB3, 0x79, 0x36, 0xFF, 0xB4, 0x7B, + 0x37, 0xFF, 0xB6, 0x7D, 0x37, 0xFF, 0xB8, 0x7E, 0x38, 0xFF, 0xB9, 0x7F, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBD, 0x84, + 0x3A, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC2, 0x8D, 0x48, 0xFF, 0xC5, 0x93, 0x53, 0xFF, 0xC6, 0x95, + 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBC, 0x91, + 0x55, 0xFF, 0xBC, 0x94, 0x5E, 0xFF, 0xC2, 0xAA, 0x87, 0xFF, 0xD6, 0xCE, 0xC5, 0xFF, 0xDB, 0xDA, + 0xD8, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDC, 0xDC, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xD1, 0xD1, + 0xCC, 0xFF, 0xB4, 0xAA, 0x8E, 0xFF, 0xBD, 0xB1, 0x97, 0xFF, 0xA7, 0x98, 0x79, 0xFF, 0xC0, 0xB3, + 0x9D, 0xFF, 0xDB, 0xD6, 0xD0, 0xFF, 0xE4, 0xE4, 0xE6, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xB7, 0xAF, + 0x9E, 0xFF, 0x9D, 0x8F, 0x71, 0xFF, 0xA4, 0x9A, 0x83, 0xFF, 0xCC, 0xCB, 0xBF, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDD, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xD2, 0xD1, 0xCA, 0xFF, 0xAF, 0xA7, 0x8F, 0xFF, 0x9D, 0x8E, + 0x6E, 0xFF, 0x9B, 0x8C, 0x6C, 0xFF, 0xBA, 0xB3, 0xA2, 0xFF, 0xDD, 0xDC, 0xD6, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDE, 0xDB, 0xDD, 0xFF, 0xDB, 0xD7, 0xD1, 0xFF, 0xC3, 0xB8, + 0xA1, 0xFF, 0x9C, 0x84, 0x5B, 0xFF, 0x9B, 0x76, 0x3E, 0xFF, 0xA4, 0x77, 0x37, 0xFF, 0xAF, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x38, 0xFF, 0xBA, 0x82, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xB8, 0x80, 0x3B, 0xFF, 0xBC, 0x86, 0x44, 0xFF, 0xC1, 0x90, + 0x51, 0xFF, 0xD0, 0xAD, 0x82, 0xFF, 0xDB, 0xBD, 0x9A, 0xD1, 0xDD, 0xBF, 0x9D, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x10, 0xDE, 0xC2, 0xA2, 0x77, 0xCA, 0xA6, + 0x7B, 0xE4, 0xBA, 0x89, 0x52, 0xFF, 0xB4, 0x7E, 0x45, 0xFF, 0xB0, 0x76, 0x3B, 0xFF, 0xAF, 0x74, + 0x37, 0xFF, 0xB1, 0x76, 0x36, 0xFF, 0xB3, 0x78, 0x37, 0xFF, 0xB4, 0x7B, 0x38, 0xFF, 0xB6, 0x7D, + 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xB9, 0x80, 0x3A, 0xFF, 0xBA, 0x81, 0x3A, 0xFF, 0xBB, 0x82, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBF, 0x88, + 0x40, 0xFF, 0xC4, 0x8F, 0x4C, 0xFF, 0xC6, 0x95, 0x56, 0xFF, 0xC7, 0x97, 0x5A, 0xFF, 0xC7, 0x98, + 0x5A, 0xFF, 0xC7, 0x99, 0x5A, 0xFF, 0xC7, 0x98, 0x5A, 0xFF, 0xC6, 0x97, 0x5A, 0xFF, 0xC4, 0x96, + 0x59, 0xFF, 0xC0, 0x95, 0x5A, 0xFF, 0xBB, 0x98, 0x65, 0xFF, 0xC6, 0xB0, 0x95, 0xFF, 0xD9, 0xD3, + 0xCA, 0xFF, 0xE0, 0xDD, 0xDB, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xCD, 0xCB, + 0xC5, 0xFF, 0xB1, 0xAA, 0x91, 0xFF, 0xDE, 0xDB, 0xCE, 0xFF, 0xC5, 0xBC, 0xA5, 0xFF, 0xA7, 0x9B, + 0x7E, 0xFF, 0xBE, 0xB4, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD4, 0xD0, 0xC9, 0xFF, 0xD6, 0xD5, 0xCE, 0xFF, 0xDD, 0xDF, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xBC, 0xB6, + 0xA2, 0xFF, 0xA1, 0x94, 0x74, 0xFF, 0x9B, 0x90, 0x71, 0xFF, 0xB9, 0xB3, 0x9E, 0xFF, 0xDC, 0xD9, + 0xD3, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDF, 0xDD, 0xDE, 0xFF, 0xE1, 0xDD, + 0xD5, 0xFF, 0xC7, 0xBA, 0xA5, 0xFF, 0xA1, 0x84, 0x55, 0xFF, 0xA1, 0x77, 0x36, 0xFF, 0xAE, 0x7D, + 0x38, 0xFF, 0xB7, 0x81, 0x3B, 0xFF, 0xBB, 0x83, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x84, 0x3A, 0xFF, 0xBC, 0x83, + 0x3A, 0xFF, 0xBB, 0x83, 0x3A, 0xFF, 0xBA, 0x83, 0x3D, 0xFF, 0xBE, 0x89, 0x46, 0xFF, 0xC4, 0x93, + 0x55, 0xFF, 0xD2, 0xAF, 0x84, 0xFD, 0xDB, 0xBE, 0x9B, 0xC1, 0xDE, 0xC1, 0x9F, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x09, 0xDF, 0xC3, 0xA3, 0x68, 0xCE, 0xAA, + 0x80, 0xDE, 0xBD, 0x8C, 0x54, 0xFE, 0xB8, 0x82, 0x49, 0xFF, 0xB2, 0x79, 0x3D, 0xFF, 0xB0, 0x76, + 0x38, 0xFF, 0xB3, 0x78, 0x38, 0xFF, 0xB4, 0x7A, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xB7, 0x7F, + 0x3B, 0xFF, 0xB9, 0x81, 0x3B, 0xFF, 0xBA, 0x82, 0x3C, 0xFF, 0xBC, 0x83, 0x3C, 0xFF, 0xBD, 0x84, + 0x3C, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xC0, 0x8A, 0x42, 0xFF, 0xC5, 0x91, + 0x4D, 0xFF, 0xC7, 0x98, 0x59, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xCA, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, + 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xC8, 0x9A, + 0x5D, 0xFF, 0xC6, 0x99, 0x5E, 0xFF, 0xC0, 0x98, 0x5F, 0xFF, 0xBF, 0x9D, 0x6E, 0xFF, 0xCA, 0xB9, + 0x9E, 0xFF, 0xDD, 0xD8, 0xD2, 0xFF, 0xDF, 0xDE, 0xDE, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDD, 0xDF, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, + 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xC8, 0xC5, + 0xBD, 0xFF, 0xBC, 0xB5, 0x9F, 0xFF, 0xE6, 0xE4, 0xE1, 0xFF, 0xE0, 0xDD, 0xD4, 0xFF, 0xBC, 0xB4, + 0x9F, 0xFF, 0xAC, 0xA0, 0x81, 0xFF, 0xB9, 0xAD, 0x94, 0xFF, 0xDB, 0xD6, 0xCE, 0xFF, 0xE2, 0xE1, + 0xE1, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xC9, 0xC4, 0xB6, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0x99, 0x8E, 0x6E, 0xFF, 0xB9, 0xB3, + 0xA0, 0xFF, 0xDC, 0xDA, 0xD4, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xE2, 0xE0, + 0xDF, 0xFF, 0xDE, 0xD7, 0xCE, 0xFF, 0xB0, 0x99, 0x75, 0xFF, 0xA5, 0x7A, 0x3C, 0xFF, 0xB1, 0x7F, + 0x3D, 0xFF, 0xB8, 0x82, 0x3D, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x86, 0x3C, 0xFF, 0xBF, 0x86, + 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x84, 0x3C, 0xFF, 0xBC, 0x85, 0x3F, 0xFF, 0xC1, 0x8D, 0x4B, 0xFF, 0xC7, 0x98, + 0x5B, 0xFF, 0xD3, 0xB2, 0x88, 0xF9, 0xDC, 0xC0, 0x9D, 0xB2, 0xDF, 0xC4, 0xA3, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC5, 0xA6, 0x06, 0xDF, 0xC3, 0xA3, 0x55, 0xD1, 0xAD, + 0x83, 0xD8, 0xC0, 0x90, 0x58, 0xFF, 0xBB, 0x86, 0x4D, 0xFF, 0xB5, 0x7C, 0x41, 0xFF, 0xB3, 0x79, + 0x3B, 0xFF, 0xB5, 0x7A, 0x3A, 0xFF, 0xB6, 0x7C, 0x3B, 0xFF, 0xB7, 0x7F, 0x3C, 0xFF, 0xBA, 0x81, + 0x3D, 0xFF, 0xBB, 0x83, 0x3D, 0xFF, 0xBC, 0x84, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBE, 0x86, + 0x3E, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xBF, 0x88, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x8B, 0x42, 0xFF, 0xC5, 0x92, 0x4E, 0xFF, 0xCA, 0x9B, + 0x5C, 0xFF, 0xCA, 0x9D, 0x62, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCA, 0x9D, + 0x60, 0xFF, 0xCA, 0x9D, 0x61, 0xFF, 0xC8, 0x9C, 0x60, 0xFF, 0xC3, 0x9B, 0x63, 0xFF, 0xC0, 0xA2, + 0x74, 0xFF, 0xD0, 0xC0, 0xAB, 0xFF, 0xDF, 0xDC, 0xD6, 0xFF, 0xE4, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xC9, 0xC5, + 0xB9, 0xFF, 0xBE, 0xB8, 0xA1, 0xFF, 0xE4, 0xE4, 0xE0, 0xFF, 0xE8, 0xE5, 0xE4, 0xFF, 0xE0, 0xDE, + 0xD8, 0xFF, 0xBB, 0xB4, 0xA3, 0xFF, 0xA8, 0x9D, 0x7F, 0xFF, 0xB6, 0xAA, 0x92, 0xFF, 0xDA, 0xD6, + 0xCE, 0xFF, 0xE1, 0xE0, 0xE1, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE2, 0xE4, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xD2, 0xCE, 0xC4, 0xFF, 0xAD, 0xA3, 0x8A, 0xFF, 0x9A, 0x92, + 0x75, 0xFF, 0xB9, 0xB4, 0xA0, 0xFF, 0xDC, 0xD9, 0xD5, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE1, 0xE0, + 0xDE, 0xFF, 0xE1, 0xDC, 0xD7, 0xFF, 0xB8, 0xA5, 0x82, 0xFF, 0xA9, 0x7C, 0x3F, 0xFF, 0xB4, 0x82, + 0x40, 0xFF, 0xB9, 0x84, 0x3F, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC1, 0x88, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x88, 0x3E, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xBE, 0x88, 0x42, 0xFF, 0xC3, 0x91, 0x50, 0xFF, 0xC9, 0x9C, + 0x60, 0xFF, 0xD5, 0xB5, 0x8B, 0xF3, 0xDE, 0xC5, 0xA2, 0xA0, 0xE2, 0xC9, 0xA9, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC6, 0xA7, 0x05, 0xDE, 0xC2, 0xA2, 0x40, 0xD3, 0xAF, + 0x84, 0xCC, 0xC4, 0x95, 0x60, 0xFC, 0xBE, 0x8A, 0x52, 0xFF, 0xB8, 0x80, 0x44, 0xFF, 0xB5, 0x7C, + 0x3D, 0xFF, 0xB6, 0x7C, 0x3C, 0xFF, 0xB7, 0x7E, 0x3D, 0xFF, 0xBA, 0x81, 0x3E, 0xFF, 0xBB, 0x83, + 0x3F, 0xFF, 0xBD, 0x85, 0x3F, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xC0, 0x88, + 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, + 0x41, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC6, 0x92, 0x4C, 0xFF, 0xCA, 0x9B, 0x5B, 0xFF, 0xCC, 0xA0, + 0x64, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCD, 0xA0, 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCE, 0xA1, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xC9, 0x9E, 0x64, 0xFF, 0xC3, 0x9D, + 0x68, 0xFF, 0xC5, 0xA8, 0x7E, 0xFF, 0xD4, 0xC8, 0xB6, 0xFF, 0xE2, 0xE0, 0xDB, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE5, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xCE, 0xCA, + 0xBE, 0xFF, 0xBE, 0xB6, 0x9C, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE4, 0xE2, 0xE2, 0xFF, 0xE7, 0xE5, + 0xE5, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xBF, 0xB7, 0xA1, 0xFF, 0xB1, 0xA3, 0x85, 0xFF, 0xBE, 0xB4, + 0x9E, 0xFF, 0xDA, 0xD5, 0xCD, 0xFF, 0xDE, 0xDC, 0xDB, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDB, 0xDB, + 0xDA, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xDD, 0xD9, 0xD3, 0xFF, 0xB3, 0xAC, + 0x96, 0xFF, 0x9E, 0x94, 0x76, 0xFF, 0xBB, 0xB3, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE2, + 0xDE, 0xFF, 0xE4, 0xDF, 0xD9, 0xFF, 0xBC, 0xA7, 0x81, 0xFF, 0xAC, 0x7D, 0x40, 0xFF, 0xB7, 0x85, + 0x43, 0xFF, 0xBB, 0x86, 0x40, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC0, 0x89, 0x41, 0xFF, 0xBF, 0x8A, 0x44, 0xFF, 0xC7, 0x95, 0x57, 0xFF, 0xCB, 0x9F, + 0x66, 0xFF, 0xD7, 0xB8, 0x8F, 0xEB, 0xE2, 0xCA, 0xAA, 0x8B, 0xE5, 0xCD, 0xAF, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xAA, 0x04, 0xDF, 0xC2, 0x9E, 0x2E, 0xD4, 0xB1, + 0x88, 0xB6, 0xC6, 0x9A, 0x67, 0xFA, 0xC1, 0x8F, 0x57, 0xFF, 0xBA, 0x83, 0x48, 0xFF, 0xB7, 0x7F, + 0x40, 0xFF, 0xB8, 0x7F, 0x3E, 0xFF, 0xBA, 0x80, 0x3F, 0xFF, 0xBB, 0x83, 0x40, 0xFF, 0xBD, 0x85, + 0x41, 0xFF, 0xBE, 0x87, 0x41, 0xFF, 0xC0, 0x88, 0x42, 0xFF, 0xC1, 0x8A, 0x42, 0xFF, 0xC1, 0x8A, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8E, + 0x43, 0xFF, 0xC7, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x5B, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCE, 0xA2, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x67, 0xFF, 0xCF, 0xA3, 0x67, 0xFF, 0xCE, 0xA2, 0x67, 0xFF, 0xCC, 0xA1, 0x67, 0xFF, 0xC9, 0xA1, + 0x67, 0xFF, 0xC5, 0xA0, 0x6C, 0xFF, 0xC7, 0xAD, 0x85, 0xFF, 0xD9, 0xCF, 0xC1, 0xFF, 0xE4, 0xE3, + 0xDF, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE7, 0xE5, 0xE4, 0xFF, 0xD1, 0xCC, + 0xC4, 0xFF, 0xBA, 0xAC, 0x8F, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xD4, 0xCE, 0xBF, 0xFF, 0xDB, 0xD8, + 0xD6, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xDF, 0xDF, 0xD6, 0xFF, 0xC3, 0xB8, 0xA2, 0xFF, 0xB6, 0xAB, + 0x8E, 0xFF, 0xBE, 0xB3, 0x9B, 0xFF, 0xCB, 0xC1, 0xB2, 0xFF, 0xCC, 0xC6, 0xBA, 0xFF, 0xD0, 0xCE, + 0xC5, 0xFF, 0xDA, 0xDB, 0xD7, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE0, 0xDF, + 0xD9, 0xFF, 0xC1, 0xBB, 0xA9, 0xFF, 0xA6, 0x9C, 0x7F, 0xFF, 0xBD, 0xB4, 0x9D, 0xFF, 0xE1, 0xDC, + 0xD2, 0xFF, 0xE5, 0xDC, 0xD0, 0xFF, 0xB9, 0x9F, 0x74, 0xFF, 0xB1, 0x83, 0x43, 0xFF, 0xBB, 0x89, + 0x44, 0xFF, 0xBE, 0x8A, 0x43, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC3, 0x8B, 0x42, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC1, 0x8B, 0x43, 0xFF, 0xC1, 0x8D, 0x48, 0xFF, 0xCA, 0x99, 0x5C, 0xFF, 0xCE, 0xA4, + 0x6B, 0xFF, 0xDA, 0xBA, 0x93, 0xE1, 0xE5, 0xCF, 0xB2, 0x72, 0xE8, 0xD2, 0xB5, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD2, 0xB6, 0x04, 0xE6, 0xCC, 0xAF, 0x23, 0xD9, 0xB9, + 0x92, 0x9D, 0xCA, 0xA1, 0x6F, 0xF4, 0xC4, 0x94, 0x5D, 0xFF, 0xBC, 0x87, 0x4C, 0xFF, 0xB9, 0x81, + 0x43, 0xFF, 0xBA, 0x81, 0x41, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBD, 0x85, 0x42, 0xFF, 0xBE, 0x87, + 0x42, 0xFF, 0xC0, 0x89, 0x43, 0xFF, 0xC2, 0x8A, 0x44, 0xFF, 0xC3, 0x8B, 0x44, 0xFF, 0xC3, 0x8C, + 0x44, 0xFF, 0xC3, 0x8D, 0x44, 0xFF, 0xC4, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC5, 0x8E, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC6, 0x8F, 0x45, 0xFF, 0xC6, 0x90, + 0x48, 0xFF, 0xCA, 0x98, 0x56, 0xFF, 0xCF, 0xA2, 0x66, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA5, + 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA4, 0x6A, 0xFF, 0xCE, 0xA5, + 0x6A, 0xFF, 0xCB, 0xA3, 0x6B, 0xFF, 0xC6, 0xA3, 0x71, 0xFF, 0xCD, 0xB5, 0x91, 0xFF, 0xDD, 0xD7, + 0xCB, 0xFF, 0xE6, 0xE6, 0xE3, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE8, 0xE6, 0xFF, 0xCC, 0xC7, + 0xBE, 0xFF, 0xAF, 0x9F, 0x7F, 0xFF, 0xAD, 0x9A, 0x75, 0xFF, 0xB2, 0xA0, 0x7B, 0xFF, 0xBF, 0xB3, + 0x9B, 0xFF, 0xDF, 0xD9, 0xD0, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xD6, 0xD0, 0xC3, 0xFF, 0xBA, 0xAC, + 0x91, 0xFF, 0xB0, 0xA0, 0x7D, 0xFF, 0xB0, 0x9F, 0x77, 0xFF, 0xB5, 0xA5, 0x81, 0xFF, 0xC1, 0xB5, + 0x9D, 0xFF, 0xD8, 0xD3, 0xCA, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE5, 0xE3, 0xDE, 0xFF, 0xCE, 0xC8, 0xB7, 0xFF, 0xB9, 0xAD, 0x91, 0xFF, 0xC4, 0xBC, + 0xA3, 0xFF, 0xD9, 0xCA, 0xAD, 0xFF, 0xB6, 0x94, 0x5E, 0xFF, 0xB6, 0x86, 0x43, 0xFF, 0xBC, 0x8B, + 0x44, 0xFF, 0xC0, 0x8C, 0x44, 0xFF, 0xC3, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC4, 0x8E, 0x44, 0xFF, 0xC4, 0x8D, 0x44, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xC4, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x63, 0xFF, 0xD0, 0xA8, + 0x72, 0xFF, 0xDD, 0xBE, 0x98, 0xD5, 0xE8, 0xD2, 0xB7, 0x58, 0xEA, 0xD3, 0xB8, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE4, 0xD8, 0x02, 0xF9, 0xEE, 0xE1, 0x15, 0xE1, 0xC1, + 0x9D, 0x86, 0xCE, 0xA5, 0x74, 0xED, 0xC6, 0x98, 0x64, 0xFE, 0xBF, 0x8B, 0x51, 0xFF, 0xBB, 0x84, + 0x46, 0xFF, 0xBC, 0x84, 0x44, 0xFF, 0xBD, 0x85, 0x44, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC1, 0x8A, + 0x45, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC4, 0x8D, 0x46, 0xFF, 0xC4, 0x8E, + 0x47, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC6, 0x90, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x47, 0xFF, 0xC6, 0x91, 0x47, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC8, 0x96, + 0x51, 0xFF, 0xCF, 0xA2, 0x65, 0xFF, 0xD1, 0xA8, 0x6D, 0xFF, 0xD2, 0xA9, 0x6F, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xCF, 0xA7, 0x6E, 0xFF, 0xCB, 0xA5, 0x6E, 0xFF, 0xC8, 0xA7, 0x74, 0xFF, 0xCE, 0xBA, + 0x9A, 0xFF, 0xE0, 0xDB, 0xD3, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xEA, + 0xEA, 0xFF, 0xE7, 0xE9, 0xEA, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xCA, 0xC6, + 0xB6, 0xFF, 0x9F, 0x91, 0x6C, 0xFF, 0xA6, 0x95, 0x6A, 0xFF, 0xA9, 0x98, 0x6F, 0xFF, 0xAA, 0x9C, + 0x7D, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xB7, 0xAA, + 0x91, 0xFF, 0xA8, 0x96, 0x6F, 0xFF, 0xA7, 0x95, 0x6B, 0xFF, 0xAB, 0x98, 0x70, 0xFF, 0xB6, 0xA8, + 0x8B, 0xFF, 0xD6, 0xCF, 0xC6, 0xFF, 0xE1, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE7, 0xE5, 0xE1, 0xFF, 0xDC, 0xD6, 0xCD, 0xFF, 0xC7, 0xBD, + 0xA0, 0xFF, 0xC1, 0xA7, 0x7C, 0xFF, 0xB5, 0x8D, 0x52, 0xFF, 0xB6, 0x87, 0x43, 0xFF, 0xBE, 0x8D, + 0x45, 0xFF, 0xC3, 0x8F, 0x47, 0xFF, 0xC5, 0x90, 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x90, 0x47, 0xFF, 0xC5, 0x8F, + 0x46, 0xFF, 0xC5, 0x90, 0x48, 0xFF, 0xC7, 0x95, 0x51, 0xFF, 0xCE, 0xA1, 0x69, 0xFF, 0xD5, 0xAE, + 0x79, 0xFE, 0xE2, 0xC4, 0x9D, 0xBD, 0xEC, 0xD3, 0xB9, 0x3C, 0xE9, 0xD3, 0xB9, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE9, 0xD8, 0x0E, 0xD9, 0xB8, + 0x8E, 0x65, 0xD0, 0xA8, 0x77, 0xE0, 0xCA, 0x9E, 0x6A, 0xFE, 0xC3, 0x8F, 0x57, 0xFF, 0xBE, 0x87, + 0x49, 0xFF, 0xBF, 0x86, 0x46, 0xFF, 0xBF, 0x87, 0x46, 0xFF, 0xC1, 0x8A, 0x46, 0xFF, 0xC2, 0x8C, + 0x47, 0xFF, 0xC4, 0x8E, 0x48, 0xFF, 0xC5, 0x8E, 0x48, 0xFF, 0xC5, 0x8F, 0x48, 0xFF, 0xC6, 0x90, + 0x49, 0xFF, 0xC7, 0x92, 0x49, 0xFF, 0xC8, 0x92, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x49, 0xFF, 0xC9, 0x93, 0x49, 0xFF, 0xC8, 0x93, 0x49, 0xFF, 0xC9, 0x95, 0x4E, 0xFF, 0xCD, 0x9F, + 0x5D, 0xFF, 0xD2, 0xA8, 0x6D, 0xFF, 0xD3, 0xAB, 0x72, 0xFF, 0xD4, 0xAB, 0x72, 0xFF, 0xD3, 0xAB, + 0x71, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, + 0x71, 0xFF, 0xD2, 0xAA, 0x71, 0xFF, 0xCF, 0xA9, 0x70, 0xFF, 0xCD, 0xA7, 0x71, 0xFF, 0xCB, 0xAB, + 0x7B, 0xFF, 0xD3, 0xC1, 0xA7, 0xFF, 0xE3, 0xE0, 0xDA, 0xFF, 0xE9, 0xEA, 0xE8, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEA, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xD1, 0xD0, + 0xC4, 0xFF, 0xA4, 0x9A, 0x7A, 0xFF, 0xA3, 0x95, 0x6F, 0xFF, 0xA4, 0x94, 0x73, 0xFF, 0xB4, 0xAA, + 0x96, 0xFF, 0xDC, 0xDA, 0xD2, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xDC, 0xDC, 0xD8, 0xFF, 0xBD, 0xB9, + 0xA7, 0xFF, 0xA3, 0x94, 0x71, 0xFF, 0xA3, 0x8F, 0x6A, 0xFF, 0xA6, 0x95, 0x6E, 0xFF, 0xA9, 0x9D, + 0x7C, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xEA, 0xFF, 0xE7, 0xE8, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xE1, 0xDF, 0xD9, 0xFF, 0xC5, 0xB9, + 0x9C, 0xFF, 0xB6, 0x99, 0x66, 0xFF, 0xB3, 0x8E, 0x53, 0xFF, 0xB5, 0x89, 0x44, 0xFF, 0xBE, 0x8E, + 0x47, 0xFF, 0xC3, 0x90, 0x49, 0xFF, 0xC5, 0x92, 0x49, 0xFF, 0xC7, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC7, 0x93, 0x49, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC7, 0x92, + 0x49, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x99, 0x57, 0xFF, 0xD2, 0xA7, 0x70, 0xFF, 0xD9, 0xB3, + 0x80, 0xF8, 0xDF, 0xC4, 0x9F, 0xA2, 0xE4, 0xCE, 0xB5, 0x2C, 0xE1, 0xD0, 0xB8, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC0, 0x9A, 0x05, 0xD9, 0xB8, + 0x8B, 0x47, 0xD6, 0xB0, 0x82, 0xD0, 0xCE, 0xA4, 0x70, 0xFD, 0xC7, 0x95, 0x5D, 0xFF, 0xC2, 0x8C, + 0x4F, 0xFF, 0xC2, 0x8A, 0x4A, 0xFF, 0xC1, 0x8A, 0x48, 0xFF, 0xC3, 0x8C, 0x48, 0xFF, 0xC4, 0x8E, + 0x49, 0xFF, 0xC5, 0x90, 0x4A, 0xFF, 0xC6, 0x91, 0x4B, 0xFF, 0xC7, 0x92, 0x4B, 0xFF, 0xC8, 0x93, + 0x4B, 0xFF, 0xC9, 0x94, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x95, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4D, 0xFF, 0xCD, 0x9C, 0x57, 0xFF, 0xD3, 0xA8, + 0x6B, 0xFF, 0xD5, 0xAD, 0x74, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, + 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD3, 0xAD, 0x74, 0xFF, 0xD1, 0xAA, 0x74, 0xFF, 0xCD, 0xAA, + 0x76, 0xFF, 0xCE, 0xAF, 0x82, 0xFF, 0xD7, 0xC7, 0xB1, 0xFF, 0xE6, 0xE4, 0xDF, 0xFF, 0xEC, 0xEC, + 0xEA, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xEC, 0xFF, 0xE6, 0xE7, + 0xE5, 0xFF, 0xC9, 0xC5, 0xB6, 0xFF, 0xBC, 0xB3, 0x9D, 0xFF, 0xC4, 0xBC, 0xAC, 0xFF, 0xDD, 0xDB, + 0xD0, 0xFF, 0xE3, 0xE4, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD5, 0xD5, + 0xCC, 0xFF, 0xB9, 0xB3, 0x9D, 0xFF, 0xB1, 0xA5, 0x87, 0xFF, 0xAF, 0xA2, 0x81, 0xFF, 0xA5, 0x9B, + 0x7B, 0xFF, 0xD3, 0xCF, 0xC6, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE7, 0xE8, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xD4, 0xD1, 0xC2, 0xFF, 0xBB, 0xAE, + 0x8A, 0xFF, 0xBC, 0xA6, 0x7A, 0xFF, 0xB3, 0x94, 0x5E, 0xFF, 0xB2, 0x89, 0x49, 0xFF, 0xBA, 0x8D, + 0x47, 0xFF, 0xC1, 0x91, 0x49, 0xFF, 0xC4, 0x92, 0x4A, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x95, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xC9, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4B, 0xFF, 0xC9, 0x94, + 0x4C, 0xFF, 0xCA, 0x96, 0x50, 0xFF, 0xCC, 0x9E, 0x5D, 0xFF, 0xD5, 0xAD, 0x77, 0xFF, 0xDC, 0xB8, + 0x86, 0xEE, 0xD7, 0xBC, 0x9A, 0x86, 0xC6, 0xBC, 0xAF, 0x1C, 0xD3, 0xC8, 0xB9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xB6, 0x8C, 0x02, 0xDE, 0xBF, + 0x97, 0x2C, 0xDC, 0xB9, 0x90, 0xB4, 0xD3, 0xAA, 0x77, 0xF6, 0xCC, 0x9C, 0x63, 0xFF, 0xC6, 0x91, + 0x55, 0xFF, 0xC4, 0x8C, 0x4D, 0xFF, 0xC3, 0x8C, 0x4A, 0xFF, 0xC5, 0x8D, 0x4A, 0xFF, 0xC5, 0x8F, + 0x4B, 0xFF, 0xC7, 0x92, 0x4C, 0xFF, 0xC8, 0x93, 0x4D, 0xFF, 0xC9, 0x94, 0x4D, 0xFF, 0xCA, 0x95, + 0x4D, 0xFF, 0xCB, 0x96, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x98, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x99, 0x51, 0xFF, 0xD2, 0xA3, 0x62, 0xFF, 0xD6, 0xAE, + 0x75, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x77, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xAF, 0x78, 0xFF, 0xD5, 0xAE, 0x77, 0xFF, 0xD1, 0xAD, + 0x77, 0xFF, 0xD1, 0xAD, 0x7B, 0xFF, 0xD3, 0xB5, 0x89, 0xFF, 0xDB, 0xCE, 0xBC, 0xFF, 0xE9, 0xE8, + 0xE4, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEA, 0xE8, 0xE7, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE7, 0xE8, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xDD, 0xDC, 0xD8, 0xFF, 0xD4, 0xD3, 0xCD, 0xFF, 0xCF, 0xCC, 0xC2, 0xFF, 0xBD, 0xBA, + 0xA9, 0xFF, 0xD7, 0xD7, 0xD1, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xCD, 0xC7, 0xB7, 0xFF, 0xB3, 0xA7, + 0x88, 0xFF, 0xC5, 0xB3, 0x8F, 0xFF, 0xC2, 0xAA, 0x7C, 0xFF, 0xB4, 0x91, 0x5A, 0xFF, 0xB5, 0x8D, + 0x4D, 0xFF, 0xBB, 0x8F, 0x4A, 0xFF, 0xC1, 0x92, 0x4B, 0xFF, 0xC5, 0x93, 0x4C, 0xFF, 0xC8, 0x96, + 0x4D, 0xFF, 0xCA, 0x97, 0x4D, 0xFF, 0xCB, 0x97, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x96, + 0x4F, 0xFF, 0xCC, 0x9A, 0x55, 0xFF, 0xCF, 0xA3, 0x64, 0xFF, 0xDA, 0xB2, 0x7F, 0xFD, 0xE0, 0xBE, + 0x8F, 0xDE, 0xDE, 0xC2, 0x9C, 0x64, 0xC3, 0xB6, 0xA5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC9, + 0xA5, 0x1A, 0xE1, 0xC1, 0x9B, 0x8E, 0xD5, 0xAF, 0x7D, 0xEA, 0xCE, 0xA2, 0x6A, 0xFF, 0xCA, 0x97, + 0x5C, 0xFF, 0xC6, 0x90, 0x51, 0xFF, 0xC5, 0x8E, 0x4D, 0xFF, 0xC7, 0x90, 0x4D, 0xFF, 0xC8, 0x92, + 0x4D, 0xFF, 0xC9, 0x94, 0x4F, 0xFF, 0xCA, 0x95, 0x4F, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xCC, 0x97, + 0x4F, 0xFF, 0xCD, 0x98, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, + 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x4F, 0xFF, 0xCE, 0x9A, + 0x4F, 0xFF, 0xCF, 0x9B, 0x51, 0xFF, 0xCF, 0x9F, 0x57, 0xFF, 0xD6, 0xAB, 0x6F, 0xFF, 0xD9, 0xB2, + 0x7A, 0xFF, 0xDA, 0xB3, 0x7C, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB2, 0x7B, 0xFF, 0xD9, 0xB2, 0x7B, 0xFF, 0xD6, 0xB1, + 0x7A, 0xFF, 0xD3, 0xAF, 0x7B, 0xFF, 0xD0, 0xAF, 0x7E, 0xFF, 0xD1, 0xB7, 0x8E, 0xFF, 0xDA, 0xD2, + 0xC1, 0xFF, 0xEC, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEF, 0xEE, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE2, 0xE1, 0xFF, 0xDD, 0xDE, + 0xDA, 0xFF, 0xE1, 0xE4, 0xE2, 0xFF, 0xE5, 0xE6, 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF0, 0xEC, 0xFF, 0xD6, 0xD3, 0xC5, 0xFF, 0xB5, 0xAC, + 0x91, 0xFF, 0xC5, 0xB9, 0x9B, 0xFF, 0xCE, 0xC0, 0x9F, 0xFF, 0xBF, 0xA9, 0x81, 0xFF, 0xB3, 0x92, + 0x5B, 0xFF, 0xB3, 0x8D, 0x4E, 0xFF, 0xB8, 0x8F, 0x4B, 0xFF, 0xBF, 0x92, 0x4D, 0xFF, 0xC5, 0x95, + 0x4E, 0xFF, 0xC9, 0x98, 0x4F, 0xFF, 0xCB, 0x99, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCD, 0x99, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCE, 0x99, 0x50, 0xFF, 0xCC, 0x99, + 0x52, 0xFF, 0xCF, 0x9F, 0x5A, 0xFF, 0xD4, 0xA9, 0x6C, 0xFF, 0xDD, 0xB8, 0x88, 0xFC, 0xE0, 0xC1, + 0x98, 0xCA, 0xDE, 0xC3, 0x9F, 0x43, 0xDE, 0xC2, 0x9F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xCC, + 0xA9, 0x0E, 0xE2, 0xC3, 0x9D, 0x64, 0xD8, 0xB4, 0x83, 0xD9, 0xD2, 0xA8, 0x71, 0xFF, 0xCE, 0x9D, + 0x62, 0xFE, 0xC8, 0x94, 0x55, 0xFF, 0xC7, 0x91, 0x4F, 0xFF, 0xC9, 0x92, 0x4E, 0xFF, 0xC9, 0x93, + 0x4F, 0xFF, 0xCB, 0x96, 0x50, 0xFF, 0xCB, 0x97, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCE, 0x99, + 0x51, 0xFF, 0xCF, 0x9A, 0x51, 0xFF, 0xCF, 0x9B, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xCF, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD1, 0x9D, 0x54, 0xFF, 0xD2, 0xA4, 0x5E, 0xFF, 0xD9, 0xB1, 0x77, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDC, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDA, 0xB4, + 0x7E, 0xFF, 0xD8, 0xB3, 0x7D, 0xFF, 0xD4, 0xB2, 0x7D, 0xFF, 0xD4, 0xB3, 0x82, 0xFF, 0xD6, 0xBC, + 0x93, 0xFF, 0xE1, 0xD6, 0xC8, 0xFF, 0xED, 0xED, 0xE9, 0xFF, 0xEE, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xED, 0xEC, 0xE9, 0xFF, 0xD3, 0xCF, + 0xBF, 0xFF, 0xBF, 0xB7, 0x9F, 0xFF, 0xC9, 0xBF, 0xA5, 0xFF, 0xD1, 0xC5, 0xA9, 0xFF, 0xC1, 0xB0, + 0x8A, 0xFF, 0xB2, 0x96, 0x62, 0xFF, 0xB0, 0x8C, 0x51, 0xFF, 0xB8, 0x90, 0x4F, 0xFF, 0xC1, 0x95, + 0x4F, 0xFF, 0xC8, 0x98, 0x50, 0xFF, 0xCB, 0x9A, 0x51, 0xFF, 0xCE, 0x9B, 0x52, 0xFF, 0xCF, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD0, 0x9B, + 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xCF, 0x9B, 0x53, 0xFF, 0xCF, 0x9C, + 0x56, 0xFF, 0xD2, 0xA3, 0x61, 0xFF, 0xD8, 0xAF, 0x75, 0xFF, 0xDD, 0xBB, 0x8E, 0xF9, 0xDE, 0xC1, + 0x9B, 0xA4, 0xDC, 0xC2, 0xA1, 0x29, 0xDB, 0xC3, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xC7, + 0xA1, 0x05, 0xE0, 0xBF, 0x97, 0x3F, 0xD9, 0xB8, 0x8A, 0xBE, 0xD6, 0xAD, 0x78, 0xFD, 0xD1, 0xA2, + 0x68, 0xFE, 0xCC, 0x98, 0x5B, 0xFF, 0xC9, 0x94, 0x53, 0xFF, 0xCA, 0x94, 0x51, 0xFF, 0xCB, 0x96, + 0x51, 0xFF, 0xCC, 0x97, 0x51, 0xFF, 0xCD, 0x99, 0x52, 0xFF, 0xCE, 0x9A, 0x53, 0xFF, 0xCF, 0x9B, + 0x53, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x54, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD1, 0x9F, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x53, 0xFF, 0xD3, 0xA1, 0x57, 0xFF, 0xD6, 0xAC, 0x69, 0xFF, 0xDC, 0xB6, 0x7E, 0xFF, 0xDC, 0xB8, + 0x82, 0xFF, 0xDD, 0xB8, 0x82, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB7, + 0x81, 0xFF, 0xDC, 0xB7, 0x81, 0xFF, 0xD9, 0xB6, 0x80, 0xFF, 0xD6, 0xB4, 0x80, 0xFF, 0xD3, 0xB4, + 0x85, 0xFF, 0xD6, 0xBE, 0x9B, 0xFF, 0xE2, 0xDB, 0xCF, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xEA, 0xEA, + 0xE8, 0xFF, 0xEB, 0xEC, 0xEA, 0xFF, 0xEC, 0xEE, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xF1, 0xF1, + 0xEE, 0xFF, 0xE3, 0xE0, 0xD5, 0xFF, 0xC5, 0xC0, 0xAB, 0xFF, 0xCD, 0xC6, 0xAF, 0xFF, 0xD8, 0xCF, + 0xB8, 0xFF, 0xCC, 0xBE, 0xA0, 0xFF, 0xB8, 0x9D, 0x6D, 0xFF, 0xB5, 0x91, 0x58, 0xFF, 0xBD, 0x94, + 0x53, 0xFF, 0xC4, 0x98, 0x51, 0xFF, 0xCB, 0x9B, 0x53, 0xFF, 0xCE, 0x9D, 0x54, 0xFF, 0xD0, 0x9E, + 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD1, 0x9D, 0x53, 0xFF, 0xD1, 0x9E, 0x55, 0xFF, 0xD2, 0xA0, + 0x5B, 0xFF, 0xD6, 0xA8, 0x69, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDF, 0xC0, 0x94, 0xE9, 0xD9, 0xC0, + 0x9F, 0x77, 0xD9, 0xC2, 0xA2, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE0, + 0xCB, 0x02, 0xF1, 0xDF, 0xC4, 0x23, 0xE0, 0xC2, 0x98, 0x95, 0xD6, 0xB0, 0x7C, 0xF2, 0xD4, 0xA7, + 0x6E, 0xFF, 0xD0, 0x9D, 0x60, 0xFF, 0xCB, 0x97, 0x56, 0xFF, 0xCC, 0x96, 0x53, 0xFF, 0xCC, 0x98, + 0x53, 0xFF, 0xCE, 0x99, 0x53, 0xFF, 0xCE, 0x9B, 0x53, 0xFF, 0xD0, 0x9C, 0x54, 0xFF, 0xD1, 0x9D, + 0x55, 0xFF, 0xD2, 0x9E, 0x56, 0xFF, 0xD2, 0x9F, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, + 0x56, 0xFF, 0xD5, 0xA4, 0x5C, 0xFF, 0xDA, 0xB1, 0x73, 0xFF, 0xDE, 0xB9, 0x83, 0xFF, 0xDE, 0xBB, + 0x85, 0xFF, 0xDE, 0xBB, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDB, 0xB8, 0x83, 0xFF, 0xD7, 0xB7, + 0x83, 0xFF, 0xDA, 0xB9, 0x8B, 0xFF, 0xDB, 0xC4, 0xA0, 0xFF, 0xE7, 0xE0, 0xD6, 0xFF, 0xEE, 0xEE, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, 0xE2, 0xFF, 0xE3, 0xE3, 0xDF, 0xFF, 0xE9, 0xEA, + 0xE7, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF3, 0xF2, 0xF1, 0xFF, 0xE4, 0xE2, 0xD8, 0xFF, 0xC9, 0xC5, 0xB4, 0xFF, 0xD1, 0xCA, + 0xB9, 0xFF, 0xD9, 0xD2, 0xBD, 0xFF, 0xD3, 0xC7, 0xAB, 0xFF, 0xBA, 0xA1, 0x74, 0xFF, 0xB7, 0x92, + 0x58, 0xFF, 0xC1, 0x97, 0x53, 0xFF, 0xCA, 0x9C, 0x53, 0xFF, 0xCF, 0x9F, 0x55, 0xFF, 0xD1, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0x9F, + 0x55, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xD2, 0xA0, 0x56, 0xFF, 0xD3, 0xA1, 0x59, 0xFF, 0xD3, 0xA4, + 0x61, 0xFF, 0xDA, 0xAF, 0x74, 0xFF, 0xE3, 0xBC, 0x86, 0xFC, 0xDE, 0xC3, 0x9A, 0xCE, 0xD7, 0xC1, + 0xA5, 0x50, 0xD7, 0xC2, 0xA5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x0B, 0xE9, 0xCE, 0xA9, 0x67, 0xD6, 0xB1, 0x7C, 0xDC, 0xD8, 0xAE, + 0x7A, 0xFF, 0xD3, 0xA3, 0x68, 0xFF, 0xCE, 0x9A, 0x5B, 0xFF, 0xCF, 0x9A, 0x57, 0xFF, 0xCE, 0x9A, + 0x55, 0xFF, 0xD0, 0x9B, 0x55, 0xFF, 0xD1, 0x9D, 0x56, 0xFF, 0xD2, 0x9E, 0x57, 0xFF, 0xD2, 0xA0, + 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA3, + 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, + 0x59, 0xFF, 0xD8, 0xA7, 0x61, 0xFF, 0xDD, 0xB6, 0x7B, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x88, 0xFF, 0xE0, 0xBD, 0x88, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x86, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xE0, 0xBC, 0x86, 0xFF, 0xDF, 0xBC, 0x87, 0xFF, 0xDC, 0xBA, + 0x85, 0xFF, 0xDA, 0xB9, 0x86, 0xFF, 0xD8, 0xBB, 0x8E, 0xFF, 0xDB, 0xC7, 0xA8, 0xFF, 0xE6, 0xE1, + 0xD7, 0xFF, 0xF2, 0xEF, 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, + 0xEB, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE2, 0xE3, 0xDD, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xEA, 0xE8, 0xE2, 0xFF, 0xD6, 0xD0, + 0xC2, 0xFF, 0xD3, 0xCC, 0xBA, 0xFF, 0xDE, 0xD7, 0xC3, 0xFF, 0xD7, 0xCA, 0xAF, 0xFF, 0xBC, 0xA0, + 0x6E, 0xFF, 0xBE, 0x97, 0x54, 0xFF, 0xC9, 0x9C, 0x55, 0xFF, 0xCF, 0xA0, 0x58, 0xFF, 0xD2, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD5, 0xA4, 0x5D, 0xFF, 0xD7, 0xAA, + 0x69, 0xFF, 0xDE, 0xB6, 0x7E, 0xFF, 0xE7, 0xC1, 0x8B, 0xF5, 0xE0, 0xC5, 0xA1, 0xA7, 0xD5, 0xC3, + 0xAE, 0x2C, 0xD5, 0xC3, 0xAC, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xFA, 0xFE, 0x02, 0xE5, 0xCA, 0x9F, 0x39, 0xD9, 0xB5, 0x80, 0xB8, 0xDA, 0xB3, + 0x80, 0xF8, 0xD8, 0xAA, 0x72, 0xFF, 0xD2, 0x9F, 0x61, 0xFF, 0xD1, 0x9C, 0x5A, 0xFF, 0xD0, 0x9C, + 0x57, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD2, 0x9F, 0x58, 0xFF, 0xD4, 0xA0, 0x59, 0xFF, 0xD4, 0xA1, + 0x5A, 0xFF, 0xD4, 0xA2, 0x5A, 0xFF, 0xD5, 0xA3, 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, + 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, + 0x5C, 0xFF, 0xDA, 0xAB, 0x67, 0xFF, 0xDF, 0xBA, 0x82, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8B, 0xFF, 0xE1, 0xBF, 0x8B, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBE, 0x89, 0xFF, 0xE1, 0xBE, + 0x89, 0xFF, 0xDF, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8A, 0xFF, 0xD9, 0xBE, 0x91, 0xFF, 0xDC, 0xCC, + 0xAD, 0xFF, 0xEA, 0xE4, 0xDC, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE0, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE8, 0xE7, + 0xE1, 0xFF, 0xDC, 0xDA, 0xD1, 0xFF, 0xE4, 0xE1, 0xD7, 0xFF, 0xEA, 0xE1, 0xD3, 0xFF, 0xC8, 0xB1, + 0x8A, 0xFF, 0xC1, 0x9A, 0x57, 0xFF, 0xCA, 0x9F, 0x59, 0xFF, 0xD0, 0xA1, 0x5A, 0xFF, 0xD4, 0xA3, + 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, + 0x59, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xD6, 0xA7, 0x62, 0xFF, 0xD9, 0xAF, + 0x70, 0xFF, 0xE2, 0xBB, 0x86, 0xFE, 0xE8, 0xC7, 0x93, 0xE3, 0xE0, 0xC6, 0xA5, 0x75, 0xDA, 0xC5, + 0xAD, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC5, 0x96, 0x19, 0xE4, 0xC2, 0x91, 0x8C, 0xDC, 0xB6, + 0x83, 0xE5, 0xDB, 0xB0, 0x79, 0xFF, 0xD6, 0xA6, 0x69, 0xFF, 0xD3, 0xA0, 0x5F, 0xFF, 0xD2, 0x9F, + 0x5B, 0xFF, 0xD3, 0x9F, 0x5A, 0xFF, 0xD4, 0xA0, 0x5B, 0xFF, 0xD5, 0xA2, 0x5B, 0xFF, 0xD5, 0xA3, + 0x5C, 0xFF, 0xD6, 0xA4, 0x5D, 0xFF, 0xD7, 0xA5, 0x5D, 0xFF, 0xD8, 0xA6, 0x5D, 0xFF, 0xD8, 0xA7, + 0x5D, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDC, 0xB0, 0x6C, 0xFF, 0xE1, 0xBE, 0x87, 0xFF, 0xE3, 0xC2, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE2, 0xC0, + 0x8D, 0xFF, 0xE2, 0xC0, 0x8D, 0xFF, 0xDF, 0xBF, 0x8D, 0xFF, 0xDB, 0xBE, 0x8D, 0xFF, 0xD8, 0xC1, + 0x95, 0xFF, 0xDF, 0xCF, 0xB4, 0xFF, 0xE9, 0xE5, 0xDE, 0xFF, 0xF3, 0xF1, 0xEF, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xE6, 0xE7, 0xE2, 0xFF, 0xE5, 0xE6, + 0xE1, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xED, 0xED, + 0xEA, 0xFF, 0xEA, 0xE9, 0xE4, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xEC, 0xEB, 0xE8, 0xFF, 0xEA, 0xE7, 0xE0, 0xFF, 0xEA, 0xE1, 0xD4, 0xFF, 0xCA, 0xB3, + 0x88, 0xFF, 0xC5, 0x9E, 0x5B, 0xFF, 0xCD, 0xA1, 0x5B, 0xFF, 0xD3, 0xA4, 0x5D, 0xFF, 0xD6, 0xA6, + 0x5D, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA7, 0x5C, 0xFF, 0xD8, 0xA7, + 0x5C, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD8, 0xA8, 0x60, 0xFF, 0xD8, 0xAC, 0x68, 0xFF, 0xDC, 0xB5, + 0x77, 0xFF, 0xE3, 0xC1, 0x8E, 0xFB, 0xE6, 0xCB, 0x9E, 0xC5, 0xE3, 0xCB, 0xA8, 0x42, 0xE1, 0xC7, + 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xD7, 0xB8, 0x09, 0xEC, 0xD1, 0xB0, 0x58, 0xE0, 0xBD, + 0x8D, 0xC3, 0xDE, 0xB5, 0x7F, 0xFD, 0xDB, 0xAE, 0x73, 0xFF, 0xD5, 0xA4, 0x65, 0xFF, 0xD3, 0xA1, + 0x5E, 0xFF, 0xD5, 0xA1, 0x5D, 0xFF, 0xD5, 0xA2, 0x5C, 0xFF, 0xD6, 0xA3, 0x5D, 0xFF, 0xD7, 0xA5, + 0x5E, 0xFF, 0xD8, 0xA6, 0x5E, 0xFF, 0xD8, 0xA7, 0x5F, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDA, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xAA, + 0x61, 0xFF, 0xDE, 0xB4, 0x72, 0xFF, 0xE3, 0xC1, 0x8C, 0xFF, 0xE6, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE4, 0xC3, 0x90, 0xFF, 0xE3, 0xC3, 0x90, 0xFF, 0xE1, 0xC1, 0x90, 0xFF, 0xDB, 0xC0, + 0x90, 0xFF, 0xDD, 0xC3, 0x99, 0xFF, 0xE1, 0xD2, 0xB7, 0xFF, 0xED, 0xE8, 0xE0, 0xFF, 0xF3, 0xF3, + 0xF1, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xF0, 0xF1, + 0xEF, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xEF, 0xFF, 0xE1, 0xDF, + 0xCD, 0xFF, 0xC8, 0xC3, 0xB0, 0xFF, 0xE6, 0xE5, 0xDB, 0xFF, 0xF2, 0xF1, 0xED, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xEF, 0xEC, 0xE5, 0xFF, 0xE4, 0xD6, 0xC1, 0xFF, 0xC6, 0xA9, + 0x75, 0xFF, 0xCA, 0xA1, 0x5C, 0xFF, 0xD1, 0xA5, 0x5E, 0xFF, 0xD5, 0xA6, 0x5F, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, + 0x5E, 0xFF, 0xDA, 0xA9, 0x60, 0xFF, 0xDA, 0xAB, 0x64, 0xFF, 0xDE, 0xB2, 0x73, 0xFF, 0xE2, 0xBD, + 0x87, 0xFE, 0xE7, 0xC5, 0x97, 0xF1, 0xE9, 0xCD, 0xA4, 0x8F, 0xE8, 0xCE, 0xA8, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xDE, 0xC9, 0x01, 0xE9, 0xD4, 0xBA, 0x28, 0xE5, 0xC3, + 0x94, 0x99, 0xE0, 0xBA, 0x86, 0xF0, 0xDE, 0xB4, 0x7B, 0xFF, 0xD9, 0xAA, 0x6E, 0xFF, 0xD6, 0xA5, + 0x63, 0xFF, 0xD7, 0xA4, 0x60, 0xFF, 0xD7, 0xA4, 0x5F, 0xFF, 0xD8, 0xA5, 0x5F, 0xFF, 0xD8, 0xA7, + 0x60, 0xFF, 0xD9, 0xA9, 0x61, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDA, 0xAB, + 0x61, 0xFF, 0xDB, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDB, 0xAC, + 0x63, 0xFF, 0xDF, 0xB6, 0x76, 0xFF, 0xE5, 0xC4, 0x91, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE5, 0xC5, 0x93, 0xFF, 0xE5, 0xC5, 0x94, 0xFF, 0xE2, 0xC3, + 0x92, 0xFF, 0xDE, 0xC2, 0x92, 0xFF, 0xDC, 0xC6, 0x9C, 0xFF, 0xE4, 0xD3, 0xBA, 0xFF, 0xEC, 0xE9, + 0xE0, 0xFF, 0xF5, 0xF4, 0xF1, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF5, + 0xF5, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xED, 0xEE, 0xEA, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF1, 0xFF, 0xE5, 0xE3, 0xD7, 0xFF, 0xBA, 0xB4, + 0x9D, 0xFF, 0xC6, 0xC2, 0xAF, 0xFF, 0xEF, 0xEE, 0xE6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF2, 0xF1, 0xF0, 0xFF, 0xF0, 0xE7, 0xDB, 0xFF, 0xD3, 0xBE, 0x96, 0xFF, 0xC6, 0xA3, + 0x67, 0xFF, 0xCF, 0xA5, 0x60, 0xFF, 0xD5, 0xA9, 0x62, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDB, 0xAA, + 0x61, 0xFF, 0xDC, 0xAA, 0x60, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDB, 0xAB, + 0x61, 0xFF, 0xDB, 0xAC, 0x65, 0xFF, 0xDD, 0xAF, 0x6C, 0xFF, 0xE2, 0xBA, 0x80, 0xFF, 0xE7, 0xC5, + 0x92, 0xFE, 0xEE, 0xCA, 0x9D, 0xD3, 0xF1, 0xCF, 0xA5, 0x55, 0xE9, 0xD3, 0xA4, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xCC, 0xAE, 0x0E, 0xE3, 0xC3, + 0x96, 0x5C, 0xE2, 0xBE, 0x8C, 0xD2, 0xE1, 0xB9, 0x83, 0xFE, 0xDD, 0xB1, 0x76, 0xFF, 0xD9, 0xA9, + 0x68, 0xFF, 0xD9, 0xA7, 0x62, 0xFF, 0xD9, 0xA6, 0x61, 0xFF, 0xD9, 0xA7, 0x61, 0xFF, 0xD9, 0xA9, + 0x61, 0xFF, 0xDA, 0xAA, 0x62, 0xFF, 0xDB, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x63, 0xFF, 0xDC, 0xAC, + 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAF, + 0x65, 0xFF, 0xE1, 0xB8, 0x79, 0xFF, 0xE7, 0xC6, 0x93, 0xFF, 0xE9, 0xC8, 0x97, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE7, 0xC7, 0x96, 0xFF, 0xE6, 0xC7, + 0x95, 0xFF, 0xE4, 0xC5, 0x95, 0xFF, 0xDF, 0xC4, 0x96, 0xFF, 0xE2, 0xC9, 0xA0, 0xFF, 0xE5, 0xD6, + 0xBC, 0xFF, 0xF0, 0xEA, 0xE2, 0xFF, 0xF5, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF0, 0xFF, 0xF0, 0xF1, 0xEF, 0xFF, 0xF3, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xEE, 0xEF, 0xEA, 0xFF, 0xCE, 0xCB, 0xBB, 0xFF, 0xBD, 0xB8, + 0xA5, 0xFF, 0xE3, 0xE0, 0xD3, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF3, 0xFF, 0xF0, 0xEA, 0xE3, 0xFF, 0xD9, 0xC9, 0xAA, 0xFF, 0xC7, 0xA8, 0x72, 0xFF, 0xCC, 0xA5, + 0x62, 0xFF, 0xD4, 0xA9, 0x63, 0xFF, 0xD8, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x62, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAC, 0x63, 0xFF, 0xDC, 0xAD, + 0x64, 0xFF, 0xDD, 0xAF, 0x6A, 0xFF, 0xDE, 0xB3, 0x74, 0xFF, 0xE7, 0xC4, 0x8E, 0xFF, 0xEC, 0xCB, + 0x97, 0xF4, 0xEB, 0xCB, 0xA1, 0x9A, 0xE2, 0xCA, 0xA7, 0x27, 0xC0, 0xC5, 0xB6, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xA2, 0x01, 0xE1, 0xC5, + 0x9C, 0x29, 0xE5, 0xC2, 0x93, 0xA2, 0xE3, 0xBE, 0x8A, 0xF0, 0xE1, 0xB7, 0x7F, 0xFF, 0xDC, 0xAF, + 0x70, 0xFF, 0xDA, 0xAA, 0x67, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xDB, 0xA9, 0x63, 0xFF, 0xDB, 0xAA, + 0x63, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, + 0x65, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDE, 0xAF, 0x64, 0xFF, 0xDF, 0xB1, + 0x66, 0xFF, 0xE2, 0xBA, 0x7A, 0xFF, 0xE8, 0xC8, 0x95, 0xFF, 0xEA, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xC9, + 0x98, 0xFF, 0xE8, 0xC9, 0x99, 0xFF, 0xE5, 0xC8, 0x98, 0xFF, 0xE3, 0xC7, 0x99, 0xFF, 0xE0, 0xCA, + 0xA2, 0xFF, 0xE5, 0xD5, 0xBC, 0xFF, 0xED, 0xE9, 0xE1, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF3, 0xF5, + 0xF4, 0xFF, 0xF4, 0xF5, 0xF4, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF5, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xEF, 0xF0, 0xED, 0xFF, 0xE3, 0xE3, 0xDA, 0xFF, 0xE5, 0xE3, + 0xDB, 0xFF, 0xF8, 0xF8, 0xF4, 0xFF, 0xF8, 0xF9, 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xEE, + 0xE6, 0xFF, 0xDC, 0xCB, 0xAC, 0xFF, 0xC9, 0xAC, 0x78, 0xFF, 0xCC, 0xA6, 0x63, 0xFF, 0xD3, 0xAA, + 0x64, 0xFF, 0xD9, 0xAD, 0x64, 0xFF, 0xDC, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, + 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, 0x66, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB3, 0x71, 0xFF, 0xDE, 0xBA, 0x82, 0xFF, 0xEA, 0xCA, 0x97, 0xFE, 0xF1, 0xCE, + 0x98, 0xD6, 0xE5, 0xCA, 0xA9, 0x5A, 0x49, 0xAC, 0xFD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC7, + 0xA3, 0x10, 0xE3, 0xC4, 0x9A, 0x61, 0xE5, 0xC2, 0x8F, 0xCE, 0xE5, 0xBD, 0x87, 0xFF, 0xE1, 0xB5, + 0x7A, 0xFF, 0xDD, 0xAE, 0x6D, 0xFF, 0xDB, 0xAB, 0x66, 0xFF, 0xDD, 0xAB, 0x65, 0xFF, 0xDC, 0xAC, + 0x65, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, 0x66, 0xFF, 0xDE, 0xAF, 0x67, 0xFF, 0xDE, 0xAF, + 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xDF, 0xB0, 0x66, 0xFF, 0xE0, 0xB0, 0x66, 0xFF, 0xE1, 0xB2, + 0x68, 0xFF, 0xE4, 0xBB, 0x7C, 0xFF, 0xE9, 0xCA, 0x96, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xE9, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xE9, 0xCB, 0x9B, 0xFF, 0xE6, 0xC9, 0x9B, 0xFF, 0xE2, 0xC9, + 0x9D, 0xFF, 0xE5, 0xCC, 0xA6, 0xFF, 0xE6, 0xD6, 0xBC, 0xFF, 0xF0, 0xE9, 0xE0, 0xFF, 0xF6, 0xF5, + 0xF3, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF8, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF5, 0xF7, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF1, 0xEF, 0xE8, 0xFF, 0xF1, 0xEF, 0xE9, 0xFF, 0xF7, 0xF6, 0xF4, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF5, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF4, 0xF6, 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, + 0xF7, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF7, 0xF8, + 0xF7, 0xFF, 0xF9, 0xFA, 0xFA, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF5, 0xF2, 0xEC, 0xFF, 0xE1, 0xD4, + 0xBB, 0xFF, 0xCC, 0xB0, 0x7D, 0xFF, 0xCC, 0xA7, 0x68, 0xFF, 0xD1, 0xA9, 0x62, 0xFF, 0xD7, 0xAD, + 0x65, 0xFF, 0xDD, 0xAF, 0x66, 0xFF, 0xDF, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, + 0x66, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE0, 0xB8, 0x78, 0xFF, 0xE3, 0xC4, 0x8E, 0xFF, 0xEF, 0xCA, 0x98, 0xF5, 0xF2, 0xD0, + 0xA3, 0x9A, 0xDA, 0xCB, 0xAF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAF, 0x01, 0xE0, 0xC8, 0xA8, 0x2A, 0xE5, 0xC5, 0x95, 0x97, 0xE5, 0xC1, 0x8E, 0xEE, 0xE3, 0xBB, + 0x83, 0xFF, 0xE0, 0xB3, 0x75, 0xFF, 0xDE, 0xAE, 0x6C, 0xFF, 0xDE, 0xAD, 0x69, 0xFF, 0xDE, 0xAD, + 0x67, 0xFF, 0xDE, 0xAE, 0x67, 0xFF, 0xDF, 0xAF, 0x68, 0xFF, 0xE0, 0xB1, 0x68, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, + 0x6A, 0xFF, 0xE5, 0xBB, 0x7A, 0xFF, 0xE9, 0xCA, 0x97, 0xFF, 0xEA, 0xCD, 0x9E, 0xFF, 0xEB, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCC, 0x9E, 0xFF, 0xEA, 0xCC, 0x9F, 0xFF, 0xE8, 0xCC, + 0x9E, 0xFF, 0xE6, 0xCB, 0x9F, 0xFF, 0xE3, 0xCD, 0xA6, 0xFF, 0xE5, 0xD5, 0xB8, 0xFF, 0xEC, 0xE8, + 0xDC, 0xFF, 0xF6, 0xF5, 0xF1, 0xFF, 0xF8, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xEC, 0xE5, + 0xD6, 0xFF, 0xE2, 0xD7, 0xC0, 0xFF, 0xE2, 0xD9, 0xC5, 0xFF, 0xEF, 0xEC, 0xE3, 0xFF, 0xF8, 0xF7, + 0xF6, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xFA, 0xFA, 0xF7, 0xFF, 0xF8, 0xF9, + 0xF7, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF9, 0xFC, 0xFC, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF7, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF9, 0xF6, 0xF2, 0xFF, 0xE8, 0xDF, 0xCE, 0xFF, 0xD4, 0xBE, + 0x95, 0xFF, 0xD1, 0xAD, 0x6F, 0xFF, 0xD6, 0xAD, 0x68, 0xFF, 0xDA, 0xAF, 0x66, 0xFF, 0xDE, 0xB2, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, 0x68, 0xFF, 0xE1, 0xB3, + 0x68, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE3, 0xB4, 0x6D, 0xFF, 0xE4, 0xBA, + 0x76, 0xFF, 0xE3, 0xBF, 0x84, 0xFF, 0xE8, 0xC9, 0x98, 0xFD, 0xEE, 0xCC, 0xA1, 0xD0, 0xEC, 0xD2, + 0xAF, 0x59, 0xE5, 0xD0, 0xB7, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xCB, 0xB1, 0x0D, 0xE6, 0xC9, 0x9D, 0x52, 0xE9, 0xC6, 0x93, 0xC7, 0xE7, 0xC1, + 0x8D, 0xFB, 0xE3, 0xB9, 0x81, 0xFF, 0xE0, 0xB3, 0x74, 0xFF, 0xE0, 0xB0, 0x6C, 0xFF, 0xDF, 0xAF, + 0x69, 0xFF, 0xDF, 0xB0, 0x69, 0xFF, 0xE0, 0xB1, 0x69, 0xFF, 0xE1, 0xB2, 0x6A, 0xFF, 0xE1, 0xB3, + 0x6A, 0xFF, 0xE2, 0xB4, 0x6B, 0xFF, 0xE2, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, 0x6B, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xBB, 0x79, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEC, 0xCF, 0xA0, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA2, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEB, 0xCF, + 0xA1, 0xFF, 0xE9, 0xCD, 0xA0, 0xFF, 0xE6, 0xCD, 0xA1, 0xFF, 0xE7, 0xCE, 0xA6, 0xFF, 0xE8, 0xD6, + 0xB5, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF9, 0xF9, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF7, 0xF8, 0xF9, 0xFF, 0xF6, 0xF7, 0xF6, 0xFF, 0xEA, 0xE0, 0xCD, 0xFF, 0xE1, 0xD0, + 0xAC, 0xFF, 0xDF, 0xCB, 0xA6, 0xFF, 0xE1, 0xCD, 0xA9, 0xFF, 0xE8, 0xD9, 0xBD, 0xFF, 0xF3, 0xEE, + 0xE3, 0xFF, 0xFA, 0xF9, 0xF6, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFB, 0xFA, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xE8, 0xE6, 0xDB, 0xFF, 0xE4, 0xE2, + 0xD7, 0xFF, 0xF2, 0xF1, 0xEB, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF9, 0xFA, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xEC, 0xE5, 0xD4, 0xFF, 0xDE, 0xCC, 0xAA, 0xFF, 0xD6, 0xB8, + 0x83, 0xFF, 0xD8, 0xB1, 0x6C, 0xFF, 0xDC, 0xB2, 0x6A, 0xFF, 0xDF, 0xB2, 0x69, 0xFF, 0xE1, 0xB4, + 0x6A, 0xFF, 0xE3, 0xB5, 0x6B, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE2, 0xB4, + 0x6A, 0xFF, 0xE2, 0xB5, 0x6B, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE4, 0xB8, 0x74, 0xFF, 0xE6, 0xC0, + 0x81, 0xFF, 0xE7, 0xC5, 0x8F, 0xFE, 0xEA, 0xCC, 0x9D, 0xE7, 0xEC, 0xD0, 0xA6, 0x8F, 0xEA, 0xD3, + 0xAE, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDE, 0xCB, 0xB0, 0x01, 0xE3, 0xC8, 0xA3, 0x1E, 0xEC, 0xC9, 0x94, 0x88, 0xE7, 0xC5, + 0x93, 0xE2, 0xE7, 0xC1, 0x8A, 0xFF, 0xE4, 0xB9, 0x7D, 0xFF, 0xE2, 0xB5, 0x72, 0xFF, 0xE1, 0xB2, + 0x6D, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE2, 0xB5, + 0x6D, 0xFF, 0xE3, 0xB5, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6E, 0xFF, 0xE6, 0xBC, 0x77, 0xFF, 0xEA, 0xC9, 0x92, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD0, + 0xA4, 0xFF, 0xED, 0xD0, 0xA3, 0xFF, 0xEA, 0xCF, 0xA2, 0xFF, 0xE8, 0xCE, 0xA3, 0xFF, 0xE7, 0xCF, + 0xA6, 0xFF, 0xE7, 0xD3, 0xAE, 0xFF, 0xE9, 0xDE, 0xC8, 0xFF, 0xF1, 0xEC, 0xE4, 0xFF, 0xF6, 0xF5, + 0xF2, 0xFF, 0xF7, 0xF4, 0xED, 0xFF, 0xEC, 0xE1, 0xCD, 0xFF, 0xE5, 0xD1, 0xAD, 0xFF, 0xE4, 0xCD, + 0xA5, 0xFF, 0xE4, 0xCE, 0xA4, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xE5, 0xCF, 0xA9, 0xFF, 0xE9, 0xDB, + 0xBE, 0xFF, 0xF4, 0xEC, 0xDF, 0xFF, 0xFA, 0xFA, 0xF5, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xE6, 0xE5, 0xDA, 0xFF, 0xC7, 0xC4, 0xB2, 0xFF, 0xD3, 0xD1, + 0xC1, 0xFF, 0xF0, 0xEF, 0xE8, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF9, 0xF5, + 0xF1, 0xFF, 0xF0, 0xE7, 0xD6, 0xFF, 0xE2, 0xD1, 0xB5, 0xFF, 0xE1, 0xC7, 0x9D, 0xFF, 0xDC, 0xBB, + 0x82, 0xFF, 0xE0, 0xB6, 0x6F, 0xFF, 0xE2, 0xB6, 0x6C, 0xFF, 0xE3, 0xB5, 0x6C, 0xFF, 0xE3, 0xB7, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE4, 0xB9, 0x73, 0xFF, 0xE6, 0xBE, 0x7F, 0xFF, 0xE9, 0xC6, + 0x8C, 0xFF, 0xEC, 0xCC, 0x99, 0xF6, 0xED, 0xD1, 0xA5, 0xBA, 0xEB, 0xD1, 0xAA, 0x49, 0xE7, 0xD2, + 0xAE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xCC, 0xAC, 0x06, 0xE8, 0xCD, 0xA1, 0x40, 0xEA, 0xCB, + 0x95, 0xAD, 0xEB, 0xC4, 0x91, 0xF5, 0xE9, 0xC0, 0x87, 0xFF, 0xE5, 0xB9, 0x7C, 0xFF, 0xE2, 0xB5, + 0x72, 0xFF, 0xE2, 0xB4, 0x6E, 0xFF, 0xE2, 0xB4, 0x6D, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE3, 0xB6, + 0x6E, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE8, 0xBB, 0x75, 0xFF, 0xEB, 0xC7, 0x8D, 0xFF, 0xEF, 0xD2, 0xA2, 0xFF, 0xF0, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEE, 0xD2, 0xA5, 0xFF, 0xED, 0xD1, 0xA5, 0xFF, 0xEC, 0xD2, + 0xA5, 0xFF, 0xED, 0xD2, 0xA7, 0xFF, 0xE9, 0xD1, 0xAC, 0xFF, 0xEB, 0xD8, 0xB9, 0xFF, 0xEF, 0xDD, + 0xC2, 0xFF, 0xED, 0xD9, 0xBA, 0xFF, 0xE6, 0xD1, 0xAB, 0xFF, 0xE6, 0xCE, 0xA6, 0xFF, 0xE8, 0xCF, + 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA7, 0xFF, 0xE6, 0xD2, + 0xAE, 0xFF, 0xEC, 0xDA, 0xBC, 0xFF, 0xF4, 0xEC, 0xDE, 0xFF, 0xFA, 0xF9, 0xF5, 0xFF, 0xFA, 0xFA, + 0xFA, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xE7, 0xE6, 0xDB, 0xFF, 0xD9, 0xD7, 0xC5, 0xFF, 0xE6, 0xE4, + 0xD9, 0xFF, 0xF6, 0xF8, 0xF4, 0xFF, 0xF8, 0xFA, 0xFC, 0xFF, 0xF7, 0xF6, 0xF6, 0xFF, 0xF1, 0xE9, + 0xD9, 0xFF, 0xE7, 0xD7, 0xB8, 0xFF, 0xE3, 0xCD, 0xA8, 0xFF, 0xE5, 0xC8, 0x99, 0xFF, 0xE0, 0xBB, + 0x7E, 0xFF, 0xE4, 0xB8, 0x70, 0xFF, 0xE4, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x6E, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE6, 0xB9, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB8, + 0x70, 0xFF, 0xE5, 0xBA, 0x74, 0xFF, 0xE7, 0xBE, 0x7C, 0xFF, 0xE8, 0xC3, 0x88, 0xFF, 0xED, 0xCA, + 0x94, 0xFE, 0xEE, 0xCF, 0xA0, 0xD9, 0xEC, 0xD3, 0xAE, 0x76, 0xEA, 0xD4, 0xB0, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xD9, 0xE4, 0x0D, 0xEE, 0xCB, + 0x9C, 0x62, 0xEB, 0xC9, 0x92, 0xD3, 0xEA, 0xC5, 0x8E, 0xFF, 0xE8, 0xC0, 0x88, 0xFF, 0xE4, 0xBA, + 0x7A, 0xFF, 0xE3, 0xB6, 0x72, 0xFF, 0xE4, 0xB6, 0x70, 0xFF, 0xE5, 0xB6, 0x70, 0xFF, 0xE4, 0xB7, + 0x70, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB9, 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xEA, 0xC4, 0x86, 0xFF, 0xF0, 0xD3, 0xA2, 0xFF, 0xF0, 0xD4, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEF, 0xD5, 0xA8, 0xFF, 0xEE, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, 0xA9, 0xFF, 0xEC, 0xD4, + 0xAC, 0xFF, 0xEB, 0xD3, 0xAB, 0xFF, 0xEC, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA8, 0xFF, 0xEE, 0xD3, 0xA8, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEA, 0xD2, + 0xA9, 0xFF, 0xE8, 0xD2, 0xAB, 0xFF, 0xEA, 0xD9, 0xB9, 0xFF, 0xF4, 0xEB, 0xDB, 0xFF, 0xFB, 0xF9, + 0xF4, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xF6, 0xF6, 0xF2, 0xFF, 0xF5, 0xF5, 0xF1, 0xFF, 0xF7, 0xF9, + 0xF5, 0xFF, 0xF9, 0xFB, 0xFC, 0xFF, 0xF9, 0xF8, 0xF9, 0xFF, 0xF3, 0xEC, 0xE0, 0xFF, 0xE5, 0xD6, + 0xBA, 0xFF, 0xE5, 0xD0, 0xAC, 0xFF, 0xE7, 0xD1, 0xAB, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE3, 0xBB, + 0x78, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE7, 0xBA, + 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE7, 0xBB, + 0x73, 0xFF, 0xE8, 0xBE, 0x7A, 0xFF, 0xEA, 0xC4, 0x87, 0xFF, 0xEC, 0xC9, 0x92, 0xFF, 0xEE, 0xCF, + 0x9C, 0xEE, 0xEF, 0xD4, 0xA8, 0x9C, 0xEB, 0xD6, 0xBA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCD, + 0xA8, 0x25, 0xEE, 0xCC, 0x99, 0x89, 0xEB, 0xC8, 0x93, 0xE6, 0xEA, 0xC5, 0x8F, 0xFF, 0xE8, 0xC0, + 0x85, 0xFF, 0xE6, 0xBA, 0x7A, 0xFF, 0xE5, 0xB8, 0x73, 0xFF, 0xE6, 0xB8, 0x72, 0xFF, 0xE6, 0xB8, + 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, + 0x72, 0xFF, 0xE8, 0xBB, 0x74, 0xFF, 0xEB, 0xC2, 0x81, 0xFF, 0xEE, 0xCF, 0x9E, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, + 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF0, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF0, 0xD5, 0xAA, 0xFF, 0xEF, 0xD5, 0xAA, 0xFF, 0xEF, 0xD4, 0xAB, 0xFF, 0xED, 0xD4, + 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xEF, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, + 0xAB, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xE7, 0xD2, 0xAC, 0xFF, 0xEA, 0xD8, 0xB7, 0xFF, 0xF3, 0xEB, + 0xD7, 0xFF, 0xFB, 0xFA, 0xF3, 0xFF, 0xF9, 0xFA, 0xF9, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xFA, 0xFB, + 0xFA, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF6, 0xF1, 0xE5, 0xFF, 0xE9, 0xDA, 0xBB, 0xFF, 0xE3, 0xD0, + 0xAC, 0xFF, 0xE7, 0xD2, 0xAB, 0xFF, 0xE8, 0xD1, 0xA8, 0xFF, 0xEB, 0xC7, 0x8B, 0xFF, 0xE7, 0xBD, + 0x76, 0xFF, 0xE7, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, 0x73, 0xFF, 0xE8, 0xBC, 0x72, 0xFF, 0xE8, 0xBB, + 0x72, 0xFF, 0xE8, 0xBB, 0x72, 0xFF, 0xE7, 0xBB, 0x73, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBE, + 0x78, 0xFF, 0xE9, 0xC3, 0x82, 0xFF, 0xEC, 0xCA, 0x90, 0xFF, 0xED, 0xCE, 0x9C, 0xF8, 0xEF, 0xD2, + 0xA5, 0xBB, 0xEF, 0xD6, 0xAE, 0x54, 0xEC, 0xD7, 0xBB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD2, + 0xB6, 0x06, 0xF1, 0xD4, 0xAA, 0x3C, 0xEE, 0xCD, 0x9A, 0xA6, 0xEC, 0xC9, 0x93, 0xF2, 0xEC, 0xC6, + 0x8F, 0xFF, 0xEA, 0xC2, 0x87, 0xFF, 0xE7, 0xBC, 0x7B, 0xFF, 0xE6, 0xBA, 0x75, 0xFF, 0xE7, 0xBA, + 0x74, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, + 0x73, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xEC, 0xC1, 0x7D, 0xFF, 0xED, 0xCB, 0x96, 0xFF, 0xF0, 0xD5, + 0xAA, 0xFF, 0xF2, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAE, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF0, 0xD6, + 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, + 0xAC, 0xFF, 0xEF, 0xD6, 0xAC, 0xFF, 0xEC, 0xD5, 0xAC, 0xFF, 0xEA, 0xD4, 0xAD, 0xFF, 0xE9, 0xD7, + 0xB6, 0xFF, 0xF2, 0xE9, 0xD3, 0xFF, 0xF8, 0xF7, 0xF2, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xFB, 0xF9, + 0xF7, 0xFF, 0xF7, 0xF3, 0xE9, 0xFF, 0xEA, 0xDD, 0xC2, 0xFF, 0xE8, 0xD4, 0xAF, 0xFF, 0xE8, 0xD3, + 0xAC, 0xFF, 0xEC, 0xD5, 0xAE, 0xFF, 0xEA, 0xD2, 0xA3, 0xFF, 0xEE, 0xC6, 0x82, 0xFF, 0xE8, 0xBE, + 0x76, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE8, 0xBD, + 0x74, 0xFF, 0xE8, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x76, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xE9, 0xC3, + 0x82, 0xFF, 0xEC, 0xCA, 0x8E, 0xFF, 0xEE, 0xD0, 0x9A, 0xFF, 0xEF, 0xD4, 0xA5, 0xD4, 0xEE, 0xD5, + 0xAE, 0x6F, 0xEE, 0xD7, 0xB4, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xD4, 0xAD, 0x12, 0xEF, 0xD1, 0xA7, 0x56, 0xEF, 0xCD, 0x9B, 0xC0, 0xEE, 0xCA, + 0x94, 0xF9, 0xED, 0xC7, 0x8E, 0xFF, 0xEB, 0xC2, 0x85, 0xFF, 0xE9, 0xBD, 0x7C, 0xFF, 0xE7, 0xBB, + 0x77, 0xFF, 0xE8, 0xBC, 0x76, 0xFF, 0xE8, 0xBC, 0x75, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBD, + 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEE, 0xC9, 0x8C, 0xFF, 0xF1, 0xD4, + 0xA8, 0xFF, 0xF3, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, + 0xB0, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF1, 0xD8, 0xAF, 0xFF, 0xF0, 0xD8, 0xAF, 0xFF, 0xEF, 0xD8, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAF, 0xFF, 0xEC, 0xD8, 0xB5, 0xFF, 0xF1, 0xE6, 0xD1, 0xFF, 0xF8, 0xF1, 0xE6, 0xFF, 0xF8, 0xF2, + 0xE4, 0xFF, 0xEF, 0xE2, 0xC9, 0xFF, 0xE9, 0xD7, 0xB3, 0xFF, 0xEA, 0xD6, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xEC, 0xCF, 0x9A, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xE9, 0xBF, + 0x77, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xEA, 0xBF, 0x76, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xE9, 0xBE, + 0x76, 0xFF, 0xEA, 0xBF, 0x78, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEB, 0xC3, 0x82, 0xFF, 0xEC, 0xC9, + 0x90, 0xFF, 0xEF, 0xCE, 0x9A, 0xFE, 0xEF, 0xD3, 0xA1, 0xE2, 0xF1, 0xD7, 0xA9, 0x89, 0xEC, 0xD6, + 0xB7, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD4, 0xAC, 0x1B, 0xED, 0xD1, 0xA7, 0x6E, 0xEE, 0xCD, + 0x9B, 0xD1, 0xEE, 0xCA, 0x93, 0xFF, 0xED, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, 0x87, 0xFF, 0xE9, 0xBF, + 0x7D, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xE9, 0xBE, 0x78, 0xFF, 0xEA, 0xBE, 0x77, 0xFF, 0xEA, 0xBE, + 0x77, 0xFF, 0xEA, 0xBF, 0x77, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xF1, 0xD1, + 0x9E, 0xFF, 0xF3, 0xD9, 0xB0, 0xFF, 0xF4, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB1, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF2, 0xDA, 0xB2, 0xFF, 0xF1, 0xD9, 0xB1, 0xFF, 0xF1, 0xDA, + 0xB1, 0xFF, 0xEF, 0xD8, 0xB2, 0xFF, 0xEC, 0xDA, 0xB6, 0xFF, 0xF0, 0xE1, 0xC4, 0xFF, 0xF0, 0xE1, + 0xC4, 0xFF, 0xED, 0xDB, 0xB6, 0xFF, 0xEF, 0xDA, 0xB2, 0xFF, 0xF0, 0xDA, 0xB1, 0xFF, 0xF0, 0xD8, + 0xAF, 0xFF, 0xF3, 0xD9, 0xAB, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEA, 0xBF, + 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEA, 0xC0, + 0x7A, 0xFF, 0xEB, 0xC2, 0x7D, 0xFF, 0xEC, 0xC5, 0x83, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD2, + 0x9D, 0xFF, 0xF3, 0xD5, 0xA4, 0xEA, 0xF4, 0xD5, 0xA3, 0xA0, 0xF2, 0xD7, 0xA8, 0x3B, 0xE8, 0xD9, + 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD4, 0xAA, 0x25, 0xF0, 0xD2, + 0xA3, 0x7E, 0xF0, 0xCF, 0x9B, 0xD8, 0xEF, 0xCC, 0x95, 0xFD, 0xEE, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, + 0x85, 0xFF, 0xEB, 0xC0, 0x7E, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xEB, 0xBF, + 0x79, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC3, 0x7D, 0xFF, 0xF1, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDC, + 0xB3, 0xFF, 0xF2, 0xDA, 0xB3, 0xFF, 0xEF, 0xDA, 0xB4, 0xFF, 0xF1, 0xDC, 0xB7, 0xFF, 0xF0, 0xDC, + 0xB8, 0xFF, 0xF0, 0xDB, 0xB5, 0xFF, 0xF2, 0xDC, 0xB5, 0xFF, 0xF3, 0xDC, 0xB3, 0xFF, 0xF3, 0xDB, + 0xB1, 0xFF, 0xF3, 0xD5, 0xA1, 0xFF, 0xEC, 0xC6, 0x83, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEC, 0xC2, + 0x7A, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xEC, 0xC2, 0x7A, 0xFF, 0xEC, 0xC2, 0x7C, 0xFF, 0xEC, 0xC3, + 0x7D, 0xFF, 0xEC, 0xC5, 0x84, 0xFF, 0xEF, 0xCB, 0x8F, 0xFF, 0xF0, 0xD0, 0x9D, 0xFF, 0xF3, 0xD4, + 0xA2, 0xEE, 0xF3, 0xD6, 0xA6, 0xB2, 0xF1, 0xD8, 0xB0, 0x4A, 0xE9, 0xDB, 0xC1, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA8, 0x2C, 0xF2, 0xD4, 0xA5, 0x89, 0xEF, 0xCF, 0x9C, 0xDE, 0xEE, 0xCC, 0x94, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xED, 0xC6, 0x88, 0xFF, 0xEC, 0xC2, 0x7F, 0xFF, 0xEC, 0xC1, 0x7C, 0xFF, 0xEC, 0xC1, + 0x7B, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xF1, 0xC8, + 0x83, 0xFF, 0xF2, 0xD3, 0xA2, 0xFF, 0xF4, 0xDC, 0xB3, 0xFF, 0xF6, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF4, 0xDE, + 0xB6, 0xFF, 0xF4, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, + 0xB7, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDA, + 0xAC, 0xFF, 0xF1, 0xCD, 0x90, 0xFF, 0xEC, 0xC4, 0x7E, 0xFF, 0xEC, 0xC3, 0x7B, 0xFF, 0xED, 0xC3, + 0x7B, 0xFF, 0xED, 0xC3, 0x7C, 0xFF, 0xED, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEF, 0xC8, + 0x84, 0xFF, 0xF1, 0xCC, 0x90, 0xFF, 0xF2, 0xD2, 0x9E, 0xFF, 0xF2, 0xD5, 0xA4, 0xF1, 0xF5, 0xD5, + 0xA1, 0xB9, 0xF5, 0xDA, 0xAC, 0x55, 0xD2, 0xE5, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA7, 0x01, 0xF2, 0xD6, 0xA8, 0x32, 0xF1, 0xD4, 0xA3, 0x94, 0xF1, 0xD1, 0x9D, 0xE0, 0xF0, 0xCE, + 0x98, 0xFE, 0xEF, 0xCB, 0x91, 0xFF, 0xEE, 0xC7, 0x88, 0xFF, 0xED, 0xC3, 0x81, 0xFF, 0xEC, 0xC2, + 0x7D, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC4, + 0x7E, 0xFF, 0xF2, 0xCD, 0x90, 0xFF, 0xF4, 0xD9, 0xAE, 0xFF, 0xF7, 0xDE, 0xB6, 0xFF, 0xF7, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB9, 0xFF, 0xF6, 0xDF, 0xB9, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF2, 0xD5, + 0x9F, 0xFF, 0xEF, 0xC7, 0x83, 0xFF, 0xEE, 0xC5, 0x7D, 0xFF, 0xEE, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, + 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEE, 0xC6, 0x80, 0xFF, 0xF0, 0xC8, 0x85, 0xFF, 0xF3, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD2, 0x9D, 0xFF, 0xF3, 0xD6, 0xA5, 0xF4, 0xF6, 0xD7, 0xA6, 0xC2, 0xF4, 0xD6, + 0xA6, 0x62, 0xED, 0xDC, 0xC6, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xD4, 0xA5, 0x01, 0xF1, 0xD6, 0xA8, 0x3B, 0xF2, 0xD5, 0xA7, 0x9B, 0xF1, 0xD2, + 0x9F, 0xE5, 0xF0, 0xCF, 0x98, 0xFF, 0xF1, 0xCD, 0x92, 0xFF, 0xF1, 0xCA, 0x8B, 0xFF, 0xEE, 0xC6, + 0x83, 0xFF, 0xEE, 0xC4, 0x80, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEF, 0xC5, + 0x7F, 0xFF, 0xF1, 0xC7, 0x84, 0xFF, 0xF3, 0xD2, 0x9B, 0xFF, 0xF6, 0xDC, 0xB5, 0xFF, 0xF8, 0xE0, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBB, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF5, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xB9, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF4, 0xD9, 0xA9, 0xFF, 0xF3, 0xCE, + 0x8F, 0xFF, 0xEF, 0xC7, 0x81, 0xFF, 0xEE, 0xC6, 0x7E, 0xFF, 0xEF, 0xC6, 0x7F, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF1, 0xCA, 0x87, 0xFF, 0xF3, 0xCE, 0x92, 0xFF, 0xF3, 0xD4, + 0x9E, 0xFF, 0xF5, 0xD8, 0xA6, 0xF9, 0xF5, 0xD7, 0xA4, 0xC6, 0xF5, 0xD7, 0xA6, 0x6A, 0xE7, 0xE0, + 0xCB, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD6, 0xA9, 0x04, 0xF3, 0xD7, 0xA9, 0x3E, 0xF3, 0xD6, + 0xA6, 0xA0, 0xF3, 0xD3, 0xA0, 0xE3, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xCE, 0x94, 0xFF, 0xF1, 0xCB, + 0x8C, 0xFF, 0xEF, 0xC7, 0x86, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xEF, 0xC6, 0x80, 0xFF, 0xF0, 0xC6, + 0x80, 0xFF, 0xF1, 0xC7, 0x82, 0xFF, 0xF3, 0xCB, 0x88, 0xFF, 0xF3, 0xD7, 0xA6, 0xFF, 0xF7, 0xE0, + 0xBA, 0xFF, 0xF8, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBA, 0xFF, 0xF6, 0xDD, 0xB1, 0xFF, 0xF4, 0xD2, 0x98, 0xFF, 0xF2, 0xCB, + 0x85, 0xFF, 0xEF, 0xC8, 0x81, 0xFF, 0xEF, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF0, 0xC9, + 0x85, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF3, 0xD0, 0x95, 0xFF, 0xF2, 0xD3, 0x9F, 0xFF, 0xF4, 0xD8, + 0xA6, 0xF7, 0xF6, 0xD9, 0xA7, 0xCD, 0xF3, 0xD7, 0xAC, 0x6D, 0xEE, 0xDE, 0xC7, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA7, 0x02, 0xF3, 0xD7, + 0xA9, 0x3D, 0xF4, 0xD7, 0xA8, 0x99, 0xF2, 0xD4, 0xA1, 0xE2, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xD0, + 0x96, 0xFF, 0xF3, 0xCE, 0x91, 0xFF, 0xF0, 0xCA, 0x89, 0xFF, 0xEF, 0xC8, 0x84, 0xFF, 0xF0, 0xC7, + 0x82, 0xFF, 0xF0, 0xC7, 0x83, 0xFF, 0xF1, 0xC9, 0x85, 0xFF, 0xF3, 0xCF, 0x90, 0xFF, 0xF5, 0xDB, + 0xAE, 0xFF, 0xF9, 0xE2, 0xBB, 0xFF, 0xF8, 0xE2, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE2, + 0xBC, 0xFF, 0xF7, 0xDF, 0xB4, 0xFF, 0xF5, 0xD5, 0xA0, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF1, 0xCA, + 0x83, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xCA, 0x84, 0xFF, 0xF2, 0xCC, 0x88, 0xFF, 0xF4, 0xCE, + 0x8F, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF5, 0xD6, 0xA2, 0xFF, 0xF6, 0xD8, 0xA5, 0xF5, 0xF8, 0xD9, + 0xA3, 0xC2, 0xF6, 0xD9, 0xA7, 0x6A, 0xEA, 0xDD, 0xCE, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xD8, + 0xAA, 0x02, 0xF4, 0xD9, 0xAB, 0x36, 0xF3, 0xD8, 0xA8, 0x8F, 0xF3, 0xD5, 0xA2, 0xDA, 0xF3, 0xD4, + 0x9D, 0xFB, 0xF4, 0xD2, 0x99, 0xFF, 0xF3, 0xD0, 0x94, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF0, 0xC9, + 0x86, 0xFF, 0xF1, 0xC8, 0x84, 0xFF, 0xF0, 0xC9, 0x83, 0xFF, 0xF4, 0xCB, 0x87, 0xFF, 0xF6, 0xD3, + 0x96, 0xFF, 0xF7, 0xDE, 0xB2, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF9, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE1, + 0xB8, 0xFF, 0xF6, 0xD8, 0xA6, 0xFF, 0xF4, 0xCF, 0x8E, 0xFF, 0xF1, 0xCB, 0x85, 0xFF, 0xF2, 0xCB, + 0x84, 0xFF, 0xF1, 0xCB, 0x86, 0xFF, 0xF3, 0xCE, 0x8A, 0xFF, 0xF4, 0xD0, 0x91, 0xFF, 0xF6, 0xD3, + 0x9A, 0xFF, 0xF4, 0xD5, 0xA2, 0xFE, 0xF5, 0xD7, 0xA8, 0xED, 0xF7, 0xDB, 0xA9, 0xBB, 0xF6, 0xDB, + 0xAD, 0x60, 0xED, 0xDE, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xDB, 0xAF, 0x2F, 0xF4, 0xD9, 0xAD, 0x7E, 0xF4, 0xD6, + 0xA4, 0xCF, 0xF4, 0xD5, 0x9F, 0xF9, 0xF4, 0xD4, 0x9D, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF2, 0xCD, + 0x8F, 0xFF, 0xF2, 0xCB, 0x89, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF4, 0xCD, + 0x8A, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF5, 0xDE, 0xB2, 0xFF, 0xF9, 0xE4, 0xBE, 0xFF, 0xF9, 0xE5, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF9, 0xE4, 0xBF, 0xFF, 0xF8, 0xE1, 0xB9, 0xFF, 0xF7, 0xD9, + 0xA7, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, 0x88, 0xFF, 0xF3, 0xCB, 0x87, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF4, 0xCF, 0x8F, 0xFF, 0xF5, 0xD2, 0x97, 0xFF, 0xF6, 0xD5, 0x9F, 0xFF, 0xF5, 0xD7, + 0xA4, 0xFE, 0xF5, 0xD9, 0xA9, 0xE6, 0xF4, 0xD8, 0xA8, 0xA6, 0xF8, 0xDD, 0xB1, 0x54, 0xE7, 0xEA, + 0xEA, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDC, 0xB1, 0x24, 0xF3, 0xD9, + 0xAC, 0x68, 0xF4, 0xD7, 0xA5, 0xC2, 0xF5, 0xD6, 0xA2, 0xF4, 0xF6, 0xD5, 0x9F, 0xFF, 0xF6, 0xD3, + 0x9B, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCD, 0x8E, 0xFF, 0xF3, 0xCC, 0x8A, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF5, 0xCD, 0x8C, 0xFF, 0xF7, 0xD4, 0x99, 0xFF, 0xF8, 0xDE, 0xB3, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xF9, 0xE6, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE2, 0xBA, 0xFF, 0xF8, 0xDB, 0xA8, 0xFF, 0xF5, 0xD1, + 0x92, 0xFF, 0xF3, 0xCE, 0x8B, 0xFF, 0xF4, 0xCD, 0x89, 0xFF, 0xF4, 0xCE, 0x8D, 0xFF, 0xF5, 0xD1, + 0x94, 0xFF, 0xF6, 0xD4, 0x9B, 0xFF, 0xF6, 0xD7, 0xA0, 0xFF, 0xF6, 0xD9, 0xA6, 0xFB, 0xF7, 0xDB, + 0xAA, 0xD8, 0xF8, 0xDC, 0xAD, 0x94, 0xF4, 0xDA, 0xB0, 0x3F, 0xF5, 0xDF, 0xC3, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB3, 0x1A, 0xF4, 0xDB, 0xB1, 0x50, 0xF4, 0xD8, 0xA7, 0xA0, 0xF6, 0xD7, 0xA2, 0xE4, 0xF7, 0xD7, + 0xA1, 0xFE, 0xF6, 0xD6, 0x9E, 0xFF, 0xF4, 0xD2, 0x99, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCE, + 0x8E, 0xFF, 0xF3, 0xCD, 0x8C, 0xFF, 0xF4, 0xCE, 0x8E, 0xFF, 0xF5, 0xD3, 0x98, 0xFF, 0xF6, 0xDD, + 0xB1, 0xFF, 0xFA, 0xE6, 0xC0, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, + 0xC3, 0xFF, 0xF9, 0xE1, 0xB9, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF3, 0xCF, + 0x8B, 0xFF, 0xF4, 0xCF, 0x8D, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF6, 0xD4, 0x9A, 0xFF, 0xF6, 0xD7, + 0x9F, 0xFF, 0xF6, 0xD8, 0xA3, 0xFF, 0xF7, 0xDA, 0xA6, 0xF3, 0xF8, 0xDC, 0xAB, 0xC3, 0xF8, 0xDE, + 0xB0, 0x7C, 0xF9, 0xE0, 0xB6, 0x2D, 0xF3, 0xDF, 0xBD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xDB, 0xB9, 0x0E, 0xF2, 0xD9, 0xB0, 0x3C, 0xF5, 0xD8, 0xA8, 0x7E, 0xF7, 0xDA, + 0xA5, 0xCB, 0xF8, 0xD9, 0xA3, 0xF6, 0xF7, 0xD7, 0xA0, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF6, 0xD3, + 0x98, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD0, 0x90, 0xFF, 0xF7, 0xD3, + 0x98, 0xFF, 0xF9, 0xDB, 0xAC, 0xFF, 0xF9, 0xE3, 0xBD, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFB, 0xE7, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, + 0xC5, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFA, 0xE6, 0xC6, 0xFF, 0xFB, 0xE6, 0xC2, 0xFF, 0xFA, 0xE0, + 0xB5, 0xFF, 0xF8, 0xD9, 0xA1, 0xFF, 0xF5, 0xD3, 0x93, 0xFF, 0xF3, 0xD1, 0x90, 0xFF, 0xF5, 0xD1, + 0x90, 0xFF, 0xF5, 0xD3, 0x96, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDA, + 0xA4, 0xFC, 0xF7, 0xDC, 0xAB, 0xE5, 0xF6, 0xDC, 0xB0, 0xA4, 0xF6, 0xDD, 0xB2, 0x5C, 0xF7, 0xE0, + 0xB5, 0x1C, 0xF8, 0xE0, 0xB7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD9, 0xC7, 0x04, 0xE8, 0xD7, 0xC3, 0x21, 0xF6, 0xDB, + 0xAA, 0x5B, 0xF7, 0xDA, 0xA6, 0xA1, 0xF7, 0xD8, 0xA5, 0xDE, 0xF6, 0xD7, 0xA3, 0xFA, 0xF7, 0xD7, + 0xA1, 0xFF, 0xF8, 0xD7, 0x9E, 0xFF, 0xF7, 0xD5, 0x99, 0xFF, 0xF6, 0xD3, 0x95, 0xFF, 0xF5, 0xD2, + 0x93, 0xFF, 0xF6, 0xD3, 0x96, 0xFF, 0xF7, 0xD9, 0xA4, 0xFF, 0xF9, 0xE1, 0xB7, 0xFF, 0xFB, 0xE6, + 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE7, + 0xC7, 0xFF, 0xFC, 0xE7, 0xC6, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xF9, 0xDE, 0xAD, 0xFF, 0xF8, 0xD8, + 0x9C, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF5, 0xD4, 0x94, 0xFF, 0xF6, 0xD5, 0x99, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD8, 0xA4, 0xFF, 0xF8, 0xDA, 0xA6, 0xFD, 0xF9, 0xDB, 0xA8, 0xEF, 0xF7, 0xDB, + 0xAA, 0xC5, 0xF8, 0xDE, 0xB3, 0x80, 0xF7, 0xE4, 0xC4, 0x3F, 0xF6, 0xE4, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC8, 0x01, 0xF1, 0xD8, + 0xB2, 0x10, 0xF5, 0xD9, 0xAC, 0x34, 0xF5, 0xDA, 0xAA, 0x72, 0xF6, 0xDA, 0xA9, 0xC0, 0xF7, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA2, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF8, 0xD6, + 0x9A, 0xFF, 0xF7, 0xD4, 0x97, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF8, 0xD6, 0x9E, 0xFF, 0xFB, 0xDD, + 0xB0, 0xFF, 0xFD, 0xE5, 0xC0, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFB, 0xE8, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE6, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB7, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF7, 0xD7, 0x9C, 0xFF, 0xF6, 0xD6, + 0x97, 0xFF, 0xF7, 0xD6, 0x99, 0xFF, 0xF8, 0xD8, 0x9E, 0xFF, 0xFA, 0xDA, 0xA2, 0xFF, 0xF9, 0xDC, + 0xA6, 0xFF, 0xF9, 0xDC, 0xA9, 0xFB, 0xF9, 0xDC, 0xAA, 0xD7, 0xFA, 0xDD, 0xAE, 0x97, 0xF8, 0xDE, + 0xB0, 0x4F, 0xF8, 0xE0, 0xB5, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x18, 0xF3, 0xDC, 0xB4, 0x46, 0xF6, 0xDC, + 0xAC, 0x8C, 0xF7, 0xDC, 0xA9, 0xC8, 0xF7, 0xDB, 0xA7, 0xF1, 0xF9, 0xDA, 0xA5, 0xFE, 0xF9, 0xDA, + 0xA3, 0xFF, 0xF8, 0xD8, 0xA0, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF7, 0xD6, 0x9C, 0xFF, 0xF7, 0xD6, + 0x9D, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xFB, 0xE6, 0xC3, 0xFF, 0xFB, 0xE9, + 0xC8, 0xFF, 0xFB, 0xEA, 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, 0xCA, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xE9, + 0xCA, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE4, 0xBA, 0xFF, 0xFA, 0xDD, + 0xAB, 0xFF, 0xF9, 0xD9, 0xA0, 0xFF, 0xF7, 0xD7, 0x9D, 0xFF, 0xF7, 0xD8, 0x9E, 0xFF, 0xF6, 0xD8, + 0xA0, 0xFF, 0xF7, 0xD9, 0xA6, 0xFF, 0xF9, 0xDB, 0xA7, 0xFE, 0xFA, 0xDC, 0xA9, 0xF9, 0xF9, 0xDD, + 0xA9, 0xE2, 0xF9, 0xDD, 0xAC, 0xAD, 0xFA, 0xE0, 0xB4, 0x69, 0xFA, 0xE0, 0xB7, 0x2B, 0xF8, 0xE0, + 0xB5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x08, 0xF4, 0xDB, + 0xAF, 0x23, 0xF7, 0xDC, 0xAD, 0x4F, 0xF8, 0xDD, 0xAC, 0x8D, 0xF8, 0xDD, 0xAB, 0xCC, 0xF9, 0xDC, + 0xA9, 0xF2, 0xF9, 0xDB, 0xA6, 0xFD, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA3, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF9, 0xD8, 0xA1, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE0, + 0xB5, 0xFF, 0xFC, 0xE5, 0xBF, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFD, 0xE7, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB8, 0xFF, 0xFB, 0xDF, 0xAE, 0xFF, 0xFB, 0xDB, 0xA6, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF6, 0xD8, 0xA0, 0xFF, 0xF6, 0xD8, 0xA2, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xFA, 0xDB, + 0xA6, 0xFF, 0xFA, 0xDD, 0xAA, 0xFC, 0xF9, 0xDC, 0xA9, 0xE0, 0xFB, 0xDD, 0xB0, 0xAF, 0xF8, 0xDD, + 0xB4, 0x71, 0xF6, 0xDF, 0xB5, 0x3B, 0xF7, 0xE5, 0xBD, 0x11, 0xF7, 0xE2, 0xBB, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDC, 0xB0, 0x05, 0xF6, 0xDE, 0xB5, 0x23, 0xF6, 0xDD, 0xB4, 0x51, 0xF7, 0xDD, + 0xAE, 0x8B, 0xF8, 0xDD, 0xAA, 0xBD, 0xF8, 0xDC, 0xA9, 0xE3, 0xF8, 0xDA, 0xA6, 0xF6, 0xF8, 0xDA, + 0xA4, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xFA, 0xDC, 0xA9, 0xFF, 0xF9, 0xE0, 0xB1, 0xFF, 0xF9, 0xE4, 0xBB, 0xFF, 0xF9, 0xE6, + 0xC5, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEC, 0xCD, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFD, 0xE4, 0xB7, 0xFF, 0xFB, 0xE0, + 0xAE, 0xFF, 0xF8, 0xDC, 0xA7, 0xFF, 0xF8, 0xDA, 0xA5, 0xFF, 0xFA, 0xDB, 0xA6, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xF9, 0xDB, 0xA7, 0xFD, 0xF7, 0xDB, 0xA6, 0xF9, 0xF8, 0xDC, 0xAB, 0xF2, 0xFC, 0xDC, + 0xA7, 0xDD, 0xFD, 0xDC, 0xA7, 0xA9, 0xFB, 0xDB, 0xAB, 0x6E, 0xF7, 0xDD, 0xC0, 0x3A, 0xE6, 0xE4, + 0xDD, 0x16, 0xE8, 0xE6, 0xDB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB7, 0x01, 0xF5, 0xDD, 0xB6, 0x0B, 0xF6, 0xDD, + 0xB1, 0x22, 0xF7, 0xDD, 0xAE, 0x46, 0xF8, 0xDD, 0xAE, 0x77, 0xF8, 0xDE, 0xAE, 0xA8, 0xF9, 0xDE, + 0xAE, 0xCE, 0xFA, 0xDD, 0xAA, 0xED, 0xFB, 0xDD, 0xA8, 0xFD, 0xFA, 0xDC, 0xA7, 0xFF, 0xF9, 0xDC, + 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDD, 0xA9, 0xFF, 0xFB, 0xDF, + 0xAE, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xFC, 0xE4, 0xBA, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFC, 0xE9, + 0xC6, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, 0xCA, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEB, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFD, 0xEB, 0xCC, 0xFF, 0xFD, 0xEB, 0xCB, 0xFF, 0xFD, 0xEB, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC7, 0xFF, 0xFE, 0xE9, 0xC4, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFB, 0xE3, + 0xB8, 0xFF, 0xFA, 0xDF, 0xB0, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDC, 0xA8, 0xFF, 0xF7, 0xDB, + 0xA9, 0xFF, 0xF9, 0xDC, 0xA8, 0xFF, 0xFA, 0xDC, 0xA7, 0xFF, 0xFC, 0xDE, 0xA9, 0xFD, 0xFB, 0xDE, + 0xAA, 0xF2, 0xFB, 0xDE, 0xAD, 0xE1, 0xFD, 0xDF, 0xAF, 0xBC, 0xF9, 0xE1, 0xB5, 0x92, 0xF2, 0xDD, + 0xBB, 0x5A, 0xF3, 0xDE, 0xB2, 0x2D, 0xF2, 0xE0, 0xB0, 0x13, 0xF2, 0xE0, 0xC6, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDD, 0xB2, 0x03, 0xF4, 0xDF, 0xBA, 0x14, 0xF5, 0xE1, 0xBD, 0x33, 0xF9, 0xE3, + 0xB9, 0x5E, 0xFB, 0xE3, 0xB5, 0x8A, 0xFB, 0xDF, 0xB0, 0xB4, 0xFA, 0xDD, 0xAC, 0xD0, 0xFA, 0xDD, + 0xAB, 0xE8, 0xFA, 0xDD, 0xAB, 0xF4, 0xFA, 0xDD, 0xAB, 0xFB, 0xFB, 0xDD, 0xAB, 0xFF, 0xFA, 0xDD, + 0xAA, 0xFF, 0xFB, 0xDE, 0xAB, 0xFF, 0xFA, 0xDE, 0xAC, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE2, + 0xB2, 0xFF, 0xFC, 0xE3, 0xB7, 0xFF, 0xFA, 0xE4, 0xB9, 0xFF, 0xFA, 0xE5, 0xBC, 0xFF, 0xFA, 0xE6, + 0xBF, 0xFF, 0xFB, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, + 0xC1, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xFA, 0xE4, 0xBC, 0xFF, 0xF9, 0xE2, + 0xB8, 0xFF, 0xF9, 0xE1, 0xB5, 0xFF, 0xFA, 0xE1, 0xB3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xFB, 0xDF, 0xAC, 0xFE, 0xFB, 0xDF, 0xAC, 0xFD, 0xFA, 0xDE, 0xAD, 0xF8, 0xF9, 0xDE, + 0xAE, 0xF3, 0xFB, 0xDE, 0xAC, 0xEA, 0xFA, 0xDC, 0xA8, 0xDC, 0xF9, 0xDD, 0xAA, 0xC2, 0xF9, 0xDF, + 0xB2, 0x9E, 0xFC, 0xE2, 0xB9, 0x6D, 0xFD, 0xE1, 0xB9, 0x44, 0xF7, 0xE3, 0xC1, 0x23, 0xAC, 0xE5, + 0xFF, 0x0A, 0xA2, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xE2, 0xBE, 0x02, 0xF8, 0xE3, + 0xBD, 0x0B, 0xFB, 0xE4, 0xB9, 0x19, 0xFA, 0xE2, 0xB5, 0x35, 0xFB, 0xE1, 0xB4, 0x56, 0xFC, 0xE1, + 0xB3, 0x76, 0xFB, 0xE1, 0xB2, 0x97, 0xFB, 0xE0, 0xAF, 0xBA, 0xFB, 0xDF, 0xAD, 0xCF, 0xFB, 0xDF, + 0xAD, 0xE0, 0xFB, 0xDF, 0xAE, 0xEE, 0xFA, 0xDF, 0xAE, 0xF6, 0xFA, 0xDF, 0xAD, 0xFE, 0xFA, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDF, 0xAE, 0xFF, 0xFB, 0xDF, 0xAF, 0xFF, 0xFB, 0xDF, 0xB0, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xF9, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFC, 0xE1, + 0xAF, 0xFF, 0xFC, 0xE1, 0xAF, 0xFE, 0xFC, 0xE0, 0xAD, 0xFC, 0xFC, 0xE0, 0xAD, 0xF8, 0xFB, 0xE0, + 0xAD, 0xF1, 0xFB, 0xDF, 0xAD, 0xE6, 0xFC, 0xE0, 0xAF, 0xDB, 0xFC, 0xE1, 0xB1, 0xCD, 0xFB, 0xE0, + 0xB1, 0xAE, 0xFD, 0xE3, 0xB7, 0x8F, 0xFF, 0xE4, 0xBA, 0x69, 0xF8, 0xE1, 0xB7, 0x42, 0xF9, 0xE4, + 0xBD, 0x26, 0xFE, 0xE5, 0xBF, 0x12, 0xF5, 0xE2, 0xBB, 0x05, 0xEC, 0xE5, 0xC5, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE2, + 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE3, 0xB9, 0x04, 0xFC, 0xEB, + 0xC9, 0x16, 0xFC, 0xE9, 0xC7, 0x2B, 0xFB, 0xE2, 0xB6, 0x3E, 0xFB, 0xE1, 0xB2, 0x58, 0xFB, 0xE1, + 0xB3, 0x74, 0xFB, 0xE0, 0xB2, 0x90, 0xFA, 0xE0, 0xB0, 0xA4, 0xFA, 0xE0, 0xAF, 0xBB, 0xFA, 0xDF, + 0xAD, 0xD3, 0xF9, 0xDF, 0xAD, 0xE0, 0xF9, 0xDE, 0xAD, 0xEC, 0xF9, 0xDD, 0xAC, 0xF7, 0xF9, 0xDE, + 0xAD, 0xFB, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDD, 0xAB, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xF9, 0xDF, 0xAD, 0xFF, 0xFA, 0xDE, 0xAD, 0xFE, 0xF9, 0xDE, 0xAA, 0xF2, 0xF8, 0xDC, + 0xA7, 0xE7, 0xF8, 0xDC, 0xA8, 0xD5, 0xF9, 0xDE, 0xAB, 0xC4, 0xFC, 0xE0, 0xAF, 0xAD, 0xFC, 0xE1, + 0xB2, 0x99, 0xFB, 0xE1, 0xB4, 0x7E, 0xFB, 0xE2, 0xB6, 0x67, 0xFB, 0xE2, 0xB7, 0x4A, 0xFA, 0xE2, + 0xB9, 0x31, 0xFD, 0xE9, 0xC8, 0x1D, 0xFA, 0xFE, 0xFF, 0x0D, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xE9, 0xC7, 0x01, 0xFB, 0xE4, 0xBA, 0x03, 0xFC, 0xE3, 0xB6, 0x0A, 0xFC, 0xE2, + 0xB5, 0x12, 0xFB, 0xE1, 0xB3, 0x18, 0xFA, 0xE0, 0xB1, 0x22, 0xFB, 0xE0, 0xB0, 0x2C, 0xFA, 0xE0, + 0xAF, 0x33, 0xFB, 0xE1, 0xB1, 0x3E, 0xFA, 0xE1, 0xB3, 0x45, 0xFA, 0xE1, 0xB3, 0x4A, 0xFA, 0xE2, + 0xB3, 0x50, 0xFB, 0xE2, 0xB3, 0x53, 0xFC, 0xE2, 0xB5, 0x56, 0xFC, 0xE2, 0xB4, 0x55, 0xFB, 0xE2, + 0xB4, 0x51, 0xFB, 0xE2, 0xB3, 0x4B, 0xF9, 0xE0, 0xB1, 0x47, 0xFA, 0xE1, 0xB2, 0x47, 0xFA, 0xE0, + 0xB5, 0x43, 0xFA, 0xE2, 0xB6, 0x3D, 0xF9, 0xE1, 0xB3, 0x32, 0xFB, 0xE1, 0xB3, 0x28, 0xFA, 0xE2, + 0xB4, 0x20, 0xFB, 0xE2, 0xB6, 0x17, 0xFB, 0xE3, 0xB8, 0x0C, 0xFC, 0xE4, 0xBC, 0x08, 0xFB, 0xE6, + 0xC1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEB, 0xCA, 0x03, 0xFF, 0xED, 0xCB, 0x07, 0xFE, 0xE9, + 0xC1, 0x06, 0xFD, 0xE6, 0xBC, 0x07, 0xFC, 0xE5, 0xBB, 0x08, 0xFD, 0xE6, 0xBC, 0x08, 0xFD, 0xE8, + 0xBF, 0x07, 0xFE, 0xE9, 0xC1, 0x07, 0xFB, 0xE8, 0xC0, 0x06, 0xFF, 0xF1, 0xD2, 0x06, 0xFF, 0xFF, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xF0, 0xCF, 0x01, 0xFB, 0xE4, 0xB6, 0x01, 0xFC, 0xE3, + 0xB5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, 0xD0, 0x04, 0xFF, 0xED, 0xD2, 0x08, 0xFE, 0xEB, + 0xC7, 0x0A, 0xFD, 0xE7, 0xBF, 0x0B, 0xFC, 0xE6, 0xBD, 0x0C, 0xFC, 0xE7, 0xBE, 0x0D, 0xFC, 0xE9, + 0xC1, 0x0C, 0xFE, 0xE9, 0xC3, 0x0B, 0xFC, 0xE9, 0xC2, 0x09, 0xFB, 0xF0, 0xD7, 0x06, 0xFF, 0xFF, + 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x80, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, + 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x54, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x42, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, + 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x03, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0B, 0x8D, 0x81, 0x43, 0x0B, 0x8D, 0x81, 0x43, + 0x0A, 0x8E, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x42, 0x09, 0x90, 0x80, 0x41, 0x08, 0x90, 0x80, 0x41, + 0x08, 0x90, 0x80, 0x41, 0x08, 0x90, 0x81, 0x41, 0x08, 0x91, 0x81, 0x42, 0x09, 0x90, 0x81, 0x42, + 0x0A, 0x90, 0x81, 0x43, 0x0B, 0x90, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, + 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0C, 0x02, 0x9A, 0x68, + 0x3B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x01, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x93, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x81, 0x43, 0x0B, 0x9D, 0x81, 0x42, + 0x09, 0x9E, 0x81, 0x43, 0x0A, 0xA0, 0x84, 0x46, 0x0E, 0xA3, 0x87, 0x4C, 0x15, 0xA8, 0x8B, 0x52, + 0x1F, 0xAD, 0x90, 0x5B, 0x2B, 0xB5, 0x93, 0x5F, 0x32, 0xBA, 0x94, 0x61, 0x34, 0xBD, 0x94, 0x61, + 0x34, 0xBF, 0x94, 0x61, 0x34, 0xBE, 0x94, 0x60, 0x33, 0xBC, 0x92, 0x5D, 0x2E, 0xB8, 0x8D, 0x55, + 0x23, 0xB1, 0x89, 0x4E, 0x19, 0xAB, 0x85, 0x47, 0x11, 0xA7, 0x82, 0x44, 0x0B, 0xA4, 0x81, 0x42, + 0x09, 0xA2, 0x81, 0x43, 0x0A, 0xA1, 0x82, 0x44, 0x0B, 0xA0, 0x82, 0x44, 0x0C, 0x9F, 0x82, 0x44, + 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, + 0x0C, 0x7B, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x89, 0x4E, + 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x32, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, + 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x43, + 0x0B, 0xA7, 0x81, 0x42, 0x09, 0xA8, 0x83, 0x45, 0x0D, 0xAB, 0x89, 0x4F, 0x1A, 0xB3, 0x92, 0x5E, + 0x2F, 0xC1, 0x9A, 0x6C, 0x44, 0xD1, 0x9F, 0x74, 0x51, 0xDF, 0x9E, 0x75, 0x56, 0xE8, 0x9D, 0x76, + 0x59, 0xF1, 0x9C, 0x76, 0x5A, 0xF8, 0x9B, 0x75, 0x5A, 0xFB, 0x9A, 0x74, 0x5A, 0xFD, 0x99, 0x74, + 0x5A, 0xFD, 0x9A, 0x75, 0x5B, 0xFD, 0x9C, 0x76, 0x5C, 0xFC, 0x9E, 0x79, 0x5E, 0xF9, 0x9F, 0x79, + 0x5D, 0xF4, 0xA0, 0x79, 0x5A, 0xEC, 0xA0, 0x77, 0x57, 0xE4, 0x9E, 0x72, 0x4D, 0xD8, 0x96, 0x65, + 0x39, 0xC9, 0x8C, 0x55, 0x22, 0xBB, 0x85, 0x48, 0x11, 0xB1, 0x81, 0x42, 0x0A, 0xAD, 0x81, 0x43, + 0x0A, 0xAC, 0x82, 0x44, 0x0C, 0xAB, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA6, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, + 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x46, + 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x97, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0xA3, 0x81, 0x43, 0x0B, 0xA6, 0x81, 0x42, 0x0A, 0xA8, 0x87, 0x4C, + 0x15, 0xB1, 0x94, 0x60, 0x32, 0xC4, 0x9D, 0x71, 0x4C, 0xDB, 0x9E, 0x76, 0x57, 0xEE, 0x99, 0x72, + 0x56, 0xFA, 0x90, 0x68, 0x4D, 0xFE, 0x89, 0x60, 0x45, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x7F, 0x54, + 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x7A, 0x4E, 0x34, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x79, 0x4D, + 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x7F, 0x55, 0x3B, 0xFF, 0x83, 0x59, + 0x40, 0xFF, 0x88, 0x5F, 0x46, 0xFF, 0x8E, 0x67, 0x4D, 0xFF, 0x95, 0x6F, 0x55, 0xFF, 0x9D, 0x77, + 0x5D, 0xFC, 0xA2, 0x7C, 0x60, 0xF5, 0xA1, 0x78, 0x56, 0xE5, 0x99, 0x69, 0x3F, 0xD0, 0x8B, 0x53, + 0x1F, 0xBB, 0x82, 0x44, 0x0C, 0xB0, 0x81, 0x42, 0x0A, 0xAD, 0x82, 0x44, 0x0C, 0xAC, 0x82, 0x44, + 0x0C, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, + 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x44, + 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x63, 0x82, 0x44, + 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x92, 0x81, 0x43, + 0x0B, 0x98, 0x81, 0x43, 0x0A, 0x9B, 0x8A, 0x50, 0x1C, 0xA9, 0x99, 0x69, 0x40, 0xC8, 0x9F, 0x76, + 0x56, 0xE8, 0x97, 0x70, 0x53, 0xFA, 0x8B, 0x61, 0x45, 0xFF, 0x7E, 0x53, 0x37, 0xFF, 0x76, 0x48, + 0x2D, 0xFF, 0x71, 0x43, 0x28, 0xFF, 0x6F, 0x41, 0x26, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6F, 0x40, 0x26, 0xFF, 0x70, 0x41, 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x71, 0x43, + 0x28, 0xFF, 0x72, 0x44, 0x29, 0xFF, 0x73, 0x46, 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, + 0x2E, 0xFF, 0x76, 0x4A, 0x2F, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x7B, 0x50, 0x35, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x93, 0x6B, 0x51, 0xFF, 0x9D, 0x78, 0x5D, 0xFD, 0xA4, 0x7E, + 0x61, 0xF1, 0x9F, 0x73, 0x4F, 0xD9, 0x90, 0x5A, 0x2A, 0xBA, 0x83, 0x45, 0x0D, 0xA7, 0x81, 0x42, + 0x0A, 0xA3, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, + 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x7A, 0x81, 0x42, 0x09, 0x7F, 0x88, 0x4C, + 0x16, 0x8E, 0x9B, 0x6B, 0x42, 0xB9, 0x9F, 0x76, 0x57, 0xE7, 0x93, 0x6A, 0x4D, 0xFC, 0x81, 0x55, + 0x38, 0xFF, 0x74, 0x45, 0x29, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6A, 0x3A, 0x1F, 0xFF, 0x6A, 0x3A, + 0x1E, 0xFF, 0x6B, 0x3B, 0x1F, 0xFF, 0x6D, 0x3C, 0x20, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6F, 0x40, + 0x22, 0xFF, 0x71, 0x41, 0x23, 0xFF, 0x73, 0x43, 0x25, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x76, 0x46, 0x28, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x49, + 0x2B, 0xFF, 0x78, 0x49, 0x2C, 0xFF, 0x78, 0x4A, 0x2D, 0xFF, 0x78, 0x4B, 0x2E, 0xFF, 0x78, 0x4B, + 0x2F, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7D, 0x50, 0x35, 0xFF, 0x83, 0x58, 0x3C, 0xFF, 0x8D, 0x64, + 0x49, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0xA5, 0x7F, 0x63, 0xF4, 0xA2, 0x77, 0x53, 0xD2, 0x8E, 0x57, + 0x25, 0xA4, 0x81, 0x43, 0x0A, 0x8E, 0x81, 0x43, 0x0B, 0x8B, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x43, 0x0B, 0x03, 0x86, 0x4A, + 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, + 0x0C, 0x50, 0x81, 0x43, 0x0A, 0x5A, 0x83, 0x46, 0x0E, 0x62, 0x97, 0x65, 0x38, 0x8D, 0xA1, 0x77, + 0x56, 0xD3, 0x94, 0x6A, 0x4D, 0xFA, 0x7E, 0x50, 0x33, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x69, 0x38, + 0x1B, 0xFF, 0x67, 0x36, 0x19, 0xFF, 0x68, 0x37, 0x19, 0xFF, 0x6A, 0x38, 0x1A, 0xFF, 0x6C, 0x3A, + 0x1C, 0xFF, 0x6E, 0x3D, 0x1D, 0xFF, 0x71, 0x3F, 0x1F, 0xFF, 0x72, 0x41, 0x20, 0xFF, 0x74, 0x42, + 0x21, 0xFF, 0x76, 0x44, 0x22, 0xFF, 0x77, 0x46, 0x24, 0xFF, 0x78, 0x47, 0x25, 0xFF, 0x79, 0x48, + 0x26, 0xFF, 0x7A, 0x49, 0x27, 0xFF, 0x7B, 0x4A, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7C, 0x4C, + 0x2A, 0xFF, 0x7C, 0x4C, 0x2B, 0xFF, 0x7D, 0x4D, 0x2C, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7C, 0x4D, + 0x2E, 0xFF, 0x7C, 0x4D, 0x2F, 0xFF, 0x7B, 0x4D, 0x2F, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7D, 0x50, + 0x34, 0xFF, 0x82, 0x56, 0x3A, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9C, 0x76, 0x5B, 0xFF, 0xA6, 0x81, + 0x64, 0xE9, 0x9F, 0x72, 0x4A, 0xAF, 0x89, 0x4F, 0x19, 0x7B, 0x81, 0x42, 0x09, 0x6C, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x02, 0x94, 0x60, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0B, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x31, 0x80, 0x41, + 0x08, 0x37, 0x8E, 0x56, 0x23, 0x4C, 0xA4, 0x7A, 0x57, 0x9E, 0x9C, 0x74, 0x56, 0xEC, 0x84, 0x57, + 0x38, 0xFF, 0x70, 0x3F, 0x21, 0xFF, 0x68, 0x36, 0x18, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x35, + 0x16, 0xFF, 0x69, 0x37, 0x17, 0xFF, 0x6C, 0x39, 0x19, 0xFF, 0x6E, 0x3B, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x40, 0x1D, 0xFF, 0x75, 0x42, 0x1E, 0xFF, 0x77, 0x44, 0x20, 0xFF, 0x79, 0x45, + 0x21, 0xFF, 0x7A, 0x47, 0x22, 0xFF, 0x7C, 0x49, 0x23, 0xFF, 0x7D, 0x4A, 0x24, 0xFF, 0x7E, 0x4B, + 0x25, 0xFF, 0x7F, 0x4C, 0x26, 0xFF, 0x80, 0x4D, 0x27, 0xFF, 0x81, 0x4E, 0x28, 0xFF, 0x81, 0x4F, + 0x29, 0xFF, 0x81, 0x4F, 0x2A, 0xFF, 0x81, 0x50, 0x2B, 0xFF, 0x81, 0x50, 0x2C, 0xFF, 0x81, 0x50, + 0x2D, 0xFF, 0x81, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x7F, 0x50, 0x2F, 0xFF, 0x7E, 0x50, + 0x30, 0xFF, 0x7E, 0x50, 0x31, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x85, 0x5A, 0x3C, 0xFF, 0x92, 0x6A, + 0x4D, 0xFF, 0xA3, 0x7E, 0x62, 0xFA, 0xAA, 0x84, 0x64, 0xC8, 0x98, 0x66, 0x38, 0x72, 0x81, 0x42, + 0x09, 0x4B, 0x82, 0x43, 0x0B, 0x47, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x03, 0x85, 0x49, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0B, 0x19, 0x7D, 0x3C, 0x01, 0x1B, 0x9F, 0x70, + 0x46, 0x41, 0xA6, 0x7F, 0x60, 0xB4, 0x90, 0x65, 0x46, 0xF9, 0x75, 0x44, 0x24, 0xFF, 0x66, 0x32, + 0x13, 0xFF, 0x61, 0x2C, 0x0E, 0xFF, 0x61, 0x2B, 0x0C, 0xFF, 0x63, 0x2D, 0x0C, 0xFF, 0x65, 0x2E, + 0x0C, 0xFF, 0x68, 0x30, 0x0D, 0xFF, 0x6A, 0x32, 0x0E, 0xFF, 0x6D, 0x35, 0x0F, 0xFF, 0x6F, 0x38, + 0x11, 0xFF, 0x72, 0x3A, 0x13, 0xFF, 0x75, 0x3D, 0x14, 0xFF, 0x77, 0x40, 0x16, 0xFF, 0x7A, 0x43, + 0x19, 0xFF, 0x7D, 0x46, 0x1C, 0xFF, 0x7F, 0x49, 0x20, 0xFF, 0x81, 0x4C, 0x22, 0xFF, 0x83, 0x4E, + 0x24, 0xFF, 0x84, 0x4F, 0x26, 0xFF, 0x85, 0x50, 0x27, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x86, 0x51, + 0x29, 0xFF, 0x86, 0x52, 0x2A, 0xFF, 0x86, 0x52, 0x2B, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, + 0x2D, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x30, 0xFF, 0x82, 0x52, 0x30, 0xFF, 0x81, 0x52, 0x31, 0xFF, 0x80, 0x52, 0x33, 0xFF, 0x83, 0x55, + 0x37, 0xFF, 0x8C, 0x60, 0x43, 0xFF, 0x9C, 0x75, 0x59, 0xFF, 0xAB, 0x88, 0x6B, 0xDE, 0xA7, 0x7D, + 0x58, 0x72, 0x83, 0x45, 0x0D, 0x2D, 0x81, 0x42, 0x0A, 0x28, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0A, 0x02, 0x94, 0x5F, 0x2E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x4A, + 0x13, 0x01, 0x81, 0x43, 0x0B, 0x01, 0x82, 0x44, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x07, 0x81, 0x42, 0x0A, 0x0A, 0x77, 0x31, 0x00, 0x09, 0xB0, 0x8A, 0x69, 0x3F, 0xA4, 0x7D, + 0x5E, 0xC8, 0x85, 0x57, 0x36, 0xFF, 0x6A, 0x35, 0x14, 0xFF, 0x5F, 0x29, 0x09, 0xFF, 0x5D, 0x26, + 0x05, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x64, 0x2B, 0x05, 0xFF, 0x67, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x06, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, + 0x0A, 0xFF, 0x78, 0x3B, 0x0B, 0xFF, 0x79, 0x3D, 0x0D, 0xFF, 0x7B, 0x40, 0x10, 0xFF, 0x7E, 0x43, + 0x13, 0xFF, 0x81, 0x48, 0x18, 0xFF, 0x84, 0x4C, 0x1E, 0xFF, 0x87, 0x50, 0x23, 0xFF, 0x89, 0x53, + 0x27, 0xFF, 0x8A, 0x55, 0x29, 0xFF, 0x8A, 0x56, 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x56, + 0x2C, 0xFF, 0x8A, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2E, 0xFF, 0x88, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x2F, 0xFF, 0x85, 0x55, 0x30, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x53, + 0x31, 0xFF, 0x83, 0x55, 0x34, 0xFF, 0x89, 0x5C, 0x3D, 0xFF, 0x97, 0x6F, 0x51, 0xFF, 0xAB, 0x86, + 0x6A, 0xEA, 0xB1, 0x8D, 0x6E, 0x78, 0x8E, 0x56, 0x23, 0x1A, 0x7F, 0x3F, 0x05, 0x12, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x80, 0x41, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8B, 0x51, 0x1D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x7E, 0x3D, + 0x03, 0x03, 0x5C, 0x09, 0x00, 0x02, 0xB7, 0x95, 0x77, 0x3E, 0xA3, 0x7B, 0x5C, 0xD0, 0x81, 0x50, + 0x2D, 0xFF, 0x67, 0x31, 0x0F, 0xFF, 0x5F, 0x28, 0x07, 0xFF, 0x5F, 0x28, 0x05, 0xFF, 0x62, 0x2A, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x67, 0x2E, 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x0A, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, + 0x09, 0xFF, 0x7D, 0x3E, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x42, 0x0E, 0xFF, 0x82, 0x46, + 0x13, 0xFF, 0x85, 0x4B, 0x19, 0xFF, 0x89, 0x51, 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8D, 0x58, + 0x2B, 0xFF, 0x8E, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8C, 0x59, + 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8A, 0x58, 0x2F, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x88, 0x5A, 0x39, 0xFF, 0x95, 0x6B, + 0x4C, 0xFF, 0xAA, 0x86, 0x6A, 0xF2, 0xB6, 0x95, 0x79, 0x7C, 0x9D, 0x6D, 0x41, 0x0F, 0x78, 0x34, + 0x00, 0x06, 0x82, 0x44, 0x0D, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0D, 0x01, 0x86, 0x49, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBB, 0x9A, 0x7E, 0x37, 0xA3, 0x7C, 0x5D, 0xCF, 0x7F, 0x4E, 0x2B, 0xFF, 0x67, 0x30, + 0x0E, 0xFF, 0x60, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x68, 0x2E, + 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6E, 0x35, + 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, + 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7E, 0x3F, 0x0B, 0xFF, 0x7F, 0x40, 0x0B, 0xFF, 0x7F, 0x41, + 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x84, 0x46, 0x11, 0xFF, 0x87, 0x4C, + 0x18, 0xFF, 0x8C, 0x53, 0x22, 0xFF, 0x8F, 0x59, 0x29, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x90, 0x5B, + 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x33, 0xFF, 0x89, 0x5A, + 0x38, 0xFF, 0x95, 0x6A, 0x4A, 0xFF, 0xAB, 0x87, 0x6A, 0xF3, 0xBA, 0x99, 0x7E, 0x74, 0xA8, 0x7C, + 0x51, 0x07, 0x61, 0x13, 0x00, 0x01, 0x83, 0x45, 0x0D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0xA9, + 0x90, 0x2C, 0xA7, 0x80, 0x61, 0xC6, 0x83, 0x51, 0x2D, 0xFF, 0x69, 0x32, 0x0F, 0xFF, 0x63, 0x2A, + 0x07, 0xFF, 0x64, 0x2A, 0x06, 0xFF, 0x66, 0x2D, 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x08, 0xFF, 0x6E, 0x34, 0x08, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x32, + 0x06, 0xFF, 0x6B, 0x36, 0x08, 0xFF, 0x75, 0x3C, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x86, 0x49, 0x12, 0xFF, 0x8B, 0x51, 0x1C, 0xFF, 0x90, 0x58, + 0x27, 0xFF, 0x92, 0x5C, 0x2D, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x91, 0x5C, 0x2F, 0xFF, 0x8F, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x32, 0xFF, 0x8B, 0x5B, 0x38, 0xFF, 0x98, 0x6C, 0x4B, 0xFF, 0xAE, 0x89, 0x6C, 0xED, 0xBF, 0x9F, + 0x85, 0x62, 0xD1, 0xB1, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB2, 0x9C, 0x19, 0xAD, 0x88, + 0x69, 0xB4, 0x88, 0x57, 0x33, 0xFF, 0x6C, 0x34, 0x10, 0xFF, 0x65, 0x2B, 0x07, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x6F, 0x35, + 0x08, 0xFF, 0x68, 0x33, 0x06, 0xFF, 0x60, 0x32, 0x08, 0xFF, 0x92, 0x74, 0x58, 0xFF, 0xA0, 0x89, + 0x71, 0xFF, 0x65, 0x3D, 0x14, 0xFF, 0x67, 0x36, 0x06, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x85, 0x46, 0x0B, 0xFF, 0x87, 0x48, + 0x0F, 0xFF, 0x8B, 0x50, 0x18, 0xFF, 0x91, 0x58, 0x25, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, + 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8D, 0x5D, 0x39, 0xFF, 0x9B, 0x6F, 0x4E, 0xFF, 0xB2, 0x8E, + 0x71, 0xE4, 0xC8, 0xAB, 0x93, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xD4, 0xC1, 0x07, 0xB5, 0x92, 0x74, 0x8D, 0x90, 0x61, + 0x3C, 0xFE, 0x70, 0x39, 0x13, 0xFF, 0x67, 0x2D, 0x08, 0xFF, 0x68, 0x2D, 0x07, 0xFF, 0x6C, 0x30, + 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x72, 0x36, 0x09, 0xFF, 0x71, 0x38, 0x09, 0xFF, 0x67, 0x32, + 0x05, 0xFF, 0x6C, 0x45, 0x1E, 0xFF, 0xA0, 0x8C, 0x77, 0xFF, 0xB8, 0xAE, 0xA1, 0xFF, 0xE4, 0xE2, + 0xDD, 0xFF, 0xC3, 0xB7, 0xA8, 0xFF, 0x74, 0x53, 0x2E, 0xFF, 0x66, 0x38, 0x06, 0xFF, 0x76, 0x40, + 0x0A, 0xFF, 0x81, 0x45, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0E, 0xFF, 0x8C, 0x50, 0x18, 0xFF, 0x92, 0x5A, + 0x26, 0xFF, 0x95, 0x5F, 0x2E, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x90, 0x60, 0x3A, 0xFF, 0xA0, 0x75, + 0x53, 0xFF, 0xB7, 0x95, 0x78, 0xCD, 0xD0, 0xB8, 0xA3, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9F, 0x83, 0x59, 0x9C, 0x70, 0x4C, 0xF1, 0x77, 0x40, + 0x19, 0xFF, 0x69, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x68, 0x34, 0x05, 0xFF, 0x70, 0x4A, + 0x24, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xCD, 0xC9, 0xC1, 0xFF, 0x9D, 0x94, + 0x83, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xDD, 0xD6, 0xCE, 0xFF, 0x8E, 0x74, 0x54, 0xFF, 0x68, 0x3C, + 0x0B, 0xFF, 0x74, 0x40, 0x0A, 0xFF, 0x80, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, + 0x0F, 0xFF, 0x8E, 0x53, 0x1A, 0xFF, 0x94, 0x5D, 0x29, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x94, 0x64, + 0x3E, 0xFF, 0xA7, 0x7F, 0x5C, 0xFF, 0xBE, 0x9F, 0x83, 0xA0, 0xD7, 0xC4, 0xB1, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xB0, 0x96, 0x23, 0xAA, 0x83, 0x61, 0xCB, 0x83, 0x4E, 0x26, 0xFF, 0x6D, 0x33, + 0x0C, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x75, 0x3A, 0x09, 0xFF, 0x6B, 0x37, 0x06, 0xFF, 0x6F, 0x4A, 0x21, 0xFF, 0xC5, 0xBA, + 0xAD, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xD7, 0xD4, + 0xD0, 0xFF, 0x95, 0x8B, 0x78, 0xFF, 0xB2, 0xAA, 0x9C, 0xFF, 0xE6, 0xE3, 0xDD, 0xFF, 0xAB, 0x98, + 0x81, 0xFF, 0x6D, 0x46, 0x17, 0xFF, 0x70, 0x3E, 0x08, 0xFF, 0x7E, 0x46, 0x0C, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x96, 0x60, + 0x2D, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x91, 0x5E, + 0x34, 0xFF, 0x9A, 0x6C, 0x45, 0xFF, 0xB1, 0x8B, 0x6A, 0xF4, 0xC7, 0xA8, 0x8E, 0x61, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE2, + 0xD4, 0x04, 0xB9, 0x96, 0x77, 0x86, 0x94, 0x63, 0x3C, 0xFE, 0x73, 0x3A, 0x12, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x78, 0x3C, + 0x0A, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6D, 0x45, 0x1A, 0xFF, 0xC0, 0xB4, 0xA5, 0xFF, 0xEB, 0xEA, + 0xEB, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, + 0xE8, 0xFF, 0xE2, 0xE0, 0xDD, 0xFF, 0x9A, 0x90, 0x7F, 0xFF, 0x92, 0x86, 0x72, 0xFF, 0xDE, 0xDB, + 0xD6, 0xFF, 0xC5, 0xBA, 0xAB, 0xFF, 0x7A, 0x59, 0x2F, 0xFF, 0x6C, 0x3D, 0x08, 0xFF, 0x7B, 0x45, + 0x0C, 0xFF, 0x86, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8F, 0x52, + 0x17, 0xFF, 0x96, 0x5D, 0x28, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x92, 0x5E, + 0x30, 0xFF, 0x94, 0x62, 0x37, 0xFF, 0xA3, 0x77, 0x52, 0xFF, 0xBB, 0x99, 0x7A, 0xCC, 0xD1, 0xB7, + 0xA0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA9, + 0x8D, 0x36, 0xA7, 0x7C, 0x58, 0xE1, 0x7F, 0x48, 0x1E, 0xFF, 0x6F, 0x34, 0x0A, 0xFF, 0x70, 0x33, + 0x07, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x74, 0x3C, + 0x08, 0xFF, 0x6B, 0x3F, 0x12, 0xFF, 0xB5, 0xA5, 0x93, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE5, 0xE4, + 0xE4, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xA8, 0xA0, 0x91, 0xFF, 0x7C, 0x6D, + 0x56, 0xFF, 0xC9, 0xC3, 0xBA, 0xFF, 0xD9, 0xD3, 0xCC, 0xFF, 0x90, 0x76, 0x55, 0xFF, 0x6B, 0x40, + 0x0C, 0xFF, 0x77, 0x43, 0x0A, 0xFF, 0x85, 0x4A, 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8E, 0x4F, 0x12, 0xFF, 0x94, 0x5A, 0x22, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x95, 0x60, + 0x2F, 0xFF, 0x94, 0x5F, 0x31, 0xFF, 0x9A, 0x69, 0x3F, 0xFF, 0xAF, 0x87, 0x63, 0xFD, 0xC5, 0xA8, + 0x8B, 0x7D, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xEE, 0xE4, 0x06, 0xB9, 0x95, + 0x73, 0x94, 0x92, 0x60, 0x36, 0xFF, 0x76, 0x3B, 0x10, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x70, 0x3D, + 0x0B, 0xFF, 0xA7, 0x91, 0x77, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xBA, 0xB3, + 0xAA, 0xFF, 0x72, 0x62, 0x48, 0xFF, 0xAB, 0xA2, 0x92, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, 0xA9, 0x97, + 0x80, 0xFF, 0x70, 0x4A, 0x19, 0xFF, 0x73, 0x41, 0x08, 0xFF, 0x82, 0x4A, 0x0D, 0xFF, 0x8B, 0x4E, + 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0F, 0xFF, 0x93, 0x56, 0x1C, 0xFF, 0x98, 0x61, + 0x2C, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x97, 0x62, 0x34, 0xFF, 0xA4, 0x76, 0x4D, 0xFF, 0xBC, 0x99, + 0x79, 0xD7, 0xD3, 0xB9, 0xA1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xB4, 0x9A, 0x30, 0xA9, 0x7F, + 0x58, 0xE0, 0x83, 0x4A, 0x1E, 0xFF, 0x74, 0x37, 0x0A, 0xFF, 0x75, 0x37, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x7C, 0x42, 0x09, 0xFF, 0x9F, 0x7E, + 0x5B, 0xFF, 0xE9, 0xE6, 0xE3, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xCB, 0xC7, 0xBE, 0xFF, 0x75, 0x65, 0x49, 0xFF, 0x8E, 0x80, 0x6A, 0xFF, 0xD9, 0xD7, + 0xD3, 0xFF, 0xC0, 0xB6, 0xA8, 0xFF, 0x7C, 0x5C, 0x31, 0xFF, 0x6F, 0x41, 0x09, 0xFF, 0x7E, 0x49, + 0x0D, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x92, 0x54, + 0x18, 0xFF, 0x97, 0x60, 0x2A, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xB2, 0x8A, + 0x64, 0xFE, 0xCA, 0xAB, 0x8E, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x9F, 0x80, 0x7C, 0x99, 0x67, + 0x3C, 0xFE, 0x7C, 0x3F, 0x12, 0xFF, 0x76, 0x38, 0x09, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, + 0x0A, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x82, 0x46, 0x0B, 0xFF, 0xBA, 0x9F, + 0x81, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0x82, 0x74, 0x5C, 0xFF, 0x77, 0x66, + 0x49, 0xFF, 0xCB, 0xC5, 0xBD, 0xFF, 0xD4, 0xCF, 0xC9, 0xFF, 0x90, 0x78, 0x55, 0xFF, 0x6F, 0x45, + 0x0F, 0xFF, 0x7B, 0x48, 0x0C, 0xFF, 0x89, 0x4F, 0x0F, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x91, 0x53, 0x15, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x9B, 0x65, 0x33, 0xFF, 0xA9, 0x7B, + 0x50, 0xFF, 0xC2, 0xA0, 0x7E, 0xC6, 0xDA, 0xC3, 0xAC, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC9, 0x16, 0xB4, 0x8C, 0x67, 0xC4, 0x8C, 0x55, + 0x26, 0xFF, 0x7A, 0x3B, 0x0C, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7F, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0B, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0C, 0xFF, 0x8C, 0x58, + 0x20, 0xFF, 0xD3, 0xC3, 0xB0, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0x94, 0x88, + 0x73, 0xFF, 0x6B, 0x58, 0x35, 0xFF, 0xB7, 0xAE, 0xA0, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xA9, 0x99, + 0x82, 0xFF, 0x74, 0x4F, 0x1E, 0xFF, 0x77, 0x47, 0x0C, 0xFF, 0x87, 0x50, 0x11, 0xFF, 0x91, 0x55, + 0x12, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x12, 0xFF, 0x97, 0x56, + 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x15, 0xFF, 0x98, 0x60, 0x29, 0xFF, 0xA3, 0x70, + 0x41, 0xFF, 0xBA, 0x94, 0x6E, 0xF2, 0xD1, 0xB4, 0x98, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, 0x95, 0x45, 0xA8, 0x7A, 0x50, 0xF0, 0x84, 0x48, + 0x18, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x84, 0x43, 0x0B, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x8C, 0x4E, + 0x0B, 0xFF, 0x98, 0x6A, 0x36, 0xFF, 0xE2, 0xDA, 0xCF, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xA8, 0xA0, 0x90, 0xFF, 0x68, 0x54, 0x32, 0xFF, 0xA0, 0x93, 0x7D, 0xFF, 0xE2, 0xE1, + 0xDF, 0xFF, 0xC3, 0xBB, 0xAD, 0xFF, 0x81, 0x63, 0x38, 0xFF, 0x74, 0x47, 0x0E, 0xFF, 0x85, 0x50, + 0x12, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x14, 0xFF, 0x9E, 0x66, + 0x31, 0xFF, 0xB3, 0x88, 0x5D, 0xFF, 0xCB, 0xAB, 0x8B, 0x91, 0xF9, 0xEF, 0xE2, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xA3, 0x82, 0x80, 0x9C, 0x68, 0x3B, 0xFF, 0x81, 0x43, + 0x11, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x83, 0x42, 0x0B, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x8D, 0x50, 0x0C, 0xFF, 0xA8, 0x83, 0x56, 0xFF, 0xEC, 0xE8, 0xE3, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xBD, 0xB7, 0xAC, 0xFF, 0x6F, 0x5C, 0x38, 0xFF, 0x8A, 0x79, + 0x5C, 0xFF, 0xDB, 0xD8, 0xD3, 0xFF, 0xD9, 0xD5, 0xCF, 0xFF, 0x94, 0x7E, 0x5C, 0xFF, 0x74, 0x4C, + 0x15, 0xFF, 0x81, 0x50, 0x13, 0xFF, 0x90, 0x58, 0x15, 0xFF, 0x99, 0x5B, 0x16, 0xFF, 0x9C, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x95, 0x58, + 0x1B, 0xFF, 0xAB, 0x7A, 0x4B, 0xFF, 0xC5, 0xA3, 0x80, 0xCB, 0xBA, 0xA6, 0x90, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xE5, 0xD6, 0x0B, 0xBA, 0x93, 0x6C, 0xB8, 0x94, 0x5C, 0x2B, 0xFF, 0x81, 0x41, + 0x0D, 0xFF, 0x82, 0x41, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5C, 0x15, 0xFF, 0x92, 0x5A, 0x16, 0xFF, 0xBC, 0xA1, 0x7F, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x7D, 0x6D, + 0x4C, 0xFF, 0x7A, 0x67, 0x43, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xAB, 0x9D, + 0x85, 0xFF, 0x7A, 0x57, 0x24, 0xFF, 0x7E, 0x50, 0x13, 0xFF, 0x8F, 0x59, 0x17, 0xFF, 0x99, 0x5E, + 0x18, 0xFF, 0x9E, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9D, 0x5D, + 0x14, 0xFF, 0x9C, 0x5B, 0x12, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x10, 0xFF, 0xA1, 0x6A, 0x31, 0xFF, 0xBF, 0x99, 0x71, 0xEC, 0xAF, 0x9A, 0x82, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE1, 0xCD, 0xB7, 0x27, 0xB4, 0x88, 0x5D, 0xDB, 0x8F, 0x54, 0x20, 0xFF, 0x82, 0x42, + 0x0C, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8B, 0x49, 0x0C, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9E, 0x5D, 0x15, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0x97, 0x62, 0x22, 0xFF, 0xCB, 0xB8, + 0xA1, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xDD, 0xDB, + 0xD7, 0xFF, 0x90, 0x82, 0x66, 0xFF, 0x71, 0x5D, 0x35, 0xFF, 0xBD, 0xB4, 0xA4, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xC3, 0xBA, 0xAC, 0xFF, 0x85, 0x68, 0x3C, 0xFF, 0x7B, 0x50, 0x15, 0xFF, 0x8D, 0x59, + 0x19, 0xFF, 0x99, 0x5F, 0x1B, 0xFF, 0x9F, 0x62, 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA1, 0x62, 0x19, 0xFF, 0x9F, 0x5E, 0x14, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, + 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x96, 0x54, + 0x10, 0xFF, 0x9B, 0x5E, 0x1F, 0xFF, 0xB7, 0x8B, 0x5D, 0xFB, 0xD0, 0xB3, 0x94, 0x6B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD3, 0xB5, 0x97, 0x45, 0xAE, 0x7F, 0x51, 0xEF, 0x8D, 0x4F, 0x19, 0xFF, 0x85, 0x43, + 0x0B, 0xFF, 0x8A, 0x47, 0x0C, 0xFF, 0x8F, 0x4D, 0x0D, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x97, 0x55, + 0x0F, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0xA1, 0x61, 0x1A, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0x9E, 0x62, 0x1B, 0xFF, 0x9D, 0x6F, + 0x34, 0xFF, 0xD5, 0xCA, 0xBA, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xA5, 0x9A, 0x85, 0xFF, 0x6F, 0x5A, 0x30, 0xFF, 0xA9, 0x9D, + 0x86, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xD6, 0xD2, 0xCC, 0xFF, 0x96, 0x80, 0x5E, 0xFF, 0x7A, 0x54, + 0x1C, 0xFF, 0x89, 0x59, 0x1A, 0xFF, 0x99, 0x61, 0x1D, 0xFF, 0xA1, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA3, 0x63, 0x1A, 0xFF, 0xA0, 0x5F, + 0x13, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x9A, 0x5B, 0x18, 0xFF, 0xB0, 0x7E, 0x49, 0xFF, 0xCF, 0xAE, 0x8C, 0x94, 0xFF, 0xFF, + 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAA, 0x88, 0x64, 0xA9, 0x77, 0x47, 0xFC, 0x8D, 0x4D, 0x15, 0xFF, 0x89, 0x46, + 0x0B, 0xFF, 0x8E, 0x4B, 0x0D, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0x9E, 0x64, + 0x1D, 0xFF, 0xA6, 0x7F, 0x4B, 0xFF, 0xDA, 0xD4, 0xCC, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xB8, 0xB1, 0xA1, 0xFF, 0x74, 0x60, + 0x37, 0xFF, 0x97, 0x86, 0x68, 0xFF, 0xDE, 0xDC, 0xD8, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAB, 0x9D, + 0x84, 0xFF, 0x7F, 0x5E, 0x2B, 0xFF, 0x86, 0x59, 0x1B, 0xFF, 0x98, 0x63, 0x20, 0xFF, 0xA2, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x69, + 0x1E, 0xFF, 0xA3, 0x62, 0x16, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0xAD, 0x77, 0x3E, 0xFF, 0xCC, 0xAA, 0x85, 0xB4, 0xF3, 0xEC, + 0xE1, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xCA, 0xA5, 0x81, 0x80, 0xA7, 0x71, 0x3D, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8C, 0x49, + 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x97, 0x55, 0x11, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA5, 0x68, + 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xA9, 0x6D, + 0x24, 0xFF, 0x9F, 0x67, 0x21, 0xFF, 0xB0, 0x90, 0x66, 0xFF, 0xDC, 0xDA, 0xD7, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE1, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xCA, 0xC4, + 0xBA, 0xFF, 0x7F, 0x6D, 0x47, 0xFF, 0x88, 0x75, 0x51, 0xFF, 0xD2, 0xCD, 0xC4, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xC0, 0xB7, 0xA8, 0xFF, 0x89, 0x6E, 0x42, 0xFF, 0x83, 0x5A, 0x1E, 0xFF, 0x96, 0x64, + 0x22, 0xFF, 0xA2, 0x6A, 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x23, 0xFF, 0xA6, 0x66, 0x1B, 0xFF, 0xA2, 0x5F, 0x13, 0xFF, 0x9F, 0x5C, + 0x11, 0xFF, 0x9F, 0x5D, 0x14, 0xFF, 0xAC, 0x74, 0x36, 0xFF, 0xCA, 0xA4, 0x7B, 0xCB, 0xE3, 0xCF, + 0xB6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x05, 0xCB, 0xA7, 0x81, 0x95, 0xA5, 0x6D, 0x37, 0xFF, 0x90, 0x4E, 0x12, 0xFF, 0x90, 0x4C, + 0x0C, 0xFF, 0x96, 0x54, 0x11, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xA9, 0x6C, + 0x26, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAA, 0x6F, 0x26, 0xFF, 0xA0, 0x6C, 0x28, 0xFF, 0xBA, 0xA2, 0x81, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xD2, 0xCD, + 0xC4, 0xFF, 0xB2, 0xA3, 0x89, 0xFF, 0xCB, 0xC0, 0xAF, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0x8E, 0x7F, 0x5E, 0xFF, 0x81, 0x6D, 0x45, 0xFF, 0xC4, 0xBD, + 0xB0, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD0, 0xCB, 0xC3, 0xFF, 0x98, 0x83, 0x5F, 0xFF, 0x82, 0x5D, + 0x23, 0xFF, 0x93, 0x64, 0x23, 0xFF, 0xA2, 0x6C, 0x27, 0xFF, 0xAA, 0x6F, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA8, 0x69, 0x1E, 0xFF, 0xA2, 0x60, + 0x13, 0xFF, 0xA0, 0x5E, 0x13, 0xFF, 0xAB, 0x72, 0x31, 0xFF, 0xC9, 0xA1, 0x76, 0xDB, 0xE2, 0xCE, + 0xB5, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x08, 0xCB, 0xA6, 0x80, 0xA3, 0xA5, 0x6B, 0x33, 0xFF, 0x92, 0x4F, 0x11, 0xFF, 0x95, 0x52, + 0x12, 0xFF, 0xA1, 0x62, 0x21, 0xFF, 0xA7, 0x6A, 0x28, 0xFF, 0xAA, 0x6D, 0x29, 0xFF, 0xAC, 0x70, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAB, 0x71, 0x29, 0xFF, 0xA3, 0x71, 0x31, 0xFF, 0xC1, 0xB0, + 0x98, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xA3, 0x96, + 0x7B, 0xFF, 0x7F, 0x62, 0x30, 0xFF, 0x99, 0x7F, 0x53, 0xFF, 0xDF, 0xDB, 0xD5, 0xFF, 0xDC, 0xDD, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xDD, 0xDC, 0xD9, 0xFF, 0xA2, 0x97, 0x7E, 0xFF, 0x82, 0x70, + 0x48, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDA, 0xD8, 0xD6, 0xFF, 0xAA, 0x9C, + 0x81, 0xFF, 0x85, 0x64, 0x2F, 0xFF, 0x90, 0x64, 0x25, 0xFF, 0xA2, 0x6E, 0x2A, 0xFF, 0xAB, 0x72, + 0x2A, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xAA, 0x6B, + 0x20, 0xFF, 0xA3, 0x61, 0x14, 0xFF, 0xAC, 0x71, 0x2E, 0xFF, 0xC9, 0xA0, 0x73, 0xE6, 0xE3, 0xCF, + 0xB6, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFB, + 0xF6, 0x09, 0xCC, 0xA7, 0x80, 0xAB, 0xA5, 0x6B, 0x31, 0xFF, 0x96, 0x54, 0x15, 0xFF, 0xA0, 0x61, + 0x23, 0xFF, 0xA7, 0x6B, 0x2B, 0xFF, 0xAA, 0x6E, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x74, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xA7, 0x7A, + 0x3E, 0xFF, 0xC8, 0xBC, 0xAD, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD7, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xB6, 0xAF, + 0x9E, 0xFF, 0x8B, 0x78, 0x50, 0xFF, 0x98, 0x83, 0x5B, 0xFF, 0xD5, 0xCD, 0xBF, 0xFF, 0xE1, 0xDF, + 0xDB, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xDA, 0xD7, 0xD0, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, 0xE0, 0xFF, 0xB5, 0xAD, + 0x9A, 0xFF, 0x89, 0x77, 0x52, 0xFF, 0xB0, 0xA5, 0x8F, 0xFF, 0xDD, 0xDC, 0xDB, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xBC, 0xB3, 0xA2, 0xFF, 0x8C, 0x72, 0x43, 0xFF, 0x8C, 0x64, 0x27, 0xFF, 0xA1, 0x6F, + 0x2C, 0xFF, 0xAC, 0x75, 0x2D, 0xFF, 0xB1, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x77, 0x2E, 0xFF, 0xB1, 0x75, + 0x2D, 0xFF, 0xAB, 0x6C, 0x23, 0xFF, 0xAE, 0x73, 0x2E, 0xFF, 0xC9, 0xA0, 0x71, 0xEB, 0xE4, 0xCF, + 0xB6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFA, + 0xF5, 0x09, 0xCD, 0xA8, 0x80, 0xAC, 0xA9, 0x70, 0x35, 0xFF, 0xA1, 0x63, 0x27, 0xFF, 0xA6, 0x6A, + 0x2D, 0xFF, 0xAA, 0x6F, 0x2E, 0xFF, 0xAE, 0x72, 0x2F, 0xFF, 0xB1, 0x75, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xAF, 0x7A, + 0x34, 0xFF, 0xB3, 0x91, 0x61, 0xFF, 0xD1, 0xCC, 0xC4, 0xFF, 0xD7, 0xD7, 0xD8, 0xFF, 0xD6, 0xD6, + 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xC8, 0xBF, 0xAF, 0xFF, 0x9D, 0x8A, 0x64, 0xFF, 0xAE, 0x9C, + 0x7B, 0xFF, 0xBB, 0xAD, 0x93, 0xFF, 0xB1, 0xA3, 0x88, 0xFF, 0xB4, 0xA6, 0x8B, 0xFF, 0xBB, 0xAF, + 0x97, 0xFF, 0xD8, 0xD4, 0xCC, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xC3, 0xBE, 0xB1, 0xFF, 0x90, 0x81, 0x5D, 0xFF, 0xA9, 0x9D, 0x82, 0xFF, 0xDA, 0xD8, + 0xD6, 0xFF, 0xE0, 0xE1, 0xE3, 0xFF, 0xCD, 0xC9, 0xBE, 0xFF, 0x99, 0x84, 0x5D, 0xFF, 0x8C, 0x67, + 0x2C, 0xFF, 0xA0, 0x71, 0x2F, 0xFF, 0xAE, 0x78, 0x31, 0xFF, 0xB4, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB3, 0x78, 0x31, 0xFF, 0xB5, 0x7E, 0x3C, 0xFF, 0xCB, 0xA2, 0x72, 0xED, 0xE5, 0xD0, + 0xB6, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFD, 0x08, 0xD0, 0xAB, 0x83, 0xA6, 0xB3, 0x7D, 0x47, 0xFF, 0xA9, 0x6E, 0x33, 0xFF, 0xAA, 0x6E, + 0x30, 0xFF, 0xAE, 0x73, 0x32, 0xFF, 0xB1, 0x77, 0x33, 0xFF, 0xB4, 0x7A, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBD, 0x86, 0x40, 0xFF, 0xC0, 0x8E, + 0x4E, 0xFF, 0xB9, 0x8B, 0x4E, 0xFF, 0xBE, 0xA2, 0x7C, 0xFF, 0xD7, 0xD4, 0xD0, 0xFF, 0xD8, 0xD8, + 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xB6, 0xAB, 0x91, 0xFF, 0xA7, 0x95, + 0x71, 0xFF, 0xE5, 0xE2, 0xDC, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xA4, 0x94, 0x71, 0xFF, 0x85, 0x6F, + 0x41, 0xFF, 0xB6, 0xAC, 0x96, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xCF, 0xCC, 0xC3, 0xFF, 0x9A, 0x8D, 0x6D, 0xFF, 0xA5, 0x98, + 0x7C, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xD8, 0xD6, 0xD1, 0xFF, 0xA8, 0x97, + 0x76, 0xFF, 0x90, 0x6C, 0x32, 0xFF, 0xA4, 0x75, 0x32, 0xFF, 0xB3, 0x7C, 0x34, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, 0x35, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xBD, 0x89, 0x4B, 0xFF, 0xD0, 0xAA, 0x7D, 0xE8, 0xE5, 0xD0, + 0xB6, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x06, 0xD4, 0xB1, 0x8C, 0x9A, 0xBB, 0x89, 0x55, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAE, 0x73, + 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB5, 0x7B, 0x37, 0xFF, 0xB7, 0x7D, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC5, 0x94, 0x55, 0xFF, 0xC5, 0x95, + 0x57, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBB, 0x90, 0x55, 0xFF, 0xC7, 0xB1, 0x92, 0xFF, 0xDC, 0xDB, + 0xD9, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDF, 0xDF, 0xDE, 0xFF, 0xBD, 0xB5, 0xA2, 0xFF, 0xB6, 0xAB, + 0x91, 0xFF, 0xB6, 0xAA, 0x90, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xD0, 0xCB, 0xBF, 0xFF, 0xB6, 0xAD, + 0x98, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xA6, 0x9C, + 0x81, 0xFF, 0xA2, 0x96, 0x78, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xE1, 0xE1, 0xE3, 0xFF, 0xDF, 0xDE, + 0xDB, 0xFF, 0xB7, 0xA8, 0x8A, 0xFF, 0x9D, 0x75, 0x39, 0xFF, 0xB0, 0x7C, 0x37, 0xFF, 0xBA, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x81, 0x3A, 0xFF, 0xC1, 0x8F, 0x53, 0xFF, 0xD5, 0xB1, 0x87, 0xDF, 0xE6, 0xD1, + 0xB7, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x02, 0xD5, 0xB3, 0x8C, 0x87, 0xC0, 0x91, 0x5D, 0xFF, 0xB1, 0x79, 0x3D, 0xFF, 0xB1, 0x77, + 0x37, 0xFF, 0xB5, 0x7B, 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xBA, 0x81, 0x3B, 0xFF, 0xBC, 0x83, + 0x3B, 0xFF, 0xBD, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4A, 0xFF, 0xCA, 0x99, 0x5B, 0xFF, 0xCA, 0x9A, 0x5D, 0xFF, 0xCA, 0x9A, + 0x5C, 0xFF, 0xCA, 0x9A, 0x5C, 0xFF, 0xC5, 0x98, 0x5B, 0xFF, 0xBE, 0x96, 0x5E, 0xFF, 0xCF, 0xBD, + 0xA5, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE0, 0xDF, 0xDD, 0xFF, 0xC2, 0xBC, 0xAA, 0xFF, 0xE5, 0xE4, + 0xE1, 0xFF, 0xBE, 0xB6, 0xA1, 0xFF, 0xB6, 0xAB, 0x92, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE2, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE0, 0xDF, + 0xDD, 0xFF, 0xB5, 0xAE, 0x99, 0xFF, 0xA2, 0x97, 0x79, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE2, + 0xE4, 0xFF, 0xE0, 0xDD, 0xD8, 0xFF, 0xAA, 0x8B, 0x58, 0xFF, 0xAE, 0x7D, 0x38, 0xFF, 0xBC, 0x85, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xC5, 0x96, 0x5B, 0xFF, 0xD7, 0xB6, 0x8C, 0xD0, 0xE6, 0xD1, + 0xB4, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD8, 0xB6, 0x90, 0x6C, 0xC7, 0x99, 0x67, 0xFF, 0xB6, 0x7E, 0x43, 0xFF, 0xB4, 0x7B, + 0x3B, 0xFF, 0xB8, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBF, 0x87, + 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC4, 0x90, + 0x49, 0xFF, 0xCC, 0x9D, 0x60, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, + 0x63, 0xFF, 0xCD, 0x9F, 0x63, 0xFF, 0xCC, 0x9F, 0x63, 0xFF, 0xC9, 0x9C, 0x61, 0xFF, 0xC1, 0x9D, + 0x68, 0xFF, 0xD6, 0xCA, 0xB7, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC0, 0xB8, 0xA5, 0xFF, 0xE4, 0xE2, + 0xDF, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xBB, 0xB2, 0x9B, 0xFF, 0xBA, 0xAF, 0x97, 0xFF, 0xDF, 0xDD, + 0xDB, 0xFF, 0xDE, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xC5, 0xBF, 0xB1, 0xFF, 0xA7, 0x9D, 0x81, 0xFF, 0xD5, 0xD1, + 0xC8, 0xFF, 0xE7, 0xE5, 0xE2, 0xFF, 0xB4, 0x95, 0x65, 0xFF, 0xB2, 0x81, 0x3B, 0xFF, 0xBF, 0x89, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC0, 0x88, + 0x3F, 0xFF, 0xC0, 0x8A, 0x44, 0xFF, 0xCB, 0x9D, 0x64, 0xFF, 0xDC, 0xBC, 0x95, 0xBC, 0xEF, 0xE2, + 0xD0, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDC, 0xBD, 0x97, 0x4E, 0xCC, 0xA1, 0x70, 0xF3, 0xBB, 0x86, 0x4B, 0xFF, 0xB8, 0x7F, + 0x3F, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC0, 0x89, 0x42, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xCD, 0x9E, + 0x60, 0xFF, 0xD0, 0xA4, 0x69, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCB, 0xA0, + 0x66, 0xFF, 0xC5, 0xA5, 0x75, 0xFF, 0xDD, 0xD5, 0xC8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xBB, 0xB1, 0x99, 0xFF, 0xB6, 0xA6, + 0x86, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xBC, 0xAF, 0x96, 0xFF, 0xB9, 0xA9, + 0x8A, 0xFF, 0xBE, 0xB0, 0x94, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xB8, 0xAE, + 0x95, 0xFF, 0xD9, 0xCE, 0xBB, 0xFF, 0xB5, 0x90, 0x56, 0xFF, 0xBA, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x44, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC4, 0x8F, 0x4A, 0xFF, 0xD0, 0xA5, 0x6F, 0xFF, 0xDF, 0xC0, 0x9B, 0x9E, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCF, 0xB1, 0x30, 0xD1, 0xA9, 0x79, 0xE2, 0xC1, 0x8E, 0x55, 0xFF, 0xBC, 0x83, + 0x44, 0xFF, 0xBE, 0x86, 0x44, 0xFF, 0xC1, 0x8A, 0x45, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC5, 0x8E, + 0x46, 0xFF, 0xC7, 0x90, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x90, 0x47, 0xFF, 0xCC, 0x9B, 0x59, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xCC, 0xA4, 0x6B, 0xFF, 0xCC, 0xAF, 0x84, 0xFF, 0xE3, 0xDE, 0xD5, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xB0, 0xA6, 0x8B, 0xFF, 0x9A, 0x89, + 0x5F, 0xFF, 0xB5, 0xAA, 0x8E, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xC4, 0xBC, 0xAA, 0xFF, 0xA2, 0x8E, + 0x64, 0xFF, 0xA8, 0x94, 0x6C, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE3, 0xDF, + 0xD7, 0xFF, 0xBD, 0xA8, 0x81, 0xFF, 0xB3, 0x89, 0x48, 0xFF, 0xBF, 0x8D, 0x46, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC9, 0x96, 0x53, 0xFF, 0xD5, 0xAE, 0x7B, 0xFE, 0xE2, 0xC5, 0xA1, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xDE, 0xC7, 0x12, 0xD7, 0xB1, 0x82, 0xC4, 0xC9, 0x98, 0x60, 0xFF, 0xC1, 0x89, + 0x4A, 0xFF, 0xC2, 0x8A, 0x48, 0xFF, 0xC4, 0x8D, 0x49, 0xFF, 0xC7, 0x90, 0x4A, 0xFF, 0xC9, 0x92, + 0x4A, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCC, 0x97, 0x4F, 0xFF, 0xD4, 0xA8, 0x6C, 0xFF, 0xD6, 0xAD, + 0x75, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD5, 0xAC, 0x74, 0xFF, 0xCF, 0xA8, 0x71, 0xFF, 0xD1, 0xB8, 0x93, 0xFF, 0xE7, 0xE4, + 0xDF, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xC3, 0xBD, + 0xAC, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xBF, 0xB8, + 0xA4, 0xFF, 0xAC, 0xA1, 0x84, 0xFF, 0xCD, 0xC9, 0xBC, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xDA, 0xD6, + 0xC9, 0xFF, 0xB9, 0xA6, 0x80, 0xFF, 0xB6, 0x92, 0x59, 0xFF, 0xBB, 0x8D, 0x48, 0xFF, 0xC3, 0x92, + 0x4B, 0xFF, 0xC8, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCA, 0x94, + 0x4C, 0xFF, 0xCF, 0x9E, 0x5E, 0xFF, 0xDB, 0xB6, 0x86, 0xF1, 0xD7, 0xBF, 0xA0, 0x4D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xDE, 0xBB, 0x91, 0x92, 0xD0, 0xA2, 0x6C, 0xFF, 0xC5, 0x90, + 0x52, 0xFF, 0xC5, 0x8E, 0x4B, 0xFF, 0xC8, 0x91, 0x4C, 0xFF, 0xCB, 0x94, 0x4E, 0xFF, 0xCC, 0x96, + 0x4E, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4E, 0xFF, 0xD3, 0xA2, 0x5E, 0xFF, 0xD9, 0xB1, 0x79, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xD8, 0xB0, 0x79, 0xFF, 0xD1, 0xAD, 0x77, 0xFF, 0xD6, 0xC0, + 0xA0, 0xFF, 0xEA, 0xE8, 0xE5, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xD7, 0xD3, + 0xC4, 0xFF, 0xB8, 0xAD, 0x8F, 0xFF, 0xC7, 0xB4, 0x91, 0xFF, 0xB3, 0x91, 0x56, 0xFF, 0xB8, 0x8D, + 0x4A, 0xFF, 0xC3, 0x94, 0x4E, 0xFF, 0xCB, 0x98, 0x4F, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCE, 0x99, + 0x52, 0xFF, 0xD5, 0xA8, 0x6B, 0xFF, 0xE0, 0xBF, 0x92, 0xD7, 0xCE, 0xBA, 0xA0, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC4, 0x9E, 0x55, 0xD7, 0xAD, 0x7A, 0xF8, 0xCC, 0x99, + 0x5C, 0xFF, 0xC9, 0x92, 0x4F, 0xFF, 0xCC, 0x95, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCF, 0x9A, + 0x51, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD9, 0xAD, 0x6E, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7F, 0xFF, 0xD4, 0xB1, + 0x7D, 0xFF, 0xDA, 0xC9, 0xAC, 0xFF, 0xED, 0xEC, 0xEA, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE9, 0xE9, 0xE5, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xDE, 0xDA, 0xCF, 0xFF, 0xC9, 0xC1, 0xAA, 0xFF, 0xD0, 0xC3, 0xA8, 0xFF, 0xB5, 0x98, + 0x63, 0xFF, 0xB8, 0x90, 0x4E, 0xFF, 0xC9, 0x99, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0xA0, + 0x5A, 0xFF, 0xDC, 0xB3, 0x7B, 0xFF, 0xDF, 0xC2, 0x9A, 0xA4, 0xC7, 0xBD, 0xAF, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD6, 0xB7, 0x22, 0xDD, 0xB7, 0x86, 0xD4, 0xD3, 0xA3, + 0x69, 0xFF, 0xCD, 0x97, 0x55, 0xFF, 0xCF, 0x98, 0x53, 0xFF, 0xD1, 0x9B, 0x54, 0xFF, 0xD2, 0x9D, + 0x55, 0xFF, 0xD3, 0x9F, 0x56, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xDE, 0xB6, 0x7C, 0xFF, 0xE0, 0xBB, 0x85, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xE0, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDE, 0xB9, + 0x84, 0xFF, 0xD7, 0xB6, 0x84, 0xFF, 0xDE, 0xD0, 0xB6, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xE7, 0xE6, 0xE2, 0xFF, 0xEA, 0xEA, 0xE6, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xE6, 0xE4, 0xDC, 0xFF, 0xD0, 0xCB, 0xB9, 0xFF, 0xDC, 0xD4, + 0xC0, 0xFF, 0xBE, 0xA1, 0x6E, 0xFF, 0xC4, 0x98, 0x53, 0xFF, 0xD1, 0x9F, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD4, 0xA0, 0x57, 0xFF, 0xD7, 0xA8, + 0x66, 0xFF, 0xE1, 0xBC, 0x8A, 0xFA, 0xE0, 0xC5, 0xA2, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xE2, 0xC0, 0x93, 0x95, 0xD9, 0xAE, + 0x77, 0xFF, 0xD2, 0x9F, 0x5F, 0xFF, 0xD1, 0x9C, 0x57, 0xFF, 0xD4, 0x9E, 0x58, 0xFF, 0xD5, 0xA1, + 0x59, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD8, 0xA4, 0x5A, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xE2, 0xBC, 0x86, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE2, 0xBF, + 0x8A, 0xFF, 0xE0, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8B, 0xFF, 0xE2, 0xD5, 0xBF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEF, 0xEE, 0xEE, 0xFF, 0xE7, 0xE6, + 0xE2, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xE5, 0xE2, + 0xD7, 0xFF, 0xD1, 0xBC, 0x97, 0xFF, 0xC4, 0x9A, 0x55, 0xFF, 0xD4, 0xA3, 0x5A, 0xFF, 0xD7, 0xA5, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD7, 0xA6, 0x5E, 0xFF, 0xDD, 0xB3, + 0x76, 0xFF, 0xE6, 0xC5, 0x97, 0xD7, 0xD8, 0xC5, 0xAB, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCC, 0xA3, 0x44, 0xE0, 0xB8, + 0x85, 0xEE, 0xD8, 0xA8, 0x6C, 0xFF, 0xD5, 0xA0, 0x5D, 0xFF, 0xD6, 0xA2, 0x5C, 0xFF, 0xD8, 0xA4, + 0x5D, 0xFF, 0xD9, 0xA6, 0x5E, 0xFF, 0xDA, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5D, 0xFF, 0xDD, 0xAE, 0x6A, 0xFF, 0xE5, 0xC1, 0x8D, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE5, 0xC2, 0x90, 0xFF, 0xE2, 0xC1, 0x8F, 0xFF, 0xDC, 0xBF, 0x92, 0xFF, 0xE5, 0xDA, + 0xC4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEF, 0xEF, + 0xEC, 0xFF, 0xCF, 0xCB, 0xB8, 0xFF, 0xEB, 0xEA, 0xE4, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xD1, 0xB8, 0x8C, 0xFF, 0xCC, 0xA0, 0x5A, 0xFF, 0xD8, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, 0x5F, 0xFF, 0xDC, 0xAD, 0x69, 0xFF, 0xE4, 0xBE, + 0x88, 0xFF, 0xE8, 0xCC, 0xA2, 0x90, 0xB9, 0xC2, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xD4, 0xB9, 0x0E, 0xE3, 0xC0, + 0x91, 0xAF, 0xDF, 0xB4, 0x7C, 0xFF, 0xD9, 0xA7, 0x66, 0xFF, 0xD9, 0xA5, 0x60, 0xFF, 0xDA, 0xA8, + 0x60, 0xFF, 0xDB, 0xA9, 0x61, 0xFF, 0xDC, 0xAB, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xE0, 0xB3, 0x6F, 0xFF, 0xE8, 0xC7, 0x93, 0xFF, 0xE9, 0xC8, 0x95, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE5, 0xC4, 0x93, 0xFF, 0xDF, 0xC4, + 0x96, 0xFF, 0xE7, 0xDC, 0xC8, 0xFF, 0xF5, 0xF4, 0xF4, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xD7, 0xD5, + 0xC7, 0xFF, 0xCF, 0xCC, 0xB9, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xDC, 0xCD, + 0xAF, 0xFF, 0xCB, 0xA4, 0x64, 0xFF, 0xD7, 0xA9, 0x61, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDE, 0xAC, + 0x62, 0xFF, 0xDE, 0xAC, 0x62, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xE2, 0xB8, 0x7A, 0xFF, 0xE8, 0xC8, + 0x98, 0xE8, 0xE4, 0xCE, 0xAB, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC3, + 0x9A, 0x4F, 0xE5, 0xBE, 0x89, 0xF0, 0xDE, 0xB0, 0x73, 0xFF, 0xDC, 0xA9, 0x65, 0xFF, 0xDD, 0xAA, + 0x63, 0xFF, 0xDE, 0xAC, 0x64, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, + 0x64, 0xFF, 0xE2, 0xB6, 0x71, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE7, 0xC9, + 0x98, 0xFF, 0xE2, 0xC8, 0x9B, 0xFF, 0xE9, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF7, 0xF7, + 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF3, 0xF2, + 0xF0, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF7, 0xF7, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xE4, 0xD7, 0xBE, 0xFF, 0xCB, 0xA7, + 0x68, 0xFF, 0xD7, 0xAA, 0x63, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x65, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE2, 0xB4, 0x71, 0xFF, 0xE8, 0xC3, 0x8C, 0xFF, 0xEA, 0xCE, + 0xA3, 0x9B, 0xCB, 0xC7, 0xBD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAD, 0x0D, 0xE8, 0xC5, 0x95, 0xA7, 0xE5, 0xBB, 0x84, 0xFF, 0xE0, 0xAF, 0x6F, 0xFF, 0xDF, 0xAD, + 0x67, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE1, 0xB1, 0x68, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x72, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEA, 0xCD, 0x9D, 0xFF, 0xE4, 0xCB, 0x9E, 0xFF, 0xE9, 0xDC, 0xC3, 0xFF, 0xF6, 0xF4, + 0xF1, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF2, 0xEF, 0xE8, 0xFF, 0xE0, 0xD2, + 0xB6, 0xFF, 0xE6, 0xDA, 0xC2, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF8, 0xF8, + 0xF8, 0xFF, 0xF9, 0xF8, 0xF8, 0xFF, 0xEF, 0xEF, 0xE9, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xEE, 0xE8, 0xD9, 0xFF, 0xD5, 0xB8, 0x85, 0xFF, 0xD8, 0xAC, + 0x66, 0xFF, 0xE0, 0xB2, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, + 0x69, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xED, 0xCD, 0x9C, 0xE3, 0xE9, 0xD2, + 0xAE, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCB, 0xA1, 0x3C, 0xEA, 0xC4, 0x91, 0xE3, 0xE5, 0xBA, 0x7F, 0xFF, 0xE2, 0xB2, + 0x6E, 0xFF, 0xE2, 0xB1, 0x6B, 0xFF, 0xE3, 0xB3, 0x6B, 0xFF, 0xE4, 0xB5, 0x6C, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEE, 0xD2, 0xA3, 0xFF, 0xEC, 0xD0, 0xA2, 0xFF, 0xE8, 0xCE, 0xA1, 0xFF, 0xEA, 0xD8, + 0xB7, 0xFF, 0xF3, 0xEC, 0xDF, 0xFF, 0xF2, 0xEB, 0xDE, 0xFF, 0xE5, 0xD2, 0xAF, 0xFF, 0xE3, 0xCB, + 0x9F, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xEB, 0xDC, 0xBF, 0xFF, 0xF8, 0xF6, 0xF1, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF0, 0xEF, 0xE9, 0xFF, 0xCF, 0xCB, 0xB6, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF1, 0xEB, 0xDE, 0xFF, 0xE1, 0xCD, 0xA7, 0xFF, 0xDF, 0xB9, 0x7B, 0xFF, 0xE2, 0xB4, + 0x6C, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE7, 0xBD, 0x7C, 0xFF, 0xEC, 0xCB, 0x95, 0xFD, 0xED, 0xD2, 0xA7, 0x84, 0xD3, 0xD3, + 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xD6, 0xE3, 0x02, 0xEB, 0xCC, 0x9C, 0x7C, 0xEA, 0xC4, 0x8E, 0xFC, 0xE6, 0xBA, + 0x7C, 0xFF, 0xE5, 0xB5, 0x70, 0xFF, 0xE5, 0xB6, 0x6F, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD5, 0xA8, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF0, 0xD5, 0xA7, 0xFF, 0xEF, 0xD4, 0xA7, 0xFF, 0xED, 0xD2, + 0xA5, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEC, 0xD2, 0xA5, 0xFF, 0xEF, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA7, 0xFF, 0xEA, 0xD1, 0xA5, 0xFF, 0xEB, 0xDB, 0xBB, 0xFF, 0xF8, 0xF4, + 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xF1, 0xF0, 0xE9, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xE4, 0xD2, 0xAF, 0xFF, 0xE7, 0xCD, 0x9F, 0xFF, 0xE6, 0xBC, 0x78, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xE8, 0xBD, + 0x79, 0xFF, 0xEC, 0xC9, 0x90, 0xFF, 0xEF, 0xD3, 0xA3, 0xC1, 0xEA, 0xD6, 0xB5, 0x1D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD4, 0xAF, 0x15, 0xED, 0xCC, 0x9A, 0xB3, 0xEB, 0xC5, + 0x8D, 0xFF, 0xE8, 0xBB, 0x7B, 0xFF, 0xE7, 0xB8, 0x73, 0xFF, 0xE8, 0xB9, 0x72, 0xFF, 0xE8, 0xBA, + 0x73, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEC, 0xC5, 0x86, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF2, 0xD7, + 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xED, 0xD4, 0xA9, 0xFF, 0xEC, 0xDA, + 0xB8, 0xFF, 0xF7, 0xF2, 0xE8, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xF6, 0xF2, 0xE9, 0xFF, 0xE7, 0xD6, + 0xB4, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xED, 0xCE, 0x98, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE9, 0xBC, + 0x73, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xE9, 0xBC, 0x74, 0xFF, 0xEA, 0xBE, 0x79, 0xFF, 0xEC, 0xC8, + 0x8C, 0xFF, 0xF0, 0xD2, 0xA0, 0xE6, 0xEE, 0xD6, 0xB0, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD2, 0xA8, 0x35, 0xEF, 0xCD, + 0x99, 0xD7, 0xED, 0xC7, 0x8D, 0xFF, 0xEA, 0xBE, 0x7D, 0xFF, 0xEA, 0xBC, 0x76, 0xFF, 0xEA, 0xBC, + 0x76, 0xFF, 0xEA, 0xBD, 0x76, 0xFF, 0xEC, 0xC0, 0x7B, 0xFF, 0xF2, 0xD5, 0xA4, 0xFF, 0xF3, 0xDA, + 0xB0, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xEF, 0xD7, + 0xAE, 0xFF, 0xEE, 0xDB, 0xB8, 0xFF, 0xF6, 0xEC, 0xD9, 0xFF, 0xED, 0xDD, 0xBD, 0xFF, 0xED, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAE, 0xFF, 0xED, 0xC9, 0x89, 0xFF, 0xEB, 0xBE, 0x75, 0xFF, 0xEB, 0xBF, + 0x77, 0xFF, 0xEB, 0xBF, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xEE, 0xC9, 0x8A, 0xFF, 0xF1, 0xD2, + 0x9E, 0xF6, 0xF0, 0xD7, 0xAD, 0x72, 0xDE, 0xDF, 0xE4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xD3, + 0xA6, 0x50, 0xF1, 0xCF, 0x99, 0xE4, 0xEE, 0xC9, 0x8E, 0xFF, 0xEC, 0xC1, 0x7F, 0xFF, 0xEC, 0xBF, + 0x79, 0xFF, 0xEC, 0xC0, 0x79, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xF1, 0xCD, 0x91, 0xFF, 0xF5, 0xDC, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF3, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF3, 0xDC, + 0xB4, 0xFF, 0xF2, 0xD5, 0xA3, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xED, 0xC1, 0x79, 0xFF, 0xED, 0xC1, + 0x7A, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xEF, 0xCA, 0x8B, 0xFF, 0xF2, 0xD3, 0x9E, 0xFC, 0xF3, 0xD8, + 0xAA, 0x92, 0xE7, 0xDA, 0xC3, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, + 0xFF, 0x01, 0xF2, 0xD4, 0xA4, 0x5E, 0xF2, 0xD1, 0x9C, 0xEA, 0xF0, 0xCB, 0x90, 0xFF, 0xEE, 0xC3, + 0x81, 0xFF, 0xEE, 0xC2, 0x7D, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC5, 0x80, 0xFF, 0xF5, 0xD7, + 0xA7, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDE, + 0xB3, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xEF, 0xC4, 0x7C, 0xFF, 0xEF, 0xC4, 0x7D, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xF3, 0xD4, 0x9F, 0xFF, 0xF3, 0xD9, 0xA9, 0xA2, 0xEF, 0xDD, + 0xBE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE5, 0xE3, 0xDD, 0x03, 0xF2, 0xD6, 0xA7, 0x67, 0xF3, 0xD3, 0x9E, 0xEB, 0xF2, 0xCE, + 0x94, 0xFF, 0xF0, 0xC8, 0x86, 0xFF, 0xF0, 0xC5, 0x80, 0xFF, 0xF0, 0xC5, 0x7E, 0xFF, 0xF2, 0xCD, + 0x8D, 0xFF, 0xF6, 0xDE, 0xB4, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF4, 0xD5, + 0x9D, 0xFF, 0xF1, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x80, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x91, 0xFF, 0xF5, 0xD6, 0xA1, 0xFE, 0xF5, 0xDA, 0xAB, 0xA9, 0xEF, 0xDE, 0xBF, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xE5, 0xE2, 0x03, 0xF4, 0xD8, 0xA8, 0x60, 0xF4, 0xD4, + 0xA0, 0xE4, 0xF4, 0xD1, 0x98, 0xFF, 0xF2, 0xCC, 0x8B, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF2, 0xC8, + 0x82, 0xFF, 0xF4, 0xD3, 0x98, 0xFF, 0xF8, 0xE2, 0xBA, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF6, 0xDA, 0xA8, 0xFF, 0xF3, 0xCB, + 0x86, 0xFF, 0xF2, 0xCA, 0x83, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF4, 0xD2, 0x96, 0xFF, 0xF6, 0xD8, + 0xA3, 0xF9, 0xF6, 0xDB, 0xAC, 0x9E, 0xF1, 0xE0, 0xC1, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFA, 0xFF, 0x01, 0xF4, 0xDA, + 0xAD, 0x4E, 0xF6, 0xD7, 0xA2, 0xD3, 0xF5, 0xD4, 0x9D, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, + 0x88, 0xFF, 0xF3, 0xCB, 0x85, 0xFF, 0xF5, 0xD5, 0x9D, 0xFF, 0xF9, 0xE4, 0xBC, 0xFF, 0xF9, 0xE6, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF7, 0xDC, 0xAC, 0xFF, 0xF4, 0xCE, 0x8B, 0xFF, 0xF3, 0xCC, + 0x87, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF7, 0xDA, 0xA6, 0xF0, 0xF7, 0xDC, + 0xAF, 0x84, 0xF3, 0xE2, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB1, 0x31, 0xF5, 0xD8, 0xA5, 0xAC, 0xF7, 0xD7, 0xA2, 0xFA, 0xF6, 0xD4, + 0x9B, 0xFF, 0xF5, 0xCF, 0x90, 0xFF, 0xF4, 0xCD, 0x8A, 0xFF, 0xF6, 0xD5, 0x9C, 0xFF, 0xFA, 0xE3, + 0xBC, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xF8, 0xDC, 0xAA, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF5, 0xD0, 0x8D, 0xFF, 0xF6, 0xD5, + 0x98, 0xFF, 0xF7, 0xD9, 0xA3, 0xFF, 0xF8, 0xDC, 0xAA, 0xD7, 0xF8, 0xDE, 0xB1, 0x5E, 0xF5, 0xE9, + 0xD4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD9, 0xBB, 0x12, 0xF5, 0xDA, 0xAA, 0x70, 0xF8, 0xD9, + 0xA4, 0xD8, 0xF8, 0xD8, 0xA1, 0xFF, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD1, 0x90, 0xFF, 0xF7, 0xD4, + 0x98, 0xFF, 0xF9, 0xE0, 0xB4, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFA, 0xE4, 0xBD, 0xFF, 0xF8, 0xD9, + 0xA2, 0xFF, 0xF7, 0xD2, 0x91, 0xFF, 0xF7, 0xD5, 0x97, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDD, 0xAE, 0x9E, 0xF7, 0xE2, 0xBC, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDB, + 0xB3, 0x2F, 0xF7, 0xDB, 0xA9, 0x99, 0xF9, 0xDB, 0xA6, 0xE9, 0xF9, 0xDA, 0xA3, 0xFF, 0xF8, 0xD6, + 0x9B, 0xFF, 0xF7, 0xD5, 0x98, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF8, 0xD8, 0x9C, 0xFF, 0xF8, 0xD7, + 0x9A, 0xFF, 0xF9, 0xDA, 0xA3, 0xFF, 0xF9, 0xDD, 0xA9, 0xF8, 0xF9, 0xDE, 0xAC, 0xC0, 0xF9, 0xE0, + 0xB4, 0x52, 0xF7, 0xEB, 0xD7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xED, 0xE0, 0xC9, 0x08, 0xF5, 0xDD, 0xB2, 0x42, 0xF8, 0xDC, 0xAA, 0x9E, 0xF9, 0xDC, + 0xA8, 0xE4, 0xF9, 0xDB, 0xA5, 0xFE, 0xF9, 0xD9, 0xA1, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDE, + 0xAC, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, + 0xAA, 0xF3, 0xF9, 0xDE, 0xAD, 0xBF, 0xF7, 0xDF, 0xB2, 0x67, 0xF2, 0xE1, 0xC0, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE2, 0xCD, 0x08, 0xF5, 0xDD, + 0xB4, 0x36, 0xF8, 0xDE, 0xAD, 0x82, 0xFA, 0xDE, 0xAC, 0xC6, 0xFA, 0xDD, 0xA9, 0xF0, 0xFA, 0xDC, + 0xA6, 0xFF, 0xFA, 0xDD, 0xA7, 0xFF, 0xFB, 0xDE, 0xAC, 0xFF, 0xFB, 0xE2, 0xB3, 0xFF, 0xFB, 0xE5, + 0xBB, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xE6, + 0xBE, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xDE, 0xA9, 0xFF, 0xFA, 0xDD, + 0xA7, 0xFF, 0xFB, 0xDE, 0xA9, 0xF9, 0xFA, 0xDF, 0xAE, 0xD9, 0xFA, 0xDF, 0xAF, 0x9F, 0xF6, 0xDF, + 0xB5, 0x51, 0xF5, 0xE1, 0xBE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xEA, 0xCC, 0x18, 0xFB, 0xE3, 0xB8, 0x42, 0xFB, 0xE2, + 0xB5, 0x7B, 0xFB, 0xE0, 0xAF, 0xAF, 0xFB, 0xDF, 0xAC, 0xD3, 0xFB, 0xDF, 0xAB, 0xE8, 0xFB, 0xDF, + 0xAC, 0xF8, 0xFB, 0xDF, 0xAD, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE1, + 0xB0, 0xFF, 0xFB, 0xE0, 0xB0, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, + 0xAD, 0xFC, 0xFB, 0xDF, 0xAC, 0xEF, 0xFB, 0xDF, 0xAD, 0xDC, 0xFB, 0xE0, 0xAF, 0xC0, 0xFB, 0xE2, + 0xB5, 0x91, 0xFB, 0xE4, 0xB9, 0x58, 0xFB, 0xE6, 0xC0, 0x26, 0xF8, 0xF8, 0xF4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xEB, 0xCC, 0x07, 0xFC, 0xE4, 0xBB, 0x1F, 0xFB, 0xE2, 0xB4, 0x37, 0xFB, 0xE0, + 0xAE, 0x50, 0xFB, 0xE0, 0xAF, 0x69, 0xFB, 0xE1, 0xB0, 0x7B, 0xFB, 0xE1, 0xAF, 0x85, 0xFB, 0xE1, + 0xB1, 0x8B, 0xFC, 0xE1, 0xB0, 0x88, 0xFB, 0xE1, 0xB0, 0x7F, 0xFB, 0xE1, 0xB0, 0x71, 0xFB, 0xE0, + 0xAF, 0x5A, 0xFB, 0xE2, 0xB3, 0x41, 0xFC, 0xE4, 0xBA, 0x29, 0xFC, 0xE8, 0xC4, 0x10, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF6, 0xE8, 0x02, 0xFE, 0xED, + 0xCE, 0x03, 0xFD, 0xF2, 0xD9, 0x02, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x02, 0x81, 0x43, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, + 0x0C, 0x60, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x43, 0x0B, 0x86, 0x81, 0x43, 0x0A, 0x88, 0x81, 0x42, + 0x0A, 0x88, 0x81, 0x42, 0x09, 0x88, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, + 0x09, 0x89, 0x81, 0x43, 0x0A, 0x89, 0x82, 0x43, 0x0B, 0x89, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8F, 0x57, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x97, 0x81, 0x43, 0x0B, 0x99, 0x81, 0x42, 0x09, 0x9B, 0x81, 0x43, + 0x0A, 0x9D, 0x83, 0x46, 0x0E, 0xA0, 0x87, 0x4B, 0x14, 0xA4, 0x8B, 0x52, 0x1D, 0xA9, 0x8E, 0x57, + 0x25, 0xAF, 0x8F, 0x58, 0x28, 0xB2, 0x8F, 0x59, 0x28, 0xB3, 0x8F, 0x59, 0x28, 0xB2, 0x8F, 0x57, + 0x26, 0xB0, 0x8C, 0x53, 0x20, 0xAC, 0x87, 0x4C, 0x16, 0xA7, 0x84, 0x46, 0x0F, 0xA2, 0x82, 0x43, + 0x0B, 0xA0, 0x81, 0x42, 0x09, 0x9E, 0x81, 0x43, 0x0A, 0x9D, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, + 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x43, 0x0B, 0xA5, 0x81, 0x42, + 0x09, 0xA7, 0x83, 0x45, 0x0D, 0xAA, 0x8A, 0x50, 0x1C, 0xB3, 0x93, 0x5F, 0x31, 0xC1, 0x9A, 0x6B, + 0x44, 0xD1, 0x9C, 0x71, 0x4E, 0xDE, 0x9C, 0x73, 0x53, 0xE8, 0x9C, 0x74, 0x57, 0xF1, 0x9B, 0x74, + 0x58, 0xF6, 0x9A, 0x73, 0x58, 0xF8, 0x9A, 0x73, 0x58, 0xF9, 0x9A, 0x74, 0x59, 0xF8, 0x9C, 0x76, + 0x5B, 0xF7, 0x9E, 0x77, 0x5B, 0xF2, 0x9E, 0x76, 0x57, 0xEA, 0x9E, 0x74, 0x52, 0xE1, 0x9C, 0x6F, + 0x4A, 0xD6, 0x95, 0x63, 0x37, 0xC7, 0x8C, 0x53, 0x20, 0xB9, 0x84, 0x47, 0x10, 0xAF, 0x81, 0x42, + 0x0A, 0xAB, 0x81, 0x43, 0x0A, 0xAA, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x0F, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, + 0x0C, 0x9F, 0x81, 0x43, 0x0B, 0xA4, 0x81, 0x43, 0x0A, 0xA7, 0x88, 0x4D, 0x16, 0xB1, 0x94, 0x61, + 0x33, 0xC5, 0x9C, 0x70, 0x4B, 0xDD, 0x9B, 0x72, 0x53, 0xF0, 0x94, 0x6C, 0x50, 0xFB, 0x8C, 0x63, + 0x48, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x7F, 0x55, 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x79, 0x4E, + 0x34, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7C, 0x52, + 0x37, 0xFF, 0x80, 0x56, 0x3C, 0xFF, 0x85, 0x5C, 0x42, 0xFF, 0x8B, 0x63, 0x49, 0xFF, 0x92, 0x6B, + 0x51, 0xFF, 0x9A, 0x74, 0x5A, 0xFC, 0x9F, 0x79, 0x5C, 0xF4, 0x9F, 0x76, 0x53, 0xE4, 0x97, 0x66, + 0x3C, 0xCD, 0x8A, 0x51, 0x1C, 0xB9, 0x82, 0x43, 0x0B, 0xAE, 0x81, 0x43, 0x0A, 0xAC, 0x82, 0x44, + 0x0C, 0xAA, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x87, 0x4A, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x43, 0x0B, 0x91, 0x81, 0x43, + 0x0A, 0x96, 0x8A, 0x4F, 0x1A, 0xA4, 0x99, 0x68, 0x3F, 0xC6, 0x9C, 0x73, 0x52, 0xE9, 0x93, 0x6A, + 0x4E, 0xFB, 0x84, 0x5A, 0x3E, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x24, 0xFF, 0x70, 0x41, + 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x45, 0x29, 0xFF, 0x73, 0x46, + 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x79, 0x4D, + 0x32, 0xFF, 0x7E, 0x52, 0x38, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x8F, 0x67, 0x4D, 0xFF, 0x9B, 0x75, + 0x5A, 0xFD, 0xA2, 0x7B, 0x5D, 0xF0, 0x9D, 0x70, 0x49, 0xD3, 0x8D, 0x55, 0x22, 0xB2, 0x82, 0x43, + 0x0B, 0xA1, 0x81, 0x43, 0x0B, 0x9D, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x92, 0x82, 0x44, + 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x69, 0x81, 0x42, 0x09, 0x72, 0x86, 0x4A, 0x13, 0x7F, 0x98, 0x67, + 0x3D, 0xAD, 0x9D, 0x73, 0x53, 0xE3, 0x8E, 0x64, 0x47, 0xFC, 0x7C, 0x4E, 0x31, 0xFF, 0x6F, 0x40, + 0x23, 0xFF, 0x6A, 0x3A, 0x1E, 0xFF, 0x69, 0x39, 0x1C, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3C, + 0x1E, 0xFF, 0x6E, 0x3E, 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x72, 0x42, 0x23, 0xFF, 0x74, 0x43, + 0x24, 0xFF, 0x75, 0x45, 0x26, 0xFF, 0x76, 0x46, 0x27, 0xFF, 0x77, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x79, 0x4A, 0x2B, 0xFF, 0x79, 0x4B, 0x2C, 0xFF, 0x79, 0x4B, + 0x2D, 0xFF, 0x79, 0x4B, 0x2E, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x7C, 0x4F, 0x33, 0xFF, 0x81, 0x55, + 0x39, 0xFF, 0x8B, 0x61, 0x46, 0xFF, 0x99, 0x72, 0x58, 0xFF, 0xA4, 0x7E, 0x61, 0xEE, 0x9D, 0x70, + 0x48, 0xC0, 0x89, 0x4F, 0x19, 0x92, 0x81, 0x42, 0x09, 0x82, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x45, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x43, + 0x0B, 0x44, 0x81, 0x42, 0x09, 0x4D, 0x95, 0x62, 0x33, 0x74, 0xA0, 0x76, 0x54, 0xC4, 0x92, 0x67, + 0x49, 0xF7, 0x7B, 0x4C, 0x2E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x67, 0x36, + 0x18, 0xFF, 0x6A, 0x38, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3C, 0x1C, 0xFF, 0x71, 0x3F, + 0x1D, 0xFF, 0x73, 0x41, 0x1F, 0xFF, 0x75, 0x43, 0x20, 0xFF, 0x77, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7C, 0x49, 0x26, 0xFF, 0x7D, 0x4B, 0x27, 0xFF, 0x7D, 0x4C, + 0x28, 0xFF, 0x7E, 0x4D, 0x29, 0xFF, 0x7E, 0x4D, 0x2A, 0xFF, 0x7F, 0x4E, 0x2B, 0xFF, 0x7F, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4F, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4F, + 0x30, 0xFF, 0x7D, 0x50, 0x32, 0xFF, 0x82, 0x55, 0x39, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9D, 0x77, + 0x5B, 0xFC, 0xA6, 0x7F, 0x60, 0xD8, 0x9A, 0x6A, 0x3E, 0x90, 0x83, 0x45, 0x0D, 0x61, 0x81, 0x43, + 0x0A, 0x59, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8C, 0x54, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1C, 0x80, 0x41, 0x08, 0x23, 0x87, 0x4B, + 0x13, 0x2D, 0xA3, 0x78, 0x53, 0x76, 0x9C, 0x73, 0x54, 0xDE, 0x82, 0x54, 0x35, 0xFF, 0x6D, 0x3A, + 0x1B, 0xFF, 0x64, 0x31, 0x13, 0xFF, 0x63, 0x30, 0x11, 0xFF, 0x66, 0x31, 0x12, 0xFF, 0x69, 0x33, + 0x13, 0xFF, 0x6B, 0x36, 0x13, 0xFF, 0x6E, 0x39, 0x15, 0xFF, 0x71, 0x3C, 0x17, 0xFF, 0x74, 0x3F, + 0x19, 0xFF, 0x77, 0x42, 0x1B, 0xFF, 0x7A, 0x45, 0x1E, 0xFF, 0x7C, 0x47, 0x20, 0xFF, 0x7E, 0x4A, + 0x23, 0xFF, 0x80, 0x4C, 0x24, 0xFF, 0x81, 0x4D, 0x25, 0xFF, 0x82, 0x4E, 0x27, 0xFF, 0x83, 0x4F, + 0x28, 0xFF, 0x83, 0x50, 0x29, 0xFF, 0x84, 0x51, 0x2A, 0xFF, 0x84, 0x51, 0x2B, 0xFF, 0x84, 0x51, + 0x2C, 0xFF, 0x83, 0x52, 0x2D, 0xFF, 0x83, 0x52, 0x2E, 0xFF, 0x82, 0x52, 0x2E, 0xFF, 0x82, 0x51, + 0x2F, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x80, 0x52, 0x34, 0xFF, 0x86, 0x5A, + 0x3C, 0xFF, 0x95, 0x6C, 0x50, 0xFF, 0xA6, 0x81, 0x64, 0xEE, 0xA8, 0x7F, 0x5C, 0x9A, 0x8C, 0x53, + 0x1F, 0x44, 0x80, 0x40, 0x07, 0x34, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0xA0, 0x71, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x48, 0x11, 0x01, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x7B, 0x3A, 0x00, 0x0D, 0x9B, 0x68, 0x39, 0x19, 0xA9, 0x82, + 0x62, 0x81, 0x93, 0x68, 0x48, 0xEE, 0x73, 0x41, 0x20, 0xFF, 0x62, 0x2C, 0x0C, 0xFF, 0x5E, 0x27, + 0x07, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x67, 0x2D, + 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6F, 0x34, 0x09, 0xFF, 0x71, 0x36, + 0x0A, 0xFF, 0x74, 0x38, 0x0B, 0xFF, 0x76, 0x3A, 0x0D, 0xFF, 0x78, 0x3D, 0x0F, 0xFF, 0x7B, 0x40, + 0x12, 0xFF, 0x7E, 0x44, 0x16, 0xFF, 0x80, 0x48, 0x1A, 0xFF, 0x83, 0x4C, 0x1F, 0xFF, 0x86, 0x50, + 0x24, 0xFF, 0x88, 0x52, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x89, 0x55, 0x2A, 0xFF, 0x89, 0x55, + 0x2B, 0xFF, 0x89, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x87, 0x55, + 0x2F, 0xFF, 0x86, 0x55, 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x83, 0x53, 0x31, 0xFF, 0x82, 0x53, + 0x32, 0xFF, 0x84, 0x56, 0x37, 0xFF, 0x8F, 0x64, 0x46, 0xFF, 0xA2, 0x7C, 0x60, 0xF9, 0xAE, 0x8A, + 0x6C, 0xA6, 0x9D, 0x6D, 0x42, 0x31, 0x7C, 0x3B, 0x00, 0x17, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x04, 0x81, 0x43, + 0x0B, 0x02, 0x83, 0x46, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4B, 0x14, 0x01, 0x83, 0x45, 0x0E, 0x01, 0x83, 0x45, + 0x0D, 0x02, 0x5F, 0x0F, 0x00, 0x03, 0xB2, 0x8C, 0x69, 0x10, 0xAC, 0x87, 0x69, 0x88, 0x8E, 0x61, + 0x40, 0xF6, 0x6D, 0x39, 0x16, 0xFF, 0x60, 0x29, 0x08, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6E, 0x33, + 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7F, 0x42, + 0x0F, 0xFF, 0x82, 0x46, 0x13, 0xFF, 0x85, 0x4C, 0x1A, 0xFF, 0x89, 0x52, 0x22, 0xFF, 0x8C, 0x56, + 0x28, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2D, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8A, 0x57, 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x85, 0x56, 0x34, 0xFF, 0x8C, 0x60, 0x40, 0xFF, 0xA0, 0x79, + 0x5B, 0xFE, 0xB2, 0x90, 0x73, 0xAF, 0xAE, 0x87, 0x65, 0x26, 0x6E, 0x25, 0x00, 0x07, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0D, 0x01, 0x84, 0x46, + 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xAA, 0x8F, 0x09, 0xAE, 0x89, 0x6C, 0x84, 0x8D, 0x60, 0x3E, 0xF8, 0x6C, 0x37, + 0x13, 0xFF, 0x61, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, + 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6C, 0x33, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x71, 0x37, + 0x09, 0xFF, 0x76, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0D, 0xFF, 0x84, 0x47, + 0x12, 0xFF, 0x88, 0x4D, 0x19, 0xFF, 0x8C, 0x54, 0x23, 0xFF, 0x8F, 0x59, 0x2A, 0xFF, 0x90, 0x5B, + 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x8D, 0x5F, + 0x3E, 0xFF, 0xA0, 0x78, 0x5A, 0xFF, 0xB4, 0x92, 0x77, 0xAC, 0xBA, 0x97, 0x79, 0x1B, 0x00, 0x00, + 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x47, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xDF, + 0xD2, 0x05, 0xB4, 0x91, 0x74, 0x77, 0x91, 0x63, 0x40, 0xF5, 0x6E, 0x38, 0x14, 0xFF, 0x63, 0x2B, + 0x07, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6D, 0x33, + 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x67, 0x33, 0x07, 0xFF, 0x67, 0x36, 0x0B, 0xFF, 0x68, 0x35, + 0x06, 0xFF, 0x73, 0x3B, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x83, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x87, 0x4A, 0x13, 0xFF, 0x8C, 0x52, + 0x1E, 0xFF, 0x91, 0x59, 0x28, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x33, 0xFF, 0x8F, 0x60, 0x3E, 0xFF, 0xA3, 0x7B, 0x5C, 0xFE, 0xB8, 0x97, 0x7B, 0x9D, 0xCA, 0xAD, + 0x95, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x99, + 0x7D, 0x5B, 0x97, 0x6B, 0x48, 0xEF, 0x72, 0x3C, 0x17, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2C, + 0x06, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x33, 0x07, 0xFF, 0x70, 0x35, 0x08, 0xFF, 0x6C, 0x34, + 0x07, 0xFF, 0x63, 0x32, 0x08, 0xFF, 0x80, 0x60, 0x3F, 0xFF, 0xBB, 0xAA, 0x99, 0xFF, 0x7F, 0x60, + 0x3F, 0xFF, 0x64, 0x36, 0x07, 0xFF, 0x75, 0x3E, 0x09, 0xFF, 0x80, 0x43, 0x0B, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x88, 0x49, 0x10, 0xFF, 0x8C, 0x51, 0x1A, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x94, 0x5E, + 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x8F, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x33, 0xFF, 0x92, 0x63, 0x40, 0xFF, 0xA7, 0x80, 0x60, 0xFB, 0xBE, 0x9E, + 0x84, 0x84, 0xE5, 0xD8, 0xCC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x32, 0xA1, 0x77, + 0x55, 0xD8, 0x79, 0x44, 0x1D, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6C, 0x31, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x6D, 0x36, 0x07, 0xFF, 0x66, 0x3A, + 0x10, 0xFF, 0xA2, 0x8D, 0x77, 0xFF, 0xC0, 0xB7, 0xAC, 0xFF, 0xC1, 0xBB, 0xB1, 0xFF, 0xDC, 0xD7, + 0xCF, 0xFF, 0x9A, 0x83, 0x69, 0xFF, 0x68, 0x3E, 0x10, 0xFF, 0x73, 0x3E, 0x09, 0xFF, 0x81, 0x46, + 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, 0x10, 0xFF, 0x8E, 0x53, + 0x1B, 0xFF, 0x94, 0x5C, 0x29, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5C, 0x34, 0xFF, 0x96, 0x68, 0x44, 0xFF, 0xAE, 0x88, + 0x68, 0xF0, 0xC4, 0xA8, 0x8F, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xBC, 0xA5, 0x0F, 0xAD, 0x87, 0x66, 0xAC, 0x85, 0x52, + 0x2B, 0xFF, 0x6C, 0x32, 0x0B, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, + 0x08, 0xFF, 0x75, 0x39, 0x09, 0xFF, 0x6F, 0x38, 0x07, 0xFF, 0x68, 0x3D, 0x11, 0xFF, 0xAC, 0x9B, + 0x87, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xBE, 0xB9, 0xAF, 0xFF, 0xA4, 0x9B, + 0x8B, 0xFF, 0xD9, 0xD5, 0xCE, 0xFF, 0xB9, 0xA9, 0x96, 0xFF, 0x74, 0x4E, 0x22, 0xFF, 0x6F, 0x3D, + 0x08, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, + 0x0C, 0xFF, 0x8B, 0x4C, 0x12, 0xFF, 0x91, 0x56, 0x1F, 0xFF, 0x96, 0x5F, 0x2C, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x90, 0x5E, 0x35, 0xFF, 0x9D, 0x71, + 0x4C, 0xFF, 0xB6, 0x93, 0x74, 0xD1, 0xCD, 0xB2, 0x9A, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x99, 0x7B, 0x65, 0x95, 0x66, 0x40, 0xF7, 0x73, 0x3A, + 0x12, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x37, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x73, 0x3A, 0x08, 0xFF, 0x6A, 0x3C, 0x0F, 0xFF, 0xAB, 0x98, 0x83, 0xFF, 0xE8, 0xE7, + 0xE6, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xCB, 0xC7, + 0xBE, 0xFF, 0x93, 0x88, 0x75, 0xFF, 0xC4, 0xBD, 0xB2, 0xFF, 0xD0, 0xC8, 0xBB, 0xFF, 0x86, 0x67, + 0x42, 0xFF, 0x6D, 0x3E, 0x09, 0xFF, 0x7C, 0x45, 0x0B, 0xFF, 0x87, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8E, 0x50, 0x15, 0xFF, 0x95, 0x5C, + 0x26, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x94, 0x63, + 0x39, 0xFF, 0xA8, 0x7E, 0x5A, 0xFF, 0xC0, 0x9F, 0x83, 0x93, 0xE4, 0xD4, 0xC3, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAF, 0x95, 0x20, 0xA8, 0x7E, 0x5B, 0xCE, 0x7F, 0x49, 0x1F, 0xFF, 0x6E, 0x33, + 0x09, 0xFF, 0x70, 0x33, 0x07, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x77, 0x3D, + 0x09, 0xFF, 0x6B, 0x3A, 0x0B, 0xFF, 0xA1, 0x8B, 0x73, 0xFF, 0xE7, 0xE6, 0xE4, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xD8, 0xD5, 0xD0, 0xFF, 0x8F, 0x83, 0x6E, 0xFF, 0xA7, 0x9D, 0x8E, 0xFF, 0xDA, 0xD5, + 0xCE, 0xFF, 0x9D, 0x87, 0x6B, 0xFF, 0x6E, 0x44, 0x12, 0xFF, 0x78, 0x43, 0x09, 0xFF, 0x86, 0x4A, + 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, + 0x10, 0xFF, 0x93, 0x58, 0x1F, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x95, 0x60, 0x2F, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x9B, 0x6C, 0x42, 0xFF, 0xB4, 0x8F, 0x6D, 0xEA, 0xCB, 0xAE, 0x94, 0x42, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBA, 0x97, 0x77, 0x76, 0x94, 0x62, 0x39, 0xFD, 0x75, 0x3A, 0x0F, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x71, 0x3B, + 0x07, 0xFF, 0x94, 0x77, 0x57, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0x97, 0x8C, 0x7B, 0xFF, 0x8C, 0x7F, + 0x69, 0xFF, 0xD3, 0xCF, 0xC8, 0xFF, 0xB5, 0xA7, 0x95, 0xFF, 0x76, 0x52, 0x23, 0xFF, 0x73, 0x41, + 0x08, 0xFF, 0x83, 0x4A, 0x0D, 0xFF, 0x8D, 0x4E, 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x91, 0x54, 0x19, 0xFF, 0x97, 0x5F, 0x2A, 0xFF, 0x97, 0x61, + 0x2F, 0xFF, 0x97, 0x63, 0x35, 0xFF, 0xA8, 0x7C, 0x54, 0xFF, 0xC1, 0xA0, 0x81, 0xA4, 0xE0, 0xCD, + 0xBA, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xBD, + 0xA6, 0x1C, 0xAB, 0x81, 0x5C, 0xCD, 0x83, 0x4A, 0x1E, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x7E, 0x41, 0x09, 0xFF, 0x90, 0x68, + 0x3E, 0xFF, 0xDF, 0xDA, 0xD3, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xA6, 0x9D, + 0x8D, 0xFF, 0x7A, 0x6A, 0x4F, 0xFF, 0xC0, 0xB9, 0xB0, 0xFF, 0xCA, 0xC1, 0xB7, 0xFF, 0x86, 0x69, + 0x42, 0xFF, 0x70, 0x42, 0x0B, 0xFF, 0x80, 0x49, 0x0C, 0xFF, 0x8C, 0x4F, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x91, 0x52, 0x15, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9F, 0x6D, 0x41, 0xFF, 0xB7, 0x91, 0x6D, 0xEA, 0xCF, 0xB2, + 0x97, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, + 0x84, 0x5F, 0x9B, 0x6A, 0x3F, 0xF8, 0x7B, 0x3E, 0x11, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x84, 0x45, 0x09, 0xFF, 0xA7, 0x82, + 0x5A, 0xFF, 0xED, 0xEB, 0xE9, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xB8, 0xB1, 0xA6, 0xFF, 0x73, 0x62, 0x46, 0xFF, 0xA9, 0x9F, 0x8D, 0xFF, 0xD6, 0xD2, + 0xCD, 0xFF, 0x9D, 0x88, 0x6B, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x7C, 0x48, 0x0C, 0xFF, 0x8B, 0x50, + 0x10, 0xFF, 0x93, 0x53, 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x52, + 0x13, 0xFF, 0x97, 0x5D, 0x25, 0xFF, 0x9B, 0x66, 0x34, 0xFF, 0xAE, 0x82, 0x58, 0xFF, 0xC7, 0xA6, + 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xEE, 0xE3, 0x09, 0xB7, 0x90, + 0x6C, 0xAA, 0x8E, 0x56, 0x28, 0xFF, 0x7A, 0x3B, 0x0B, 0xFF, 0x7C, 0x3C, 0x09, 0xFF, 0x81, 0x41, + 0x0A, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x89, 0x50, + 0x13, 0xFF, 0xC0, 0xA8, 0x8C, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xCA, 0xC5, 0xBE, 0xFF, 0x79, 0x69, 0x4A, 0xFF, 0x92, 0x85, + 0x6D, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xB6, 0xA9, 0x97, 0xFF, 0x7B, 0x58, 0x29, 0xFF, 0x78, 0x48, + 0x0D, 0xFF, 0x8A, 0x51, 0x12, 0xFF, 0x94, 0x56, 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x57, + 0x13, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, + 0x0E, 0xFF, 0x91, 0x52, 0x13, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0xA6, 0x75, 0x46, 0xFF, 0xBF, 0x9B, + 0x78, 0xD3, 0xD6, 0xBD, 0xA3, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xBC, 0xA2, 0x2B, 0xAB, 0x7E, + 0x54, 0xE1, 0x85, 0x49, 0x18, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x86, 0x45, + 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x91, 0x51, + 0x0D, 0xFF, 0x90, 0x5C, 0x1F, 0xFF, 0xD4, 0xC4, 0xB2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF4, 0xF4, 0xF5, 0xFF, 0xDA, 0xD8, 0xD3, 0xFF, 0x87, 0x79, + 0x5F, 0xFF, 0x80, 0x6F, 0x50, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xCF, 0xC9, 0xBE, 0xFF, 0x8B, 0x70, + 0x49, 0xFF, 0x76, 0x4A, 0x11, 0xFF, 0x87, 0x52, 0x12, 0xFF, 0x94, 0x58, 0x14, 0xFF, 0x9A, 0x5A, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x92, 0x52, 0x13, 0xFF, 0x9F, 0x67, 0x32, 0xFF, 0xB8, 0x8F, + 0x67, 0xF6, 0xD0, 0xB2, 0x95, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA7, 0x86, 0x5E, 0xA0, 0x6D, + 0x40, 0xF9, 0x82, 0x43, 0x11, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x92, 0x54, 0x0E, 0xFF, 0x9E, 0x71, 0x3B, 0xFF, 0xE2, 0xDB, 0xD0, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, + 0xE3, 0xFF, 0x9A, 0x8F, 0x78, 0xFF, 0x75, 0x62, 0x3E, 0xFF, 0xC0, 0xB8, 0xAA, 0xFF, 0xDE, 0xDC, + 0xD8, 0xFF, 0xA0, 0x8D, 0x70, 0xFF, 0x78, 0x51, 0x1B, 0xFF, 0x84, 0x52, 0x13, 0xFF, 0x94, 0x5A, + 0x17, 0xFF, 0x9B, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x58, 0x1A, 0xFF, 0xB1, 0x83, + 0x54, 0xFF, 0xC3, 0xA4, 0x83, 0x8E, 0x00, 0x24, 0x4C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x99, 0x74, 0x92, 0x98, 0x61, + 0x30, 0xFF, 0x82, 0x42, 0x0D, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x8A, 0x49, 0x0C, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, + 0x15, 0xFF, 0x9F, 0x61, 0x19, 0xFF, 0x97, 0x5C, 0x16, 0xFF, 0xAD, 0x89, 0x5D, 0xFF, 0xE7, 0xE4, + 0xE0, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xEC, 0xEB, 0xEB, 0xFF, 0xB0, 0xA7, 0x96, 0xFF, 0x74, 0x61, 0x3B, 0xFF, 0xAD, 0xA2, + 0x8E, 0xFF, 0xE4, 0xE4, 0xE1, 0xFF, 0xB8, 0xAD, 0x99, 0xFF, 0x80, 0x5F, 0x2F, 0xFF, 0x80, 0x52, + 0x14, 0xFF, 0x93, 0x5B, 0x19, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0xA0, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA0, 0x60, + 0x18, 0xFF, 0x9E, 0x5D, 0x13, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0xA6, 0x70, + 0x39, 0xFF, 0xC1, 0x9E, 0x79, 0xC0, 0xC5, 0xB4, 0xA2, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD9, 0xC7, 0x0F, 0xBA, 0x91, 0x68, 0xBB, 0x93, 0x58, + 0x24, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x89, 0x47, 0x0B, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x93, 0x51, + 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA3, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0x99, 0x60, 0x1C, 0xFF, 0xBA, 0x9F, + 0x7C, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x7B, 0x69, + 0x45, 0xFF, 0x9B, 0x8C, 0x71, 0xFF, 0xE1, 0xDF, 0xDC, 0xFF, 0xCE, 0xC8, 0xBD, 0xFF, 0x8E, 0x74, + 0x4C, 0xFF, 0x7E, 0x54, 0x19, 0xFF, 0x90, 0x5C, 0x1B, 0xFF, 0x9D, 0x62, 0x1D, 0xFF, 0xA2, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA2, 0x62, 0x18, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0x9E, 0x5C, + 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0xA0, 0x64, + 0x26, 0xFF, 0xBF, 0x96, 0x6B, 0xE1, 0xE0, 0xCA, 0xB1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, 0xA6, 0x1F, 0xB4, 0x88, 0x5B, 0xD9, 0x91, 0x53, + 0x1D, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x98, 0x56, + 0x11, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0x9C, 0x68, + 0x27, 0xFF, 0xC5, 0xB2, 0x9A, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xD4, 0xD0, + 0xC9, 0xFF, 0x88, 0x78, 0x57, 0xFF, 0x8C, 0x7A, 0x58, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xDC, 0xDA, + 0xD7, 0xFF, 0xA1, 0x8F, 0x70, 0xFF, 0x7F, 0x5A, 0x22, 0xFF, 0x8D, 0x5C, 0x1C, 0xFF, 0x9D, 0x65, + 0x20, 0xFF, 0xA5, 0x68, 0x20, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x1E, 0xFF, 0xA3, 0x62, + 0x16, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9F, 0x61, + 0x1F, 0xFF, 0xBA, 0x8D, 0x5D, 0xF1, 0xDC, 0xC4, 0xAA, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBB, 0x9E, 0x34, 0xB1, 0x81, 0x51, 0xEB, 0x91, 0x51, + 0x18, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x91, 0x4F, 0x0D, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0xA1, 0x62, + 0x1D, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA9, 0x6B, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, 0x24, 0xFF, 0xA5, 0x6A, + 0x22, 0xFF, 0xA2, 0x73, 0x37, 0xFF, 0xCE, 0xC2, 0xB2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xDE, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xDD, 0xDB, 0xD8, 0xFF, 0x98, 0x8B, 0x6F, 0xFF, 0x81, 0x6E, 0x48, 0xFF, 0xC8, 0xC0, + 0xB4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0x85, 0x66, 0x35, 0xFF, 0x8A, 0x5D, + 0x1E, 0xFF, 0x9D, 0x67, 0x23, 0xFF, 0xA7, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAA, 0x6C, + 0x23, 0xFF, 0xA6, 0x66, 0x1A, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0xA1, 0x61, + 0x1B, 0xFF, 0xB8, 0x88, 0x54, 0xF9, 0xD6, 0xB9, 0x99, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0x9F, 0x47, 0xAF, 0x7D, 0x4B, 0xF1, 0x92, 0x52, + 0x15, 0xFF, 0x90, 0x4C, 0x0C, 0xFF, 0x98, 0x56, 0x13, 0xFF, 0xA2, 0x64, 0x21, 0xFF, 0xA7, 0x6B, + 0x26, 0xFF, 0xAA, 0x6D, 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xA6, 0x6C, 0x24, 0xFF, 0xA9, 0x81, 0x4C, 0xFF, 0xD2, 0xCC, 0xC3, 0xFF, 0xDB, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB4, 0xA6, 0x8F, 0xFF, 0xBD, 0xB0, + 0x99, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAA, 0xA0, 0x8A, 0xFF, 0x80, 0x6D, + 0x45, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xC8, 0xC1, 0xB6, 0xFF, 0x92, 0x79, + 0x50, 0xFF, 0x87, 0x5F, 0x22, 0xFF, 0x9B, 0x68, 0x25, 0xFF, 0xA8, 0x6E, 0x27, 0xFF, 0xAC, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x5F, 0x12, 0xFF, 0xA2, 0x62, + 0x18, 0xFF, 0xB7, 0x86, 0x4E, 0xFE, 0xD5, 0xB6, 0x93, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBC, 0x9E, 0x53, 0xB0, 0x7C, 0x48, 0xF5, 0x94, 0x52, + 0x14, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0xA2, 0x65, 0x24, 0xFF, 0xA8, 0x6C, 0x29, 0xFF, 0xAB, 0x6F, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xA7, 0x6F, 0x28, 0xFF, 0xB0, 0x8F, 0x62, 0xFF, 0xD3, 0xD0, + 0xCC, 0xFF, 0xD6, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x80, 0x68, 0x3A, 0xFF, 0x8F, 0x73, + 0x44, 0xFF, 0xDA, 0xD3, 0xCA, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xBD, 0xB7, + 0xA8, 0xFF, 0x89, 0x79, 0x54, 0xFF, 0xAF, 0xA4, 0x8E, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xD5, 0xD3, + 0xCE, 0xFF, 0xA2, 0x90, 0x70, 0xFF, 0x87, 0x63, 0x2B, 0xFF, 0x99, 0x69, 0x27, 0xFF, 0xA8, 0x71, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAA, 0x6B, 0x20, 0xFF, 0xA5, 0x64, + 0x19, 0xFF, 0xB8, 0x84, 0x4A, 0xFF, 0xD5, 0xB5, 0x91, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBC, 0x9D, 0x59, 0xB1, 0x7C, 0x46, 0xF7, 0x9A, 0x59, + 0x1B, 0xFF, 0xA1, 0x64, 0x26, 0xFF, 0xA8, 0x6C, 0x2C, 0xFF, 0xAC, 0x70, 0x2C, 0xFF, 0xAF, 0x73, + 0x2D, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xA9, 0x73, 0x2D, 0xFF, 0xB9, 0x9F, + 0x7D, 0xFF, 0xD5, 0xD5, 0xD4, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD4, 0xD2, 0xCE, 0xFF, 0xAA, 0x9F, 0x87, 0xFF, 0xA2, 0x91, + 0x6F, 0xFF, 0xBD, 0xB1, 0x99, 0xFF, 0xD2, 0xCB, 0xBC, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xCD, 0xC5, + 0xB7, 0xFF, 0xDE, 0xDB, 0xD5, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE4, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0x95, 0x86, 0x66, 0xFF, 0xA7, 0x9B, 0x81, 0xFF, 0xDA, 0xD8, + 0xD5, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xB3, 0xA7, 0x91, 0xFF, 0x8C, 0x6D, 0x39, 0xFF, 0x96, 0x6A, + 0x29, 0xFF, 0xA9, 0x74, 0x2E, 0xFF, 0xB1, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xAD, 0x6F, + 0x27, 0xFF, 0xB9, 0x86, 0x4A, 0xFF, 0xD6, 0xB6, 0x90, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xBD, 0x9D, 0x57, 0xB5, 0x82, 0x4D, 0xF7, 0xA5, 0x69, + 0x2F, 0xFF, 0xA8, 0x6C, 0x2E, 0xFF, 0xAC, 0x71, 0x30, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB3, 0x78, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7E, 0x33, 0xFF, 0xB8, 0x82, 0x3C, 0xFF, 0xB4, 0x89, + 0x4D, 0xFF, 0xC7, 0xB6, 0x9F, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xD9, + 0xD5, 0xFF, 0xA9, 0x99, 0x79, 0xFF, 0xAD, 0x9B, 0x78, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xBB, 0xB0, + 0x99, 0xFF, 0x9D, 0x89, 0x63, 0xFF, 0xAE, 0xA1, 0x85, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0xA0, 0x95, 0x79, 0xFF, 0xA3, 0x96, + 0x79, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xC5, 0xBD, 0xAF, 0xFF, 0x95, 0x7B, + 0x4D, 0xFF, 0x96, 0x6C, 0x2D, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB5, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB5, 0x7C, + 0x37, 0xFF, 0xC0, 0x90, 0x57, 0xFF, 0xD7, 0xB7, 0x92, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC0, 0xA1, 0x4F, 0xBF, 0x90, 0x5E, 0xF4, 0xAD, 0x74, + 0x3A, 0xFF, 0xAC, 0x71, 0x32, 0xFF, 0xB0, 0x76, 0x34, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB7, 0x7D, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC4, 0x93, 0x53, 0xFF, 0xC0, 0x91, + 0x52, 0xFF, 0xBA, 0x93, 0x5E, 0xFF, 0xD0, 0xC4, 0xB5, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDD, 0xDE, + 0xDF, 0xFF, 0xC0, 0xB9, 0xA6, 0xFF, 0xAA, 0x9B, 0x7B, 0xFF, 0xD6, 0xD0, 0xC4, 0xFF, 0xDF, 0xDD, + 0xD8, 0xFF, 0xA3, 0x95, 0x74, 0xFF, 0xAA, 0x9F, 0x85, 0xFF, 0xDA, 0xDA, 0xD8, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xDC, 0xDB, 0xD8, 0xFF, 0xAE, 0xA5, + 0x8E, 0xFF, 0xA2, 0x95, 0x78, 0xFF, 0xD3, 0xD0, 0xC8, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xD3, 0xCE, + 0xC4, 0xFF, 0xA3, 0x8B, 0x61, 0xFF, 0x9F, 0x74, 0x34, 0xFF, 0xB3, 0x7D, 0x36, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x81, + 0x3D, 0xFF, 0xC8, 0x9B, 0x66, 0xFF, 0xDB, 0xBD, 0x9A, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC3, 0xA4, 0x40, 0xC4, 0x99, 0x68, 0xEF, 0xB2, 0x7A, + 0x40, 0xFF, 0xB0, 0x75, 0x36, 0xFF, 0xB4, 0x7A, 0x38, 0xFF, 0xB7, 0x7E, 0x39, 0xFF, 0xBA, 0x81, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4B, 0xFF, 0xC9, 0x98, 0x5A, 0xFF, 0xC9, 0x99, 0x5A, 0xFF, 0xC8, 0x98, + 0x5A, 0xFF, 0xC2, 0x95, 0x58, 0xFF, 0xC0, 0x9E, 0x6F, 0xFF, 0xD8, 0xD1, 0xC5, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xDF, 0xFF, 0xC5, 0xBF, 0xB0, 0xFF, 0xD6, 0xD2, 0xC8, 0xFF, 0xB3, 0xA8, 0x8D, 0xFF, 0xD3, 0xCE, + 0xC2, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xDB, 0xDB, 0xD9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE1, 0xFF, 0xBD, 0xB7, 0xA6, 0xFF, 0xA4, 0x99, 0x7C, 0xFF, 0xD1, 0xCD, 0xC2, 0xFF, 0xE2, 0xE3, + 0xE5, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xA6, 0x84, 0x4E, 0xFF, 0xB1, 0x7E, 0x38, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x87, + 0x42, 0xFF, 0xCD, 0xA2, 0x6E, 0xFD, 0xDE, 0xC1, 0x9E, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC4, 0xA4, 0x2B, 0xCB, 0xA0, 0x70, 0xE5, 0xB8, 0x81, + 0x47, 0xFF, 0xB4, 0x7A, 0x3A, 0xFF, 0xB7, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC5, 0x92, + 0x4D, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, 0x62, 0xFF, 0xCD, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xC5, 0x9A, 0x5E, 0xFF, 0xC7, 0xA9, 0x7F, 0xFF, 0xDE, 0xDA, + 0xD4, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xC4, 0xBE, 0xAC, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xB3, 0xA7, + 0x8C, 0xFF, 0xD4, 0xCF, 0xC4, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xAA, 0xA1, 0x86, 0xFF, 0xD1, 0xCD, + 0xC2, 0xFF, 0xE5, 0xE3, 0xE0, 0xFF, 0xB3, 0x93, 0x62, 0xFF, 0xB4, 0x81, 0x3B, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC1, 0x8D, + 0x4A, 0xFF, 0xD1, 0xA9, 0x77, 0xF7, 0xE2, 0xCA, 0xA9, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xCA, 0xAA, 0x17, 0xD0, 0xA8, 0x7B, 0xCE, 0xBE, 0x8A, + 0x51, 0xFF, 0xB8, 0x7F, 0x3F, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC1, 0x89, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC7, 0x91, 0x4A, 0xFF, 0xCE, 0xA0, + 0x63, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xC8, 0x9E, 0x65, 0xFF, 0xCD, 0xB5, + 0x91, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xC0, 0xB6, 0xA0, 0xFF, 0xBB, 0xAD, 0x90, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xD6, 0xD2, + 0xC8, 0xFF, 0xB6, 0xA8, 0x8A, 0xFF, 0xC0, 0xB2, 0x97, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xBB, 0xB2, + 0x9B, 0xFF, 0xD7, 0xCC, 0xB9, 0xFF, 0xB6, 0x90, 0x57, 0xFF, 0xBC, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC7, 0x94, + 0x53, 0xFF, 0xD6, 0xB0, 0x81, 0xED, 0xE8, 0xD2, 0xB5, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xEC, 0xDE, 0x09, 0xD6, 0xB1, 0x86, 0xAC, 0xC4, 0x93, + 0x5C, 0xFF, 0xBC, 0x84, 0x45, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC4, 0x8D, + 0x46, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCE, 0x9F, 0x5F, 0xFF, 0xD3, 0xA9, + 0x6F, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xCB, 0xA4, + 0x6D, 0xFF, 0xD4, 0xC0, 0xA3, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xE9, 0xFF, 0xB8, 0xB0, 0x98, 0xFF, 0x9C, 0x8C, 0x64, 0xFF, 0xC4, 0xBB, 0xA8, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xB0, 0xA3, 0x85, 0xFF, 0xA2, 0x8E, 0x62, 0xFF, 0xC3, 0xB9, 0xA5, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE6, 0xE3, + 0xDE, 0xFF, 0xC0, 0xAC, 0x88, 0xFF, 0xB4, 0x89, 0x49, 0xFF, 0xC1, 0x8E, 0x46, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x90, 0x48, 0xFF, 0xCD, 0x9D, + 0x5F, 0xFF, 0xDB, 0xB8, 0x8C, 0xD5, 0xE8, 0xD3, 0xB7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xB8, 0x8D, 0x7E, 0xCD, 0x9F, + 0x69, 0xFF, 0xC2, 0x8B, 0x4D, 0xFF, 0xC3, 0x8B, 0x48, 0xFF, 0xC5, 0x8F, 0x4A, 0xFF, 0xC8, 0x92, + 0x4B, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCC, 0x95, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4B, 0xFF, 0xCE, 0x9B, 0x55, 0xFF, 0xD6, 0xAC, 0x72, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD5, 0xAC, + 0x74, 0xFF, 0xCF, 0xAA, 0x77, 0xFF, 0xDB, 0xCC, 0xB4, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xED, 0xFF, 0xE1, 0xDF, 0xDA, 0xFF, 0xD1, 0xCD, 0xC1, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, 0xE7, 0xE6, + 0xE6, 0xFF, 0xD5, 0xD2, 0xC9, 0xFF, 0xBD, 0xB6, 0xA2, 0xFF, 0xC2, 0xBD, 0xAC, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xDD, 0xDA, + 0xD0, 0xFF, 0xB9, 0xA9, 0x85, 0xFF, 0xB8, 0x96, 0x5F, 0xFF, 0xBA, 0x8D, 0x48, 0xFF, 0xC4, 0x92, + 0x4B, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xD4, 0xA8, + 0x6D, 0xFF, 0xDC, 0xBC, 0x93, 0xAD, 0xC5, 0xBC, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC5, 0xA0, 0x48, 0xD4, 0xAA, + 0x76, 0xF2, 0xC9, 0x94, 0x57, 0xFF, 0xC7, 0x8F, 0x4C, 0xFF, 0xCA, 0x93, 0x4E, 0xFF, 0xCC, 0x96, + 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xD5, 0xA7, 0x66, 0xFF, 0xDB, 0xB3, 0x7C, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xD8, 0xB1, 0x7A, 0xFF, 0xD2, 0xB1, 0x80, 0xFF, 0xDF, 0xD4, 0xC0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEF, 0xEF, 0xED, 0xFF, 0xE6, 0xE5, + 0xDF, 0xFF, 0xC3, 0xBB, 0xA2, 0xFF, 0xC7, 0xB8, 0x99, 0xFF, 0xB7, 0x99, 0x64, 0xFF, 0xB7, 0x8E, + 0x4B, 0xFF, 0xC5, 0x96, 0x4F, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x99, 0x50, 0xFF, 0xD0, 0x9D, 0x58, 0xFF, 0xDB, 0xB2, + 0x7D, 0xFE, 0xDF, 0xC2, 0x9C, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xB3, 0x1A, 0xDB, 0xB5, + 0x85, 0xCF, 0xD0, 0x9E, 0x63, 0xFF, 0xCB, 0x94, 0x52, 0xFF, 0xCD, 0x97, 0x51, 0xFF, 0xCF, 0x9A, + 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD3, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xDB, 0xB2, 0x76, 0xFF, 0xDE, 0xB9, 0x82, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDB, 0xB6, 0x80, 0xFF, 0xD6, 0xB7, 0x89, 0xFF, 0xE4, 0xDB, + 0xCC, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEB, 0xEA, 0xE7, 0xFF, 0xD3, 0xCE, 0xBC, 0xFF, 0xD2, 0xC9, 0xB2, 0xFF, 0xBE, 0xA5, + 0x77, 0xFF, 0xBD, 0x94, 0x52, 0xFF, 0xCD, 0x9C, 0x53, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD3, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xD6, 0xA6, 0x65, 0xFF, 0xE0, 0xBC, + 0x8C, 0xEC, 0xD8, 0xC1, 0xA2, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xE1, 0xBF, + 0x91, 0x8D, 0xD7, 0xAA, 0x73, 0xFF, 0xD0, 0x9B, 0x5A, 0xFF, 0xD1, 0x9B, 0x55, 0xFF, 0xD3, 0x9E, + 0x57, 0xFF, 0xD4, 0xA0, 0x58, 0xFF, 0xD5, 0xA2, 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD8, 0xA6, 0x5F, 0xFF, 0xE0, 0xBA, 0x82, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xDE, 0xBA, 0x85, 0xFF, 0xD9, 0xBD, + 0x92, 0xFF, 0xE7, 0xE0, 0xD3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xED, + 0xED, 0xFF, 0xE7, 0xE7, 0xE2, 0xFF, 0xEB, 0xEB, 0xE8, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xEF, 0xED, 0xFF, 0xDC, 0xD8, 0xCC, 0xFF, 0xE0, 0xD8, + 0xC7, 0xFF, 0xC1, 0xA0, 0x67, 0xFF, 0xCD, 0x9E, 0x56, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xDD, 0xB2, 0x76, 0xFF, 0xE3, 0xC4, + 0x98, 0xBB, 0xD5, 0xC3, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, + 0xA1, 0x41, 0xDE, 0xB6, 0x82, 0xEC, 0xD6, 0xA4, 0x67, 0xFF, 0xD4, 0x9F, 0x5B, 0xFF, 0xD6, 0xA1, + 0x5B, 0xFF, 0xD7, 0xA4, 0x5C, 0xFF, 0xD9, 0xA6, 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5C, 0xFF, 0xDC, 0xAD, 0x67, 0xFF, 0xE4, 0xC0, 0x8B, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE0, 0xBF, + 0x8C, 0xFF, 0xDC, 0xC3, 0x9A, 0xFF, 0xEA, 0xE4, 0xD9, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEA, 0xEA, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF1, 0xFF, 0xE0, 0xDD, 0xD2, 0xFF, 0xEE, 0xED, 0xE9, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xE9, 0xE3, + 0xD7, 0xFF, 0xC9, 0xA7, 0x6D, 0xFF, 0xD2, 0xA3, 0x5B, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDB, 0xAC, 0x67, 0xFF, 0xE3, 0xBE, 0x88, 0xFC, 0xE7, 0xCC, + 0xA3, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD7, + 0xBA, 0x0C, 0xE3, 0xBF, 0x8F, 0xAE, 0xDD, 0xB1, 0x77, 0xFF, 0xD8, 0xA5, 0x62, 0xFF, 0xD9, 0xA5, + 0x5F, 0xFF, 0xDA, 0xA8, 0x60, 0xFF, 0xDB, 0xAA, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x60, 0xFF, 0xDF, 0xB2, 0x6D, 0xFF, 0xE8, 0xC5, 0x92, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE7, 0xC7, + 0x94, 0xFF, 0xE3, 0xC3, 0x91, 0xFF, 0xE0, 0xC9, 0xA0, 0xFF, 0xED, 0xE7, 0xDC, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, + 0xF0, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xE3, 0xE2, + 0xD9, 0xFF, 0xCB, 0xC7, 0xB3, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF3, 0xF2, 0xF0, 0xFF, 0xD9, 0xC5, + 0xA1, 0xFF, 0xCE, 0xA4, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDD, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xDD, 0xAC, 0x64, 0xFF, 0xE2, 0xB7, 0x79, 0xFF, 0xE8, 0xC8, 0x99, 0xD5, 0xE3, 0xCD, + 0xAD, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xC3, 0x99, 0x4F, 0xE4, 0xBC, 0x87, 0xF2, 0xDD, 0xAE, 0x6F, 0xFF, 0xDC, 0xA9, + 0x63, 0xFF, 0xDD, 0xAB, 0x63, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, + 0x64, 0xFF, 0xE2, 0xB5, 0x70, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE6, 0xC8, 0x97, 0xFF, 0xE3, 0xCC, 0xA5, 0xFF, 0xEE, 0xE7, + 0xDC, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF4, 0xF3, 0xF1, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF0, 0xEF, + 0xEC, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xDF, 0xCF, 0xAF, 0xFF, 0xCD, 0xA6, + 0x65, 0xFF, 0xDA, 0xAC, 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x66, 0xFF, 0xE1, 0xB4, 0x6F, 0xFF, 0xE8, 0xC3, 0x8D, 0xFE, 0xE9, 0xCE, 0xA4, 0x7C, 0x36, 0xA7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDF, 0xCB, 0xAE, 0x0C, 0xE8, 0xC5, 0x94, 0xA8, 0xE4, 0xB9, 0x81, 0xFF, 0xE0, 0xAE, + 0x6C, 0xFF, 0xDF, 0xAE, 0x67, 0xFF, 0xE1, 0xB0, 0x68, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xE9, 0xCC, 0x9D, 0xFF, 0xE5, 0xCE, + 0xA6, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xF9, 0xFA, 0xFB, 0xFF, 0xF3, 0xF0, + 0xEA, 0xFF, 0xE2, 0xD4, 0xB8, 0xFF, 0xE7, 0xDB, 0xC3, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xF0, 0xEF, 0xEA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xEB, 0xE2, 0xCF, 0xFF, 0xD5, 0xB4, 0x7A, 0xFF, 0xDC, 0xAF, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCD, 0x9D, 0xCF, 0xE7, 0xD2, 0xB1, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, 0xA0, 0x3B, 0xEA, 0xC4, 0x90, 0xE3, 0xE5, 0xB9, + 0x7C, 0xFF, 0xE2, 0xB2, 0x6D, 0xFF, 0xE3, 0xB3, 0x6C, 0xFF, 0xE4, 0xB5, 0x6D, 0xFF, 0xE5, 0xB6, + 0x6D, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xF0, 0xD3, 0xA5, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEC, 0xD0, + 0xA2, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xED, 0xDE, 0xC3, 0xFF, 0xF1, 0xE8, 0xD7, 0xFF, 0xE7, 0xD4, + 0xB2, 0xFF, 0xE6, 0xCD, 0xA0, 0xFF, 0xE7, 0xCE, 0xA2, 0xFF, 0xEC, 0xDD, 0xC0, 0xFF, 0xF8, 0xF6, + 0xF1, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xDC, 0xDA, 0xCA, 0xFF, 0xE7, 0xE6, 0xDC, 0xFF, 0xFB, 0xFB, + 0xFB, 0xFF, 0xEF, 0xE7, 0xD7, 0xFF, 0xE2, 0xCB, 0xA1, 0xFF, 0xE1, 0xB8, 0x76, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE7, 0xBD, + 0x7C, 0xFF, 0xED, 0xCB, 0x96, 0xF6, 0xEC, 0xD3, 0xA9, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xDD, 0xE8, 0x02, 0xEC, 0xCC, 0x9C, 0x79, 0xEA, 0xC4, + 0x8D, 0xFB, 0xE6, 0xBA, 0x7A, 0xFF, 0xE6, 0xB6, 0x70, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE7, 0xB9, + 0x71, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEE, 0xD3, 0xA7, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEE, 0xD3, + 0xA7, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEB, 0xD2, 0xA7, 0xFF, 0xED, 0xDC, + 0xBC, 0xFF, 0xF8, 0xF5, 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF2, 0xEB, + 0xDD, 0xFF, 0xE5, 0xD2, 0xAD, 0xFF, 0xE9, 0xCC, 0x9A, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBA, + 0x71, 0xFF, 0xE8, 0xBA, 0x71, 0xFF, 0xE8, 0xBA, 0x72, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xED, 0xCA, + 0x91, 0xFF, 0xEF, 0xD3, 0xA5, 0xA5, 0xE9, 0xD8, 0xBC, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xAE, 0x13, 0xEE, 0xCD, + 0x9A, 0xAD, 0xEC, 0xC5, 0x8D, 0xFF, 0xE9, 0xBC, 0x7B, 0xFF, 0xE8, 0xBA, 0x74, 0xFF, 0xE9, 0xBB, + 0x74, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEC, 0xC4, 0x85, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xEE, 0xD6, + 0xAB, 0xFF, 0xEE, 0xDC, 0xBA, 0xFF, 0xF9, 0xF3, 0xEA, 0xFF, 0xF6, 0xF0, 0xE4, 0xFF, 0xE9, 0xD7, + 0xB2, 0xFF, 0xED, 0xD6, 0xAC, 0xFF, 0xED, 0xCB, 0x8F, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEA, 0xBD, + 0x75, 0xFF, 0xEA, 0xBD, 0x75, 0xFF, 0xEB, 0xBF, 0x7A, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xF0, 0xD3, + 0xA2, 0xD0, 0xED, 0xD7, 0xB3, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD3, + 0xA9, 0x2B, 0xF0, 0xCE, 0x9A, 0xCB, 0xEE, 0xC8, 0x8D, 0xFF, 0xEB, 0xBF, 0x7D, 0xFF, 0xEB, 0xBE, + 0x78, 0xFF, 0xEB, 0xBE, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xF2, 0xD4, 0xA1, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF4, 0xDB, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDB, + 0xB2, 0xFF, 0xF1, 0xD9, 0xB0, 0xFF, 0xF1, 0xDD, 0xB8, 0xFF, 0xF0, 0xDC, 0xB8, 0xFF, 0xF0, 0xDA, + 0xB1, 0xFF, 0xF2, 0xD8, 0xAA, 0xFF, 0xED, 0xC4, 0x81, 0xFF, 0xEC, 0xBF, 0x78, 0xFF, 0xEC, 0xC0, + 0x79, 0xFF, 0xEC, 0xC2, 0x7D, 0xFF, 0xEF, 0xCB, 0x8E, 0xFF, 0xF2, 0xD4, 0xA1, 0xE5, 0xF0, 0xD8, + 0xAF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD5, 0xA6, 0x3B, 0xF1, 0xD0, 0x9B, 0xD6, 0xEF, 0xCA, 0x8F, 0xFF, 0xEE, 0xC2, + 0x80, 0xFF, 0xED, 0xC1, 0x7B, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF6, 0xDD, + 0xB3, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF5, 0xDE, 0xB5, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF2, 0xD1, 0x97, 0xFF, 0xEE, 0xC3, 0x7B, 0xFF, 0xEE, 0xC3, 0x7C, 0xFF, 0xEF, 0xC5, + 0x80, 0xFF, 0xF1, 0xCD, 0x8F, 0xFF, 0xF3, 0xD5, 0xA1, 0xED, 0xF3, 0xD9, 0xAD, 0x61, 0xD5, 0xE7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA8, 0x47, 0xF3, 0xD3, 0x9E, 0xDB, 0xF2, 0xCD, + 0x92, 0xFF, 0xF0, 0xC7, 0x84, 0xFF, 0xEF, 0xC4, 0x7F, 0xFF, 0xF0, 0xC5, 0x7F, 0xFF, 0xF4, 0xD4, + 0x9F, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF5, 0xDA, + 0xA9, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xC7, 0x7F, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x92, 0xFF, 0xF5, 0xD7, 0xA3, 0xF1, 0xF4, 0xDA, 0xAF, 0x6F, 0xE5, 0xE4, 0xDD, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xD8, 0xA9, 0x45, 0xF4, 0xD5, + 0xA0, 0xD3, 0xF3, 0xD1, 0x97, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF1, 0xC8, 0x82, 0xFF, 0xF2, 0xCB, + 0x86, 0xFF, 0xF6, 0xDB, 0xAB, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF7, 0xDF, 0xB3, 0xFF, 0xF3, 0xCE, + 0x8D, 0xFF, 0xF2, 0xCA, 0x82, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF5, 0xD2, 0x98, 0xFF, 0xF6, 0xD8, + 0xA5, 0xE9, 0xF5, 0xDC, 0xB0, 0x6A, 0xEA, 0xE5, 0xDB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDB, + 0xAF, 0x35, 0xF5, 0xD7, 0xA3, 0xBD, 0xF5, 0xD4, 0x9D, 0xFE, 0xF4, 0xCF, 0x91, 0xFF, 0xF3, 0xCB, + 0x87, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDD, 0xAE, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF9, 0xE6, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF8, 0xE1, 0xB6, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF4, 0xCC, + 0x87, 0xFF, 0xF5, 0xD0, 0x91, 0xFF, 0xF6, 0xD6, 0x9E, 0xFF, 0xF7, 0xDA, 0xA8, 0xD5, 0xF6, 0xDD, + 0xB3, 0x52, 0xEC, 0xED, 0xF2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF3, 0xDC, 0xB4, 0x1D, 0xF5, 0xD8, 0xA7, 0x90, 0xF7, 0xD8, 0xA2, 0xF0, 0xF6, 0xD4, + 0x9A, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF8, 0xDC, 0xAC, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFB, 0xE7, 0xC5, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE7, + 0xC4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xF6, 0xD3, 0x94, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF7, 0xD5, + 0x9A, 0xFF, 0xF8, 0xDA, 0xA4, 0xF9, 0xF8, 0xDC, 0xAC, 0xAF, 0xF8, 0xE0, 0xB4, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xDA, 0xC4, 0x08, 0xF5, 0xDA, 0xAB, 0x51, 0xF7, 0xD9, + 0xA6, 0xC2, 0xF8, 0xD9, 0xA2, 0xFC, 0xF8, 0xD6, 0x9A, 0xFF, 0xF7, 0xD3, 0x94, 0xFF, 0xF8, 0xD9, + 0xA3, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE6, 0xC1, 0xFF, 0xF9, 0xDD, + 0xAA, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF8, 0xD6, 0x99, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDC, + 0xA9, 0xD6, 0xF8, 0xDE, 0xB0, 0x6D, 0xF7, 0xE5, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB6, 0x1A, 0xF7, 0xDC, 0xAB, 0x74, 0xF9, 0xDC, 0xA8, 0xD2, 0xF9, 0xDA, 0xA4, 0xFC, 0xF8, 0xD8, + 0x9E, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE6, 0xC0, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xF9, 0xD9, + 0x9E, 0xFF, 0xF9, 0xDB, 0xA5, 0xFF, 0xF9, 0xDD, 0xAB, 0xE1, 0xF8, 0xDE, 0xAF, 0x8E, 0xF8, 0xE2, + 0xB9, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB5, 0x21, 0xF8, 0xDD, 0xAD, 0x6E, 0xF9, 0xDD, + 0xAA, 0xBE, 0xFA, 0xDC, 0xA7, 0xEF, 0xFA, 0xDB, 0xA4, 0xFF, 0xFA, 0xDC, 0xA6, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFB, 0xE5, 0xBD, 0xFF, 0xFB, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDD, 0xA8, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, 0xA8, 0xF5, 0xF9, 0xDE, + 0xAC, 0xCE, 0xF9, 0xDE, 0xB0, 0x83, 0xF6, 0xE0, 0xB7, 0x31, 0xE6, 0xE4, 0xDF, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xE1, + 0xBD, 0x12, 0xFA, 0xE3, 0xB8, 0x44, 0xFB, 0xE0, 0xB0, 0x84, 0xFB, 0xDF, 0xAE, 0xBB, 0xFB, 0xDE, + 0xAB, 0xE2, 0xFB, 0xDE, 0xAA, 0xF4, 0xFB, 0xDF, 0xAC, 0xFD, 0xFB, 0xE1, 0xB0, 0xFF, 0xFB, 0xE2, + 0xB3, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE2, + 0xB4, 0xFF, 0xFB, 0xE1, 0xB1, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xDF, 0xAB, 0xF6, 0xFB, 0xDF, + 0xAC, 0xE8, 0xFB, 0xE0, 0xB0, 0xC6, 0xFB, 0xE1, 0xB1, 0x92, 0xFB, 0xE3, 0xB8, 0x52, 0xF7, 0xE3, + 0xBE, 0x1B, 0xA5, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, 0xC9, 0x0F, 0xFC, 0xE3, + 0xB5, 0x29, 0xFB, 0xE1, 0xB3, 0x4D, 0xFB, 0xE0, 0xAF, 0x6C, 0xFB, 0xE0, 0xAD, 0x89, 0xFB, 0xE0, + 0xAE, 0x9C, 0xFB, 0xE0, 0xAE, 0xA6, 0xFB, 0xE0, 0xAF, 0xAB, 0xFB, 0xE0, 0xAE, 0xA8, 0xFB, 0xE0, + 0xAE, 0x9F, 0xFB, 0xE0, 0xAE, 0x8F, 0xFB, 0xE1, 0xAF, 0x74, 0xFB, 0xE2, 0xB4, 0x55, 0xFC, 0xE3, + 0xB7, 0x32, 0xFC, 0xE8, 0xC3, 0x14, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, + 0xCE, 0x06, 0xFD, 0xE8, 0xC0, 0x09, 0xFC, 0xE6, 0xBC, 0x0B, 0xFC, 0xE8, 0xC0, 0x0A, 0xFD, 0xEC, + 0xCB, 0x07, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x43, + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0B, 0x6F, 0x82, 0x43, + 0x0B, 0x70, 0x82, 0x44, 0x0B, 0x70, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x63, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x81, 0x43, 0x0A, 0x8D, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x43, + 0x0A, 0x91, 0x83, 0x45, 0x0D, 0x94, 0x85, 0x49, 0x12, 0x98, 0x87, 0x4B, 0x14, 0x9A, 0x87, 0x4B, + 0x14, 0x9B, 0x87, 0x4B, 0x14, 0x9B, 0x85, 0x48, 0x12, 0x99, 0x83, 0x45, 0x0D, 0x96, 0x81, 0x42, + 0x0A, 0x94, 0x81, 0x42, 0x09, 0x92, 0x81, 0x43, 0x0A, 0x90, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x04, 0x8B, 0x51, 0x1D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4E, + 0x18, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x43, 0x0B, 0x9E, 0x81, 0x43, + 0x0A, 0xA2, 0x84, 0x47, 0x0F, 0xA8, 0x8B, 0x52, 0x1E, 0xB2, 0x92, 0x5F, 0x32, 0xC1, 0x96, 0x67, + 0x40, 0xD0, 0x97, 0x6B, 0x48, 0xDB, 0x98, 0x6E, 0x4E, 0xE5, 0x97, 0x6E, 0x4F, 0xEA, 0x97, 0x6E, + 0x50, 0xEB, 0x99, 0x70, 0x51, 0xEA, 0x9A, 0x70, 0x50, 0xE5, 0x99, 0x6D, 0x4A, 0xDB, 0x98, 0x69, + 0x42, 0xD0, 0x93, 0x5F, 0x32, 0xC2, 0x8A, 0x51, 0x1D, 0xB4, 0x83, 0x46, 0x0E, 0xAB, 0x81, 0x42, + 0x0A, 0xA7, 0x82, 0x43, 0x0B, 0xA4, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x06, 0x83, 0x45, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x52, + 0x1D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x90, 0x82, 0x44, 0x0B, 0x9B, 0x81, 0x43, 0x0A, 0xA1, 0x88, 0x4D, 0x17, 0xAD, 0x93, 0x60, + 0x33, 0xC6, 0x97, 0x6A, 0x47, 0xE1, 0x92, 0x68, 0x4A, 0xF3, 0x89, 0x5F, 0x43, 0xFC, 0x81, 0x57, + 0x3C, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x79, 0x4D, + 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7E, 0x54, 0x3A, 0xFF, 0x83, 0x5A, 0x40, 0xFF, 0x8A, 0x61, + 0x48, 0xFF, 0x92, 0x6B, 0x50, 0xFC, 0x9A, 0x71, 0x54, 0xF3, 0x9B, 0x70, 0x4D, 0xE1, 0x93, 0x60, + 0x33, 0xC7, 0x87, 0x4B, 0x14, 0xB2, 0x81, 0x43, 0x0A, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x4B, + 0x14, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x71, 0x81, 0x42, + 0x0A, 0x7E, 0x87, 0x4B, 0x14, 0x8F, 0x95, 0x64, 0x39, 0xBB, 0x95, 0x6A, 0x49, 0xE7, 0x87, 0x5C, + 0x3F, 0xFC, 0x77, 0x4A, 0x2E, 0xFF, 0x6F, 0x40, 0x24, 0xFF, 0x6C, 0x3C, 0x21, 0xFF, 0x6D, 0x3D, + 0x21, 0xFF, 0x6E, 0x3F, 0x22, 0xFF, 0x70, 0x41, 0x24, 0xFF, 0x72, 0x43, 0x26, 0xFF, 0x74, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x29, 0xFF, 0x76, 0x48, 0x2B, 0xFF, 0x77, 0x49, 0x2C, 0xFF, 0x78, 0x4A, + 0x2E, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7F, 0x53, 0x38, 0xFF, 0x89, 0x5F, 0x44, 0xFF, 0x96, 0x6E, + 0x53, 0xFC, 0x9E, 0x75, 0x55, 0xE7, 0x96, 0x65, 0x3A, 0xBD, 0x85, 0x49, 0x12, 0x98, 0x81, 0x42, + 0x0A, 0x8D, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x05, 0x84, 0x46, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x30, 0x81, 0x43, 0x0B, 0x42, 0x82, 0x44, 0x0C, 0x50, 0x95, 0x62, + 0x35, 0x81, 0x98, 0x6C, 0x4A, 0xD0, 0x85, 0x59, 0x3B, 0xFB, 0x71, 0x41, 0x24, 0xFF, 0x69, 0x37, + 0x1A, 0xFF, 0x69, 0x37, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3D, 0x1D, 0xFF, 0x72, 0x40, + 0x1F, 0xFF, 0x75, 0x43, 0x21, 0xFF, 0x77, 0x45, 0x23, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x7B, 0x49, + 0x26, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7D, 0x4C, 0x29, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7D, 0x4E, 0x2D, 0xFF, 0x7D, 0x4E, 0x2E, 0xFF, 0x7C, 0x4E, 0x30, 0xFF, 0x7F, 0x52, + 0x34, 0xFF, 0x88, 0x5D, 0x41, 0xFF, 0x98, 0x71, 0x55, 0xFA, 0xA1, 0x77, 0x56, 0xCF, 0x93, 0x5F, + 0x30, 0x87, 0x81, 0x43, 0x0A, 0x61, 0x82, 0x43, 0x0B, 0x57, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x04, 0x8C, 0x54, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x10, 0x80, 0x40, 0x07, 0x19, 0x8C, 0x51, 0x1C, 0x28, 0x9F, 0x74, 0x50, 0x80, 0x8E, 0x62, + 0x42, 0xE7, 0x73, 0x41, 0x22, 0xFF, 0x64, 0x30, 0x12, 0xFF, 0x63, 0x2E, 0x0E, 0xFF, 0x66, 0x31, + 0x0F, 0xFF, 0x6A, 0x34, 0x11, 0xFF, 0x6E, 0x37, 0x13, 0xFF, 0x72, 0x3B, 0x14, 0xFF, 0x75, 0x3F, + 0x17, 0xFF, 0x79, 0x43, 0x1A, 0xFF, 0x7C, 0x47, 0x1E, 0xFF, 0x7F, 0x4A, 0x21, 0xFF, 0x82, 0x4D, + 0x24, 0xFF, 0x83, 0x4F, 0x27, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x2A, 0xFF, 0x85, 0x52, + 0x2B, 0xFF, 0x84, 0x52, 0x2D, 0xFF, 0x84, 0x52, 0x2E, 0xFF, 0x83, 0x52, 0x2F, 0xFF, 0x82, 0x52, + 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x83, 0x55, 0x37, 0xFF, 0x90, 0x65, 0x49, 0xFF, 0xA2, 0x7B, + 0x5E, 0xE5, 0xA3, 0x79, 0x54, 0x80, 0x86, 0x49, 0x12, 0x34, 0x81, 0x42, 0x09, 0x28, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x83, 0x46, + 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x73, 0x2D, + 0x00, 0x05, 0xA6, 0x79, 0x50, 0x12, 0xA3, 0x7B, 0x5C, 0x86, 0x84, 0x55, 0x34, 0xF5, 0x66, 0x31, + 0x10, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, + 0x09, 0xFF, 0x77, 0x3B, 0x0A, 0xFF, 0x79, 0x3D, 0x0C, 0xFF, 0x7C, 0x3F, 0x0E, 0xFF, 0x7E, 0x43, + 0x12, 0xFF, 0x81, 0x47, 0x17, 0xFF, 0x85, 0x4D, 0x1D, 0xFF, 0x88, 0x52, 0x24, 0xFF, 0x8A, 0x55, + 0x29, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x89, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x85, 0x54, 0x30, 0xFF, 0x84, 0x54, 0x33, 0xFF, 0x8B, 0x5E, + 0x3F, 0xFF, 0x9F, 0x78, 0x5B, 0xF1, 0xAE, 0x89, 0x6B, 0x80, 0x94, 0x5E, 0x2D, 0x16, 0x7D, 0x3C, + 0x01, 0x0C, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xAB, + 0x8F, 0x09, 0xA5, 0x7E, 0x5F, 0x84, 0x81, 0x51, 0x2F, 0xF9, 0x65, 0x2E, 0x0C, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x30, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6E, 0x34, + 0x07, 0xFF, 0x74, 0x39, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x41, + 0x0A, 0xFF, 0x80, 0x41, 0x0A, 0xFF, 0x80, 0x42, 0x0B, 0xFF, 0x82, 0x44, 0x0E, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x89, 0x4F, 0x1C, 0xFF, 0x8C, 0x55, 0x25, 0xFF, 0x8F, 0x5A, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2E, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, 0x30, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x87, 0x56, + 0x32, 0xFF, 0x8B, 0x5D, 0x3B, 0xFF, 0xA0, 0x78, 0x59, 0xF6, 0xB4, 0x91, 0x75, 0x79, 0xAB, 0x7F, + 0x56, 0x07, 0x63, 0x16, 0x00, 0x02, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFA, 0x03, 0xAC, 0x86, + 0x68, 0x76, 0x85, 0x54, 0x31, 0xF7, 0x67, 0x2F, 0x0B, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x33, 0x08, 0xFF, 0x6A, 0x32, 0x05, 0xFF, 0x6E, 0x3E, 0x14, 0xFF, 0x70, 0x43, + 0x19, 0xFF, 0x6D, 0x38, 0x07, 0xFF, 0x7C, 0x40, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x47, 0x0E, 0xFF, 0x89, 0x4C, 0x15, 0xFF, 0x8E, 0x55, + 0x21, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8E, 0x5E, 0x3A, 0xFF, 0xA3, 0x7B, 0x5B, 0xF2, 0xBA, 0x99, + 0x7D, 0x67, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x91, 0x74, 0x52, 0x8D, 0x5E, + 0x3A, 0xEE, 0x6B, 0x33, 0x0E, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x35, + 0x08, 0xFF, 0x6A, 0x33, 0x06, 0xFF, 0x77, 0x51, 0x2C, 0xFF, 0xA8, 0x97, 0x83, 0xFF, 0xC1, 0xB6, + 0xA8, 0xFF, 0x83, 0x63, 0x40, 0xFF, 0x6E, 0x3B, 0x08, 0xFF, 0x7F, 0x44, 0x0B, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x48, + 0x0D, 0xFF, 0x8A, 0x4C, 0x13, 0xFF, 0x90, 0x56, 0x21, 0xFF, 0x94, 0x5D, 0x2C, 0xFF, 0x93, 0x5E, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, 0x31, 0xFF, 0x91, 0x62, 0x3D, 0xFF, 0xA9, 0x82, + 0x62, 0xE8, 0xC2, 0xA4, 0x8A, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xA4, 0x87, 0x25, 0x9A, 0x6E, 0x4A, 0xD1, 0x72, 0x3B, + 0x13, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x38, 0x09, 0xFF, 0x6D, 0x36, + 0x06, 0xFF, 0x80, 0x5E, 0x3A, 0xFF, 0xD1, 0xCA, 0xC1, 0xFF, 0xD9, 0xD7, 0xD4, 0xFF, 0xB6, 0xB0, + 0xA4, 0xFF, 0xC7, 0xBE, 0xB3, 0xFF, 0x9D, 0x85, 0x69, 0xFF, 0x72, 0x43, 0x11, 0xFF, 0x7D, 0x44, + 0x0A, 0xFF, 0x88, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8C, 0x4F, 0x14, 0xFF, 0x92, 0x59, + 0x24, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x98, 0x69, + 0x43, 0xFF, 0xB2, 0x8D, 0x6D, 0xC7, 0xCD, 0xB1, 0x99, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xF1, 0xE4, 0x04, 0xAB, 0x83, 0x61, 0x92, 0x81, 0x4B, 0x23, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x71, 0x39, 0x07, 0xFF, 0x7F, 0x5B, + 0x35, 0xFF, 0xD3, 0xCC, 0xC3, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xDE, 0xDC, + 0xD9, 0xFF, 0xAE, 0xA6, 0x98, 0xFF, 0xB8, 0xB0, 0xA3, 0xFF, 0xB4, 0xA4, 0x8F, 0xFF, 0x7A, 0x52, + 0x24, 0xFF, 0x79, 0x43, 0x09, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0F, 0xFF, 0x90, 0x54, 0x1A, 0xFF, 0x96, 0x5E, 0x2B, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x92, 0x5F, + 0x33, 0xFF, 0xA2, 0x76, 0x50, 0xFF, 0xBD, 0x9B, 0x7D, 0x84, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBE, 0x9C, 0x7D, 0x3C, 0x95, 0x65, 0x3D, 0xEA, 0x73, 0x37, 0x0D, 0xFF, 0x72, 0x35, + 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x7A, 0x50, 0x25, 0xFF, 0xCC, 0xC2, + 0xB7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xAF, 0xA8, 0x9B, 0xFF, 0xA3, 0x9A, 0x8A, 0xFF, 0xBF, 0xB5, + 0xA7, 0xFF, 0x89, 0x69, 0x42, 0xFF, 0x76, 0x43, 0x0A, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x8E, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8F, 0x51, 0x13, 0xFF, 0x95, 0x5C, 0x25, 0xFF, 0x96, 0x60, + 0x2F, 0xFF, 0x98, 0x66, 0x39, 0xFF, 0xB0, 0x89, 0x65, 0xE2, 0xCB, 0xAE, 0x93, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x04, 0xAD, 0x84, 0x60, 0x9A, 0x83, 0x4B, 0x1F, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x80, 0x40, 0x0A, 0xFF, 0x80, 0x4B, 0x16, 0xFF, 0xC2, 0xB2, 0xA0, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xBA, 0xB4, 0xA9, 0xFF, 0x92, 0x86, + 0x71, 0xFF, 0xBE, 0xB5, 0xAA, 0xFF, 0x9D, 0x86, 0x69, 0xFF, 0x76, 0x49, 0x13, 0xFF, 0x83, 0x4A, + 0x0C, 0xFF, 0x8F, 0x50, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x93, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x11, 0xFF, 0x94, 0x5A, + 0x21, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0xA5, 0x77, 0x4C, 0xFF, 0xC0, 0x9E, 0x7E, 0x8C, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xAE, + 0x91, 0x2B, 0x9E, 0x6D, 0x44, 0xE2, 0x7A, 0x3D, 0x0F, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x81, 0x41, + 0x0B, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x8E, 0x57, 0x20, 0xFF, 0xD8, 0xCC, 0xBD, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xCA, 0xC5, + 0xBD, 0xFF, 0x8B, 0x7D, 0x66, 0xFF, 0xB3, 0xAB, 0x9C, 0xFF, 0xB3, 0xA4, 0x90, 0xFF, 0x7D, 0x57, + 0x26, 0xFF, 0x7F, 0x4A, 0x0C, 0xFF, 0x90, 0x53, 0x10, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x96, 0x55, + 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x91, 0x50, + 0x10, 0xFF, 0x94, 0x59, 0x1E, 0xFF, 0x9E, 0x69, 0x38, 0xFF, 0xB7, 0x90, 0x6A, 0xD9, 0xD2, 0xB7, + 0x9C, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x97, + 0x73, 0x6D, 0x90, 0x5A, 0x2B, 0xFE, 0x7B, 0x3C, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, 0x0C, 0xFF, 0xA1, 0x76, 0x45, 0xFF, 0xE6, 0xE1, + 0xDA, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, + 0xF4, 0xFF, 0xD9, 0xD7, 0xD2, 0xFF, 0x8F, 0x82, 0x6A, 0xFF, 0xA4, 0x9A, 0x87, 0xFF, 0xC5, 0xBC, + 0xB0, 0xFF, 0x8D, 0x70, 0x48, 0xFF, 0x7D, 0x4C, 0x10, 0xFF, 0x90, 0x55, 0x12, 0xFF, 0x98, 0x59, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x97, 0x5B, 0x21, 0xFF, 0xAF, 0x81, 0x56, 0xFB, 0xCA, 0xAA, + 0x8A, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xF0, 0xE2, 0x07, 0xB0, 0x85, + 0x5D, 0xAD, 0x88, 0x4C, 0x1A, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x92, 0x54, 0x0F, 0xFF, 0xB4, 0x94, + 0x6C, 0xFF, 0xEC, 0xEB, 0xE9, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0x9D, 0x92, 0x7C, 0xFF, 0x96, 0x88, + 0x6E, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xA3, 0x8E, 0x70, 0xFF, 0x7E, 0x53, 0x1A, 0xFF, 0x8D, 0x56, + 0x14, 0xFF, 0x9A, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0xA4, 0x6F, 0x3A, 0xFF, 0xC0, 0x9D, + 0x79, 0x9E, 0x87, 0x96, 0xA1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0xA2, 0x1E, 0xA8, 0x78, + 0x4B, 0xD9, 0x86, 0x47, 0x12, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9A, 0x61, + 0x1E, 0xFF, 0xC4, 0xAE, 0x91, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xB0, 0xA7, + 0x95, 0xFF, 0x8D, 0x7E, 0x60, 0xFF, 0xCC, 0xC5, 0xBB, 0xFF, 0xB9, 0xAD, 0x99, 0xFF, 0x85, 0x61, + 0x2E, 0xFF, 0x8B, 0x57, 0x16, 0xFF, 0x9C, 0x60, 0x1A, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9C, 0x5F, 0x20, 0xFF, 0xBA, 0x91, + 0x67, 0xCE, 0xD0, 0xBB, 0xA6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAA, 0x88, 0x3C, 0xA3, 0x6F, + 0x3E, 0xF0, 0x87, 0x46, 0x0E, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x9A, 0x59, + 0x13, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA3, 0x66, + 0x1D, 0xFF, 0xA0, 0x6C, 0x2D, 0xFF, 0xCF, 0xC0, 0xAD, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xC2, 0xBC, 0xAF, 0xFF, 0x8C, 0x7C, 0x5C, 0xFF, 0xBF, 0xB7, 0xA9, 0xFF, 0xCD, 0xC5, + 0xBA, 0xFF, 0x91, 0x76, 0x4C, 0xFF, 0x88, 0x59, 0x1B, 0xFF, 0x9C, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA4, 0x65, 0x1C, 0xFF, 0xA1, 0x60, + 0x15, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xB5, 0x87, + 0x54, 0xE9, 0xDA, 0xC1, 0xA5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA2, 0x7C, 0x59, 0xA0, 0x68, + 0x34, 0xFC, 0x8B, 0x49, 0x0D, 0xFF, 0x92, 0x4F, 0x0E, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xA4, 0x66, + 0x20, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xAA, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA6, 0x6A, 0x21, 0xFF, 0xA7, 0x7B, 0x42, 0xFF, 0xD4, 0xCD, 0xC1, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x92, 0x82, 0x64, 0xFF, 0xB0, 0xA5, + 0x90, 0xFF, 0xD6, 0xD3, 0xCD, 0xFF, 0xA3, 0x90, 0x71, 0xFF, 0x89, 0x60, 0x25, 0xFF, 0x9B, 0x65, + 0x21, 0xFF, 0xA7, 0x6B, 0x23, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xA9, 0x6C, + 0x22, 0xFF, 0xA6, 0x65, 0x1A, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x13, 0xFF, 0xB3, 0x81, + 0x4A, 0xF6, 0xD5, 0xB7, 0x95, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA3, 0x7C, 0x6E, 0xA0, 0x65, + 0x2D, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x9C, 0x5B, 0x18, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xAA, 0x6E, + 0x27, 0xFF, 0xAD, 0x70, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xA8, 0x6E, 0x25, 0xFF, 0xB0, 0x8B, 0x5B, 0xFF, 0xD5, 0xD1, + 0xCC, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDC, 0xDC, + 0xDD, 0xFF, 0xCA, 0xC3, 0xB9, 0xFF, 0xA9, 0x97, 0x79, 0xFF, 0xD6, 0xD0, 0xC8, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0x9E, 0x91, + 0x76, 0xFF, 0xA6, 0x99, 0x80, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0xB6, 0xAA, 0x95, 0xFF, 0x8E, 0x6B, + 0x37, 0xFF, 0x99, 0x66, 0x24, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xB3, 0x7E, + 0x43, 0xFC, 0xD3, 0xB2, 0x8E, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xA3, 0x7B, 0x7A, 0xA2, 0x66, + 0x2B, 0xFF, 0x9A, 0x59, 0x1A, 0xFF, 0xA6, 0x6A, 0x29, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xAB, 0x73, 0x2B, 0xFF, 0xB7, 0x99, + 0x72, 0xFF, 0xD4, 0xD3, 0xD1, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDB, + 0xDC, 0xFF, 0xBC, 0xB6, 0xA7, 0xFF, 0x8D, 0x77, 0x4D, 0xFF, 0xC1, 0xB5, 0x9F, 0xFF, 0xDC, 0xD9, + 0xD5, 0xFF, 0xD8, 0xD5, 0xCF, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDF, 0xDE, + 0xDD, 0xFF, 0xB0, 0xA7, 0x92, 0xFF, 0xA3, 0x96, 0x7B, 0xFF, 0xD4, 0xD2, 0xCC, 0xFF, 0xC8, 0xC0, + 0xB5, 0xFF, 0x97, 0x7C, 0x50, 0xFF, 0x96, 0x69, 0x28, 0xFF, 0xAB, 0x73, 0x2C, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAB, 0x6C, 0x22, 0xFF, 0xB5, 0x80, + 0x41, 0xFF, 0xD4, 0xB3, 0x8D, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xA5, 0x7C, 0x7B, 0xAA, 0x71, + 0x38, 0xFF, 0xA6, 0x69, 0x2C, 0xFF, 0xAC, 0x71, 0x2F, 0xFF, 0xB1, 0x76, 0x30, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7D, 0x34, 0xFF, 0xB3, 0x83, + 0x42, 0xFF, 0xC5, 0xB2, 0x98, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD6, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xB4, 0xA6, 0x8C, 0xFF, 0xB8, 0xA9, + 0x8D, 0xFF, 0xC7, 0xBD, 0xAB, 0xFF, 0xAE, 0x9F, 0x82, 0xFF, 0xC2, 0xB9, 0xA8, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xBE, 0xB8, 0xA9, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0xD0, 0xCC, + 0xC4, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xA5, 0x91, 0x6E, 0xFF, 0x98, 0x6E, 0x30, 0xFF, 0xAD, 0x78, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7B, 0x32, 0xFF, 0xB4, 0x79, 0x32, 0xFF, 0xBD, 0x8B, + 0x4F, 0xFF, 0xD6, 0xB5, 0x8F, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xAD, 0x86, 0x71, 0xB6, 0x82, + 0x4C, 0xFF, 0xAC, 0x71, 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB9, 0x7F, + 0x37, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xC2, 0x8E, 0x4B, 0xFF, 0xC3, 0x93, + 0x54, 0xFF, 0xBD, 0x94, 0x5D, 0xFF, 0xCF, 0xC2, 0xB0, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC9, 0xC2, 0xB4, 0xFF, 0xB7, 0xAB, + 0x91, 0xFF, 0xD9, 0xD5, 0xCC, 0xFF, 0xBA, 0xB1, 0x9C, 0xFF, 0xBD, 0xB6, 0xA5, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0xAA, 0x9F, + 0x86, 0xFF, 0xCD, 0xC8, 0xBE, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xB5, 0xA4, 0x86, 0xFF, 0xA4, 0x79, + 0x39, 0xFF, 0xB7, 0x80, 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xB9, 0x80, 0x39, 0xFF, 0xC5, 0x97, + 0x5F, 0xFD, 0xDB, 0xBC, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xB2, 0x8A, 0x5E, 0xBD, 0x8C, + 0x57, 0xFD, 0xB2, 0x78, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xBA, 0x82, 0x3B, 0xFF, 0xBD, 0x85, + 0x3C, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xC0, 0x88, 0x3F, 0xFF, 0xC7, 0x95, 0x53, 0xFF, 0xCB, 0x9C, 0x5E, 0xFF, 0xCB, 0x9B, + 0x5E, 0xFF, 0xC8, 0x99, 0x5C, 0xFF, 0xC3, 0xA0, 0x6E, 0xFF, 0xD8, 0xD0, 0xC3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCF, 0xCA, 0xBE, 0xFF, 0xDA, 0xD7, + 0xCF, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xD8, 0xD5, + 0xD0, 0xFF, 0xB4, 0xAC, 0x95, 0xFF, 0xCC, 0xC8, 0xBC, 0xFF, 0xDF, 0xDC, 0xD7, 0xFF, 0xB0, 0x8C, + 0x57, 0xFF, 0xB9, 0x83, 0x3A, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xCC, 0xA0, + 0x69, 0xF7, 0xDE, 0xC2, 0x9F, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xB8, 0x91, 0x41, 0xC5, 0x97, + 0x63, 0xF3, 0xB8, 0x7F, 0x40, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBF, 0x87, 0x41, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC9, 0x97, 0x54, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, + 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCC, 0xA0, 0x65, 0xFF, 0xCB, 0xAB, 0x7F, 0xFF, 0xE0, 0xDB, + 0xD4, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xCA, 0xC2, 0xB1, 0xFF, 0xC8, 0xBD, + 0xA9, 0xFF, 0xD7, 0xD3, 0xC9, 0xFF, 0xBE, 0xB2, 0x9A, 0xFF, 0xC9, 0xBE, 0xAA, 0xFF, 0xDB, 0xDA, + 0xD6, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC4, 0xBD, 0xAC, 0xFF, 0xD2, 0xC9, 0xB6, 0xFF, 0xB8, 0x92, + 0x58, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xD2, 0xA9, + 0x75, 0xED, 0xE5, 0xCD, 0xAD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC7, 0xA4, 0x24, 0xCE, 0xA2, + 0x70, 0xDF, 0xBF, 0x88, 0x4A, 0xFF, 0xC0, 0x88, 0x45, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xC7, 0x90, + 0x48, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x48, 0xFF, 0xCA, 0x96, + 0x4F, 0xFF, 0xD2, 0xA7, 0x6B, 0xFF, 0xD4, 0xA9, 0x70, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, + 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD0, 0xA7, 0x6D, 0xFF, 0xD2, 0xB8, + 0x92, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xCA, 0xC4, 0xB4, 0xFF, 0xAC, 0xA0, + 0x80, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xC0, 0xB7, 0xA2, 0xFF, 0xA9, 0x99, 0x74, 0xFF, 0xD5, 0xD1, + 0xC9, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xC7, 0xB5, 0x97, 0xFF, 0xB7, 0x8C, + 0x4B, 0xFF, 0xC3, 0x90, 0x47, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, + 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCA, 0x97, 0x53, 0xFF, 0xD8, 0xB2, + 0x82, 0xD4, 0xE4, 0xCE, 0xB1, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD9, 0xBE, 0x0A, 0xD6, 0xAE, + 0x7E, 0xB7, 0xC8, 0x93, 0x57, 0xFF, 0xC5, 0x8E, 0x4A, 0xFF, 0xC9, 0x92, 0x4C, 0xFF, 0xCC, 0x95, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xD3, 0xA4, + 0x63, 0xFF, 0xD9, 0xB0, 0x79, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, + 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD4, 0xAD, + 0x77, 0xFF, 0xD8, 0xC3, 0xA4, 0xFF, 0xEB, 0xE9, 0xE7, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xE6, 0xE5, + 0xE2, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xD4, 0xD1, 0xC8, 0xFF, 0xDD, 0xDC, + 0xD8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE6, 0xFF, 0xC3, 0xB8, 0x9D, 0xFF, 0xBC, 0xA1, + 0x72, 0xFF, 0xB9, 0x8F, 0x4C, 0xFF, 0xC7, 0x94, 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, + 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCD, 0x97, 0x4E, 0xFF, 0xD2, 0xA2, 0x63, 0xFF, 0xDC, 0xBB, + 0x8E, 0xA9, 0xC0, 0xBC, 0xB7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xBA, + 0x8D, 0x7B, 0xD1, 0xA1, 0x67, 0xFF, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x98, 0x51, 0xFF, 0xD0, 0x9B, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xDB, 0xB1, + 0x75, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xD8, 0xB4, 0x80, 0xFF, 0xDE, 0xCD, 0xB1, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE5, 0xE3, 0xDD, 0xFF, 0xD2, 0xCA, + 0xB6, 0xFF, 0xC4, 0xB0, 0x89, 0xFF, 0xBD, 0x96, 0x56, 0xFF, 0xCE, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x76, 0xFE, 0xDE, 0xC1, + 0x9A, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC8, + 0x9E, 0x36, 0xDA, 0xAF, 0x79, 0xEA, 0xD1, 0x9D, 0x5B, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD5, 0xA0, + 0x58, 0xFF, 0xD6, 0xA3, 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA7, 0x60, 0xFF, 0xE1, 0xBB, + 0x83, 0xFF, 0xE2, 0xBE, 0x89, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xDC, 0xBB, 0x89, 0xFF, 0xE3, 0xD5, 0xBC, 0xFF, 0xF1, 0xF1, + 0xF0, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE9, 0xE9, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEB, 0xEA, + 0xE6, 0xFF, 0xE2, 0xDE, 0xD3, 0xFF, 0xCB, 0xAE, 0x7E, 0xFF, 0xCF, 0x9F, 0x56, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA8, 0x62, 0xFF, 0xE1, 0xBC, 0x89, 0xE3, 0xE0, 0xC8, + 0xA6, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC2, 0x08, 0xE1, 0xBB, 0x8A, 0xAC, 0xD9, 0xA9, 0x6C, 0xFF, 0xD6, 0xA2, 0x5D, 0xFF, 0xD9, 0xA5, + 0x5E, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDD, 0xAE, 0x69, 0xFF, 0xE6, 0xC2, + 0x8E, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE0, 0xC2, 0x93, 0xFF, 0xE7, 0xDB, + 0xC4, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF0, 0xEF, 0xFF, 0xD8, 0xD5, 0xC7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xEC, 0xE9, 0xE1, 0xFF, 0xD0, 0xAF, 0x79, 0xFF, 0xD6, 0xA6, 0x5D, 0xFF, 0xDC, 0xA9, + 0x5F, 0xFF, 0xDB, 0xA9, 0x60, 0xFF, 0xE0, 0xB5, 0x76, 0xFF, 0xE7, 0xC8, 0x99, 0x9E, 0xD9, 0xD3, + 0xC8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xC2, 0x96, 0x4D, 0xE1, 0xB7, 0x7F, 0xF3, 0xDC, 0xA9, 0x66, 0xFF, 0xDC, 0xAA, + 0x63, 0xFF, 0xDE, 0xAD, 0x64, 0xFF, 0xDF, 0xAE, 0x64, 0xFF, 0xE1, 0xB4, 0x6E, 0xFF, 0xE9, 0xC9, + 0x95, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE4, 0xC8, + 0x9A, 0xFF, 0xEA, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF3, 0xF2, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF2, 0xF2, 0xF0, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xF3, 0xF1, + 0xEC, 0xFF, 0xD7, 0xBE, 0x93, 0xFF, 0xD5, 0xA9, 0x63, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDF, 0xAE, + 0x65, 0xFF, 0xE0, 0xB2, 0x6C, 0xFF, 0xE7, 0xC3, 0x8D, 0xED, 0xE8, 0xCE, 0xA7, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xCC, 0xAB, 0x0A, 0xE7, 0xC3, 0x90, 0xA9, 0xE3, 0xB5, 0x79, 0xFF, 0xE0, 0xAE, + 0x69, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEC, 0xCC, + 0x99, 0xFF, 0xED, 0xCF, 0xA0, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xEC, 0xCF, + 0x9F, 0xFF, 0xE8, 0xCD, 0xA0, 0xFF, 0xEB, 0xDD, 0xC3, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF5, 0xF2, + 0xEC, 0xFF, 0xE5, 0xD7, 0xBC, 0xFF, 0xEA, 0xDD, 0xC5, 0xFF, 0xF8, 0xF6, 0xF4, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xEA, 0xE9, 0xE1, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF9, 0xF8, 0xF6, 0xFF, 0xE5, 0xD6, + 0xB6, 0xFF, 0xD9, 0xB0, 0x6D, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, + 0x6C, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCE, 0x9F, 0x9B, 0xE1, 0xD6, 0xC5, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xCB, 0x9E, 0x36, 0xE9, 0xC3, 0x8D, 0xE3, 0xE5, 0xB7, + 0x76, 0xFF, 0xE4, 0xB5, 0x6E, 0xFF, 0xE6, 0xB7, 0x6F, 0xFF, 0xE7, 0xB9, 0x72, 0xFF, 0xEE, 0xCD, + 0x98, 0xFF, 0xF0, 0xD4, 0xA7, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xED, 0xD2, 0xA5, 0xFF, 0xED, 0xD8, 0xB4, 0xFF, 0xEC, 0xD7, + 0xB3, 0xFF, 0xEB, 0xD1, 0xA4, 0xFF, 0xEB, 0xD1, 0xA5, 0xFF, 0xEE, 0xDF, 0xC3, 0xFF, 0xF8, 0xF6, + 0xF0, 0xFF, 0xEB, 0xEA, 0xE2, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xEC, 0xE1, 0xCA, 0xFF, 0xE5, 0xC7, + 0x94, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE6, 0xB8, 0x6F, 0xFF, 0xE7, 0xB8, 0x70, 0xFF, 0xE8, 0xBE, + 0x7C, 0xFF, 0xED, 0xCD, 0x98, 0xDA, 0xED, 0xD4, 0xAD, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xCD, 0x9C, 0x6D, 0xEB, 0xC4, + 0x8C, 0xF8, 0xE8, 0xBB, 0x78, 0xFF, 0xE8, 0xBA, 0x73, 0xFF, 0xE9, 0xBB, 0x73, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xEF, 0xD6, 0xAB, 0xFF, 0xF0, 0xDF, + 0xC0, 0xFF, 0xF9, 0xF5, 0xEE, 0xFF, 0xF1, 0xE7, 0xD2, 0xFF, 0xEB, 0xD5, 0xAC, 0xFF, 0xEC, 0xC8, + 0x8B, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEB, 0xC0, 0x7C, 0xFF, 0xEE, 0xCD, + 0x95, 0xF4, 0xEF, 0xD5, 0xA9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD6, 0xB4, 0x0A, 0xF0, 0xCF, + 0x9C, 0x94, 0xEE, 0xC8, 0x8D, 0xFE, 0xEB, 0xBF, 0x7C, 0xFF, 0xEC, 0xBF, 0x77, 0xFF, 0xED, 0xC4, + 0x81, 0xFF, 0xF4, 0xD8, 0xAB, 0xFF, 0xF5, 0xDC, 0xB3, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF2, 0xDB, + 0xB1, 0xFF, 0xF2, 0xDE, 0xB9, 0xFF, 0xF1, 0xDB, 0xB5, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xED, 0xC4, + 0x7F, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xED, 0xC3, 0x7F, 0xFF, 0xF0, 0xCE, 0x94, 0xFB, 0xF2, 0xD6, + 0xA7, 0x87, 0xEB, 0xDE, 0xC5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD7, + 0xAB, 0x12, 0xF2, 0xD2, 0x9E, 0xA4, 0xF0, 0xCB, 0x90, 0xFF, 0xEF, 0xC4, 0x81, 0xFF, 0xEF, 0xC3, + 0x7D, 0xFF, 0xF3, 0xD0, 0x97, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, + 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF2, 0xD0, 0x94, 0xFF, 0xEF, 0xC4, + 0x7D, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF3, 0xD1, 0x96, 0xFE, 0xF3, 0xD8, 0xA7, 0x99, 0xF1, 0xDD, + 0xBB, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD9, 0xAE, 0x17, 0xF4, 0xD4, 0xA1, 0xA1, 0xF3, 0xD0, 0x95, 0xFD, 0xF1, 0xCA, + 0x87, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF5, 0xD9, 0xA6, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF5, 0xD8, 0xA4, 0xFF, 0xF2, 0xCA, 0x84, 0xFF, 0xF3, 0xCD, + 0x8A, 0xFF, 0xF5, 0xD4, 0x9B, 0xFB, 0xF6, 0xDA, 0xA9, 0x98, 0xF2, 0xDE, 0xBC, 0x13, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDC, 0xB3, 0x10, 0xF5, 0xD7, 0xA5, 0x87, 0xF5, 0xD4, + 0x9C, 0xF1, 0xF4, 0xCF, 0x90, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDC, 0xAB, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF7, 0xDB, 0xA9, 0xFF, 0xF4, 0xCF, 0x8C, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xD8, + 0xA2, 0xED, 0xF7, 0xDC, 0xAC, 0x7B, 0xF4, 0xE1, 0xC0, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xC7, 0x05, 0xF5, 0xD9, + 0xA9, 0x56, 0xF7, 0xD8, 0xA3, 0xCC, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD2, 0x94, 0xFF, 0xF8, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xF8, 0xDB, + 0xA6, 0xFF, 0xF7, 0xD4, 0x95, 0xFF, 0xF7, 0xD7, 0x9E, 0xFE, 0xF8, 0xDB, 0xA8, 0xC5, 0xF8, 0xDE, + 0xB1, 0x4D, 0xFB, 0xEF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB0, 0x1E, 0xF7, 0xDB, 0xA9, 0x82, 0xF8, 0xDA, 0xA4, 0xDD, 0xF8, 0xD7, + 0x9E, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE2, 0xB6, 0xFF, 0xF9, 0xDB, 0xA3, 0xFF, 0xF9, 0xD9, + 0xA0, 0xFE, 0xF9, 0xDC, 0xA8, 0xD9, 0xF8, 0xDE, 0xAE, 0x79, 0xF8, 0xE2, 0xB9, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFA, 0xFF, 0x01, 0xF7, 0xDD, 0xB1, 0x28, 0xF8, 0xDD, + 0xAC, 0x78, 0xF9, 0xDC, 0xA8, 0xC5, 0xFA, 0xDC, 0xA6, 0xF0, 0xFB, 0xDE, 0xAB, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFC, 0xE6, 0xBF, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE6, 0xBE, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDD, 0xA8, 0xEE, 0xFA, 0xDE, 0xAA, 0xC0, 0xF9, 0xDE, + 0xAF, 0x73, 0xF7, 0xE0, 0xB6, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xE6, 0xC1, 0x12, 0xFB, 0xE2, 0xB5, 0x3E, 0xFB, 0xE0, 0xAF, 0x73, 0xFB, 0xDF, + 0xAC, 0xA1, 0xFB, 0xDF, 0xAC, 0xC1, 0xFB, 0xE0, 0xAF, 0xD6, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE1, + 0xB1, 0xE1, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE0, 0xAF, 0xD5, 0xFB, 0xE0, 0xAD, 0xBF, 0xFB, 0xDF, + 0xAD, 0x9E, 0xFB, 0xE1, 0xB2, 0x6F, 0xFB, 0xE3, 0xB8, 0x3A, 0xFA, 0xE7, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, + 0xCA, 0x04, 0xFB, 0xE2, 0xB2, 0x0F, 0xFC, 0xE2, 0xB3, 0x1F, 0xFC, 0xE2, 0xB2, 0x29, 0xFC, 0xE2, + 0xB2, 0x2D, 0xFC, 0xE2, 0xB3, 0x29, 0xFB, 0xE3, 0xB3, 0x1E, 0xFB, 0xE3, 0xB5, 0x0E, 0xFD, 0xEE, + 0xD3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xF8, + 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0B, 0x6C, 0x81, 0x43, 0x0A, 0x71, 0x81, 0x43, 0x0A, 0x75, 0x82, 0x44, + 0x0B, 0x78, 0x83, 0x45, 0x0D, 0x7B, 0x83, 0x46, 0x0E, 0x7C, 0x83, 0x45, 0x0D, 0x7B, 0x82, 0x43, + 0x0A, 0x7A, 0x81, 0x42, 0x09, 0x77, 0x81, 0x43, 0x0B, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0D, 0x04, 0x97, 0x64, + 0x35, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x43, + 0x0B, 0x98, 0x85, 0x49, 0x12, 0xA2, 0x8A, 0x51, 0x1E, 0xAE, 0x8F, 0x5B, 0x2E, 0xBD, 0x94, 0x65, + 0x3F, 0xCE, 0x96, 0x6A, 0x48, 0xD9, 0x96, 0x6A, 0x49, 0xDB, 0x97, 0x6B, 0x48, 0xD7, 0x94, 0x64, + 0x3C, 0xC9, 0x8E, 0x58, 0x2A, 0xB9, 0x88, 0x4E, 0x1A, 0xAD, 0x83, 0x46, 0x0F, 0xA3, 0x81, 0x43, + 0x0A, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, + 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x08, 0x85, 0x48, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x43, 0x0B, 0x8D, 0x86, 0x4B, 0x14, 0xA2, 0x8F, 0x5C, + 0x30, 0xC4, 0x8E, 0x61, 0x3F, 0xE7, 0x82, 0x55, 0x37, 0xF6, 0x7B, 0x4E, 0x32, 0xFD, 0x78, 0x4B, + 0x31, 0xFF, 0x78, 0x4B, 0x31, 0xFF, 0x79, 0x4D, 0x32, 0xFF, 0x7C, 0x51, 0x36, 0xFF, 0x80, 0x55, + 0x3B, 0xFF, 0x86, 0x5C, 0x40, 0xFB, 0x90, 0x65, 0x48, 0xF3, 0x97, 0x6B, 0x47, 0xE0, 0x8E, 0x58, + 0x28, 0xBC, 0x84, 0x47, 0x0F, 0xA4, 0x81, 0x43, 0x0B, 0x97, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x1D, 0x81, 0x43, + 0x0A, 0x38, 0x84, 0x47, 0x0F, 0x55, 0x91, 0x5D, 0x30, 0x90, 0x8B, 0x5D, 0x3B, 0xDF, 0x77, 0x48, + 0x2B, 0xFC, 0x6D, 0x3D, 0x20, 0xFF, 0x6C, 0x3B, 0x1C, 0xFF, 0x70, 0x3E, 0x1E, 0xFF, 0x73, 0x42, + 0x21, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x79, 0x48, 0x27, 0xFF, 0x7B, 0x4A, 0x29, 0xFF, 0x7C, 0x4C, + 0x2B, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x84, 0x58, 0x3B, 0xFF, 0x8F, 0x65, + 0x48, 0xF7, 0x9A, 0x6E, 0x4B, 0xCF, 0x8D, 0x56, 0x24, 0x85, 0x81, 0x43, 0x0A, 0x60, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x06, 0x89, 0x4F, + 0x1A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x82, 0x45, 0x0D, 0x04, 0x7D, 0x3C, 0x01, 0x0A, 0x92, 0x5C, + 0x2A, 0x1E, 0x95, 0x68, 0x45, 0x88, 0x7A, 0x49, 0x29, 0xEF, 0x66, 0x31, 0x12, 0xFF, 0x63, 0x2D, + 0x0B, 0xFF, 0x69, 0x31, 0x0C, 0xFF, 0x6E, 0x36, 0x0E, 0xFF, 0x73, 0x3B, 0x11, 0xFF, 0x78, 0x40, + 0x14, 0xFF, 0x7D, 0x46, 0x1A, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x84, 0x4F, 0x25, 0xFF, 0x86, 0x52, + 0x29, 0xFF, 0x87, 0x54, 0x2C, 0xFF, 0x86, 0x54, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x8A, 0x5D, 0x3F, 0xFF, 0x9A, 0x71, 0x52, 0xDC, 0x9F, 0x73, 0x4C, 0x63, 0x82, 0x43, + 0x0A, 0x1F, 0x81, 0x43, 0x0A, 0x13, 0x82, 0x44, 0x0C, 0x08, 0x83, 0x45, 0x0D, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9B, 0x7C, 0x09, 0x98, 0x6D, + 0x4D, 0x85, 0x74, 0x40, 0x1E, 0xF7, 0x62, 0x2B, 0x07, 0xFF, 0x66, 0x2C, 0x05, 0xFF, 0x69, 0x2F, + 0x05, 0xFF, 0x70, 0x35, 0x06, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x80, 0x42, 0x0C, 0xFF, 0x81, 0x44, 0x0F, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x88, 0x4F, 0x1D, 0xFF, 0x8C, 0x56, 0x28, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8B, 0x59, + 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x89, 0x5B, 0x38, 0xFF, 0x9B, 0x72, 0x52, 0xE2, 0xAE, 0x8A, + 0x6C, 0x4F, 0x76, 0x2C, 0x00, 0x03, 0x7A, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0x9F, 0x76, 0x55, 0x71, 0x78, 0x43, + 0x1F, 0xF7, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x30, 0x06, 0xFF, 0x6C, 0x37, 0x0C, 0xFF, 0x7F, 0x59, + 0x36, 0xFF, 0x79, 0x4D, 0x23, 0xFF, 0x79, 0x3E, 0x09, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, + 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x10, 0xFF, 0x8A, 0x4E, 0x17, 0xFF, 0x90, 0x58, + 0x26, 0xFF, 0x91, 0x5C, 0x2E, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5D, 0x37, 0xFF, 0xA0, 0x76, + 0x55, 0xDC, 0xBA, 0x99, 0x7E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x83, 0x62, 0x42, 0x82, 0x4F, 0x29, 0xEB, 0x6B, 0x30, + 0x08, 0xFF, 0x70, 0x34, 0x07, 0xFF, 0x71, 0x3D, 0x10, 0xFF, 0xA7, 0x91, 0x7B, 0xFF, 0xCA, 0xC3, + 0xBB, 0xFF, 0xB6, 0xAB, 0x9B, 0xFF, 0x8A, 0x67, 0x41, 0xFF, 0x7C, 0x45, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4B, + 0x0F, 0xFF, 0x8D, 0x51, 0x17, 0xFF, 0x93, 0x5B, 0x28, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x93, 0x62, + 0x39, 0xFF, 0xA9, 0x81, 0x5F, 0xC2, 0xC7, 0xAA, 0x91, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA2, 0x84, 0x13, 0x96, 0x66, 0x40, 0xBF, 0x72, 0x37, 0x0E, 0xFF, 0x74, 0x36, + 0x08, 0xFF, 0x75, 0x3E, 0x0E, 0xFF, 0xA7, 0x90, 0x78, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xCE, 0xCA, 0xC3, 0xFF, 0xAD, 0xA3, 0x93, 0xFF, 0x9D, 0x84, 0x66, 0xFF, 0x7E, 0x4C, + 0x15, 0xFF, 0x88, 0x4A, 0x0C, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8E, 0x4E, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x9C, 0x6C, 0x43, 0xFD, 0xB7, 0x94, 0x73, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAA, 0x81, 0x5D, 0x55, 0x82, 0x4A, 0x1F, 0xF9, 0x76, 0x38, 0x08, 0xFF, 0x7C, 0x3F, + 0x09, 0xFF, 0x9E, 0x7D, 0x5A, 0xFF, 0xE3, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xD3, 0xD0, 0xCB, 0xFF, 0xA6, 0x9C, 0x8C, 0xFF, 0xA6, 0x95, + 0x7D, 0xFF, 0x84, 0x59, 0x27, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x55, + 0x18, 0xFF, 0x97, 0x61, 0x2E, 0xFF, 0xAA, 0x7F, 0x57, 0xDA, 0xC8, 0xA8, 0x8B, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC3, + 0xA9, 0x0C, 0xA0, 0x71, 0x48, 0xB8, 0x7C, 0x3F, 0x0F, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0xAF, 0x8D, 0x68, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xA7, 0x9E, + 0x8D, 0xFF, 0xAB, 0x9E, 0x8A, 0xFF, 0x91, 0x70, 0x47, 0xFF, 0x86, 0x4F, 0x11, 0xFF, 0x94, 0x55, + 0x11, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x54, 0x16, 0xFF, 0xA2, 0x6E, 0x3D, 0xFC, 0xC1, 0x9E, 0x7B, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x96, + 0x71, 0x2C, 0x94, 0x5D, 0x2E, 0xE9, 0x81, 0x41, 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x96, 0x5B, 0x19, 0xFF, 0xCB, 0xB5, 0x9B, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE7, 0xE5, + 0xE3, 0xFF, 0xB1, 0xA9, 0x99, 0xFF, 0xAB, 0x9F, 0x8B, 0xFF, 0xA5, 0x8F, 0x70, 0xFF, 0x89, 0x59, + 0x1D, 0xFF, 0x96, 0x59, 0x14, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x5C, 0x1F, 0xFF, 0xB6, 0x8C, 0x62, 0xB9, 0xD0, 0xBD, + 0xA8, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x88, + 0x5F, 0x50, 0x8F, 0x53, 0x1F, 0xFA, 0x89, 0x47, 0x0B, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0xA4, 0x70, 0x33, 0xFF, 0xD7, 0xCC, 0xBC, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xE9, 0xE9, 0xE8, 0xFF, 0xBD, 0xB5, 0xA7, 0xFF, 0xA8, 0x9D, 0x87, 0xFF, 0xB6, 0xA7, + 0x91, 0xFF, 0x8F, 0x68, 0x33, 0xFF, 0x97, 0x5E, 0x19, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA3, 0x64, + 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5E, + 0x14, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0xAC, 0x79, 0x44, 0xDC, 0xCE, 0xAF, + 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x86, + 0x5A, 0x75, 0x91, 0x52, 0x18, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0xAD, 0x82, 0x4B, 0xFF, 0xD9, 0xD3, + 0xCB, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE1, 0xE0, + 0xDF, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xC8, 0xC1, 0xB7, 0xFF, 0xA7, 0x9B, + 0x84, 0xFF, 0xBE, 0xB4, 0xA4, 0xFF, 0x9B, 0x7D, 0x52, 0xFF, 0x98, 0x64, 0x21, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA5, 0x65, 0x1A, 0xFF, 0x9F, 0x5C, 0x12, 0xFF, 0xAA, 0x72, 0x35, 0xED, 0xCC, 0xA9, + 0x82, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xB9, 0x8D, + 0x60, 0x94, 0x97, 0x56, 0x18, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xAB, 0x6E, 0x28, 0xFF, 0xAF, 0x72, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAC, 0x71, 0x29, 0xFF, 0xB5, 0x92, + 0x64, 0xFF, 0xD5, 0xD3, 0xCF, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xB8, 0xAE, + 0x9C, 0xFF, 0xB9, 0xAC, 0x94, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xD1, 0xCD, + 0xC5, 0xFF, 0xAC, 0xA2, 0x8C, 0xFF, 0xC2, 0xBB, 0xAE, 0xFF, 0xAC, 0x98, 0x79, 0xFF, 0x99, 0x6C, + 0x2D, 0xFF, 0xAA, 0x70, 0x28, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x29, 0xFF, 0xA9, 0x6A, 0x1F, 0xFF, 0xAD, 0x74, 0x32, 0xF5, 0xCE, 0xA9, + 0x81, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xBF, 0x94, + 0x67, 0x9D, 0xA4, 0x68, 0x2B, 0xFF, 0xAC, 0x70, 0x2E, 0xFF, 0xB2, 0x77, 0x30, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB3, 0x7D, + 0x37, 0xFF, 0xC1, 0xA9, 0x88, 0xFF, 0xD6, 0xD6, 0xD5, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xCD, 0xCA, + 0xC2, 0xFF, 0xBB, 0xB0, 0x9A, 0xFF, 0xBF, 0xB4, 0x9E, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD2, 0xCE, + 0xC3, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB7, 0xAF, 0x9D, 0xFF, 0xC4, 0xBF, 0xB2, 0xFF, 0xBC, 0xAF, + 0x9A, 0xFF, 0x9F, 0x78, 0x3F, 0xFF, 0xAF, 0x78, 0x30, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB8, 0x81, 0x41, 0xF7, 0xD2, 0xAF, + 0x86, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xC9, 0x9F, + 0x73, 0x8E, 0xB1, 0x78, 0x3C, 0xFF, 0xB4, 0x79, 0x36, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBE, 0x87, 0x3F, 0xFF, 0xC4, 0x92, + 0x51, 0xFF, 0xC2, 0x97, 0x5D, 0xFF, 0xCF, 0xBE, 0xA8, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xD5, 0xD2, 0xCB, 0xFF, 0xC5, 0xBD, 0xAA, 0xFF, 0xCC, 0xC5, 0xB8, 0xFF, 0xD1, 0xCE, + 0xC8, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xC3, 0xBE, 0xAF, 0xFF, 0xC8, 0xC2, + 0xB6, 0xFF, 0xCA, 0xBF, 0xAE, 0xFF, 0xAE, 0x82, 0x44, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC2, 0x90, 0x53, 0xF3, 0xD8, 0xB7, + 0x8F, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xA4, + 0x76, 0x6B, 0xBA, 0x84, 0x49, 0xFF, 0xBB, 0x82, 0x3E, 0xFF, 0xC0, 0x88, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xCC, 0x9C, 0x5D, 0xFF, 0xCF, 0xA1, + 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCB, 0xA4, 0x70, 0xFF, 0xDA, 0xD0, 0xC0, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xDA, 0xD6, 0xCE, 0xFF, 0xCE, 0xC7, 0xB6, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xD1, 0xCA, + 0xBD, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE3, 0xE2, 0xE2, 0xFF, 0xD2, 0xCF, + 0xC4, 0xFF, 0xCD, 0xC4, 0xB2, 0xFF, 0xB9, 0x90, 0x54, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xCB, 0x9C, 0x60, 0xEA, 0xDD, 0xBF, + 0x99, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xAE, + 0x80, 0x47, 0xC5, 0x93, 0x58, 0xF7, 0xC2, 0x8A, 0x47, 0xFF, 0xC8, 0x91, 0x49, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCF, 0x9D, 0x5B, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD5, 0xAB, + 0x72, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xB2, 0x83, 0xFF, 0xE5, 0xDE, + 0xD5, 0xFF, 0xDE, 0xDC, 0xD7, 0xFF, 0xCC, 0xC5, 0xB6, 0xFF, 0xD5, 0xD1, 0xC5, 0xFF, 0xBE, 0xB5, + 0x9E, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xD1, 0xC5, 0xB0, 0xFF, 0xBA, 0x92, 0x54, 0xFF, 0xC5, 0x91, 0x48, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCA, 0x95, 0x4D, 0xFF, 0xD4, 0xA9, 0x72, 0xD5, 0xDE, 0xC4, + 0xA2, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xBD, + 0x92, 0x23, 0xD2, 0xA4, 0x6C, 0xE2, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x99, 0x51, 0xFF, 0xD1, 0x9C, + 0x52, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x75, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, + 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xBF, + 0x96, 0xFF, 0xEA, 0xE6, 0xDF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, + 0xE9, 0xFF, 0xE2, 0xE0, 0xD8, 0xFF, 0xCB, 0xBB, 0x9D, 0xFF, 0xC0, 0x9C, 0x61, 0xFF, 0xCE, 0x9B, + 0x51, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD3, 0xA1, 0x5C, 0xFF, 0xDD, 0xB8, 0x87, 0xAC, 0xD7, 0xCD, + 0xBF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC4, 0x06, 0xDD, 0xB4, 0x81, 0xA0, 0xD4, 0xA0, 0x5F, 0xFF, 0xD5, 0xA1, 0x59, 0xFF, 0xD7, 0xA4, + 0x5A, 0xFF, 0xDA, 0xA9, 0x61, 0xFF, 0xE2, 0xBD, 0x86, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, + 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE2, 0xBE, + 0x8A, 0xFF, 0xE1, 0xCA, 0xA5, 0xFF, 0xEF, 0xEC, 0xE6, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEF, 0xEF, + 0xEE, 0xFF, 0xED, 0xED, 0xEA, 0xFF, 0xEB, 0xEA, 0xE6, 0xFF, 0xD7, 0xC2, 0x9F, 0xFF, 0xD3, 0xA2, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5B, 0xFF, 0xDC, 0xB0, 0x70, 0xF7, 0xE2, 0xC3, 0x98, 0x56, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xBF, 0x90, 0x41, 0xDE, 0xB1, 0x75, 0xF2, 0xDB, 0xA8, 0x62, 0xFF, 0xDD, 0xAC, + 0x62, 0xFF, 0xE0, 0xB1, 0x6B, 0xFF, 0xE8, 0xC7, 0x92, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE7, 0xC8, 0x96, 0xFF, 0xE7, 0xD2, 0xAF, 0xFF, 0xF2, 0xEF, 0xE9, 0xFF, 0xF5, 0xF6, + 0xF7, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF3, 0xF3, 0xF1, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, + 0xF3, 0xFF, 0xEA, 0xEA, 0xE4, 0xFF, 0xEC, 0xE5, 0xD9, 0xFF, 0xD7, 0xB4, 0x7B, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xE0, 0xB0, 0x69, 0xFF, 0xE5, 0xC0, 0x89, 0xCA, 0xE7, 0xCF, 0xA9, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCD, 0xA7, 0x09, 0xE6, 0xC0, 0x8B, 0xA1, 0xE2, 0xB3, 0x72, 0xFF, 0xE2, 0xB2, + 0x6A, 0xFF, 0xE5, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x9A, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xED, 0xD0, 0xA1, 0xFF, 0xEC, 0xD7, 0xB3, 0xFF, 0xF2, 0xEA, + 0xDC, 0xFF, 0xEA, 0xDB, 0xC0, 0xFF, 0xED, 0xDE, 0xC4, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xE9, 0xE8, + 0xE1, 0xFF, 0xF4, 0xF1, 0xEB, 0xFF, 0xE4, 0xCC, 0xA0, 0xFF, 0xE1, 0xB3, 0x6A, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE7, 0xBE, 0x80, 0xF6, 0xEB, 0xCD, 0x9F, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xCC, 0x9C, 0x2A, 0xEA, 0xC3, 0x8A, 0xD9, 0xE8, 0xBA, + 0x76, 0xFF, 0xE9, 0xBB, 0x74, 0xFF, 0xEF, 0xCE, 0x98, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF0, 0xD7, + 0xAD, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF1, 0xE1, 0xC3, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xED, 0xDC, 0xBD, 0xFF, 0xE9, 0xC3, 0x85, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEB, 0xC1, + 0x7F, 0xFF, 0xEE, 0xCE, 0x9A, 0xA5, 0xED, 0xD8, 0xB7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xCF, 0x9C, 0x4B, 0xEE, 0xC8, + 0x8D, 0xE8, 0xED, 0xC0, 0x7C, 0xFF, 0xEF, 0xC9, 0x88, 0xFF, 0xF5, 0xDC, 0xB1, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xE0, + 0xBB, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xEE, 0xC4, 0x7E, 0xFF, 0xEE, 0xC7, 0x83, 0xFF, 0xF1, 0xD1, + 0x99, 0xC2, 0xF1, 0xD8, 0xAE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x01, 0xF3, 0xD3, + 0xA0, 0x56, 0xF2, 0xCE, 0x93, 0xE7, 0xF1, 0xC9, 0x86, 0xFF, 0xF4, 0xD5, 0x9F, 0xFF, 0xF8, 0xE2, + 0xBB, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF7, 0xE0, + 0xB6, 0xFF, 0xF3, 0xD0, 0x92, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF4, 0xD4, 0x9E, 0xC4, 0xF4, 0xDA, + 0xAE, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xF5, 0xD7, 0xA5, 0x44, 0xF5, 0xD4, 0x9B, 0xCE, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xF9, 0xE3, 0xBB, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD3, 0x96, 0xF8, 0xF7, 0xD8, 0xA4, 0xA6, 0xF7, 0xDD, 0xB1, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDA, 0xAC, 0x1E, 0xF7, 0xD9, 0xA4, 0x84, 0xF8, 0xD8, + 0x9F, 0xE5, 0xF9, 0xDC, 0xA8, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xF9, 0xDB, 0xA4, 0xFA, 0xF8, 0xDA, + 0xA3, 0xCE, 0xF8, 0xDC, 0xAB, 0x5B, 0xF9, 0xE2, 0xB9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE6, 0xCF, 0x03, 0xF8, 0xDD, + 0xAC, 0x2A, 0xF9, 0xDC, 0xA9, 0x71, 0xFA, 0xDD, 0xAA, 0xC4, 0xFB, 0xE1, 0xB2, 0xE5, 0xFB, 0xE4, + 0xB8, 0xF2, 0xFB, 0xE6, 0xBE, 0xF8, 0xFB, 0xE7, 0xC0, 0xF9, 0xFB, 0xE5, 0xBD, 0xF7, 0xFB, 0xE3, + 0xB6, 0xEF, 0xFB, 0xE1, 0xB0, 0xDD, 0xFA, 0xDE, 0xAB, 0xAD, 0xF9, 0xDE, 0xAC, 0x56, 0xF8, 0xE0, + 0xB4, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE2, 0xB6, 0x12, 0xFB, 0xDF, 0xAD, 0x2D, 0xFB, 0xDF, + 0xAB, 0x46, 0xFB, 0xE0, 0xAE, 0x58, 0xFB, 0xE1, 0xB0, 0x5C, 0xFB, 0xE0, 0xAE, 0x53, 0xFB, 0xDF, + 0xAC, 0x3E, 0xFB, 0xE1, 0xB1, 0x24, 0xFC, 0xE7, 0xC1, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro b/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro new file mode 100644 index 00000000..ad7484ed --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro @@ -0,0 +1,139 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + Core/ventoy_crc32.c \ + Core/ventoy_disk.c \ + Core/ventoy_json.c \ + Core/ventoy_log.c \ + Core/ventoy_md5.c \ + Core/ventoy_util.c \ + Lib/exfat/src/libexfat/cluster.c \ + Lib/exfat/src/libexfat/io.c \ + Lib/exfat/src/libexfat/lookup.c \ + Lib/exfat/src/libexfat/mount.c \ + Lib/exfat/src/libexfat/node.c \ + Lib/exfat/src/libexfat/repair.c \ + Lib/exfat/src/libexfat/time.c \ + Lib/exfat/src/libexfat/utf.c \ + Lib/exfat/src/libexfat/utils.c \ + Lib/exfat/src/mkfs/cbm.c \ + Lib/exfat/src/mkfs/fat.c \ + Lib/exfat/src/mkfs/mkexfat.c \ + Lib/exfat/src/mkfs/mkexfat_main.c \ + Lib/exfat/src/mkfs/rootdir.c \ + Lib/exfat/src/mkfs/uct.c \ + Lib/exfat/src/mkfs/uctc.c \ + Lib/exfat/src/mkfs/vbr.c \ + Lib/fat_io_lib/fat_access.c \ + Lib/fat_io_lib/fat_cache.c \ + Lib/fat_io_lib/fat_filelib.c \ + Lib/fat_io_lib/fat_format.c \ + Lib/fat_io_lib/fat_misc.c \ + Lib/fat_io_lib/fat_string.c \ + Lib/fat_io_lib/fat_table.c \ + Lib/fat_io_lib/fat_write.c \ + Lib/xz-embedded/linux/lib/decompress_unxz.c \ + QT/refresh_icon_data.c \ + QT/secure_icon_data.c \ + QT/ventoy_qt_stub.c \ + Web/ventoy_http.c \ + main.cpp \ + partcfgdialog.cpp \ + ventoy2diskwindow.cpp + +HEADERS += \ + Core/ventoy_define.h \ + Core/ventoy_disk.h \ + Core/ventoy_json.h \ + Core/ventoy_util.h \ + Include/Ventoy2Disk.h \ + Lib/exfat/src/libexfat/byteorder.h \ + Lib/exfat/src/libexfat/compiler.h \ + Lib/exfat/src/libexfat/config.h \ + Lib/exfat/src/libexfat/exfat.h \ + Lib/exfat/src/libexfat/exfatfs.h \ + Lib/exfat/src/libexfat/platform.h \ + Lib/exfat/src/mkfs/cbm.h \ + Lib/exfat/src/mkfs/fat.h \ + Lib/exfat/src/mkfs/mkexfat.h \ + Lib/exfat/src/mkfs/rootdir.h \ + Lib/exfat/src/mkfs/uct.h \ + Lib/exfat/src/mkfs/uctc.h \ + Lib/exfat/src/mkfs/vbr.h \ + Lib/fat_io_lib/fat_access.h \ + Lib/fat_io_lib/fat_cache.h \ + Lib/fat_io_lib/fat_defs.h \ + Lib/fat_io_lib/fat_filelib.h \ + Lib/fat_io_lib/fat_format.h \ + Lib/fat_io_lib/fat_list.h \ + Lib/fat_io_lib/fat_misc.h \ + Lib/fat_io_lib/fat_opts.h \ + Lib/fat_io_lib/fat_string.h \ + Lib/fat_io_lib/fat_table.h \ + Lib/fat_io_lib/fat_types.h \ + Lib/fat_io_lib/fat_write.h \ + Lib/libhttp/include/civetweb.h \ + Lib/libhttp/include/handle_form.inl \ + Lib/libhttp/include/md5.inl \ + Lib/libhttp/include/mod_duktape.inl \ + Lib/libhttp/include/mod_lua.inl \ + Lib/libhttp/include/timer.inl \ + QT/ventoy_qt.h \ + Web/ventoy_http.h \ + partcfgdialog.h \ + ventoy2diskwindow.h + +FORMS += \ + partcfgdialog.ui \ + ventoy2diskwindow.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + Lib/fat_io_lib/API.txt \ + Lib/fat_io_lib/COPYRIGHT.txt \ + Lib/fat_io_lib/Configuration.txt \ + Lib/fat_io_lib/History.txt \ + Lib/fat_io_lib/License.txt \ + Lib/fat_io_lib/Media Access API.txt \ + Lib/fat_io_lib/version.txt + + +INCLUDEPATH +=/home/panda/Ventoy2Disk/Core +INCLUDEPATH +=/home/panda/Ventoy2Disk/Web +INCLUDEPATH +=/home/panda/Ventoy2Disk/QT +INCLUDEPATH +=/home/panda/Ventoy2Disk/Include +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/libhttp/include +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/fat_io_lib/include +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include/linux +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/xz-embedded/userspace +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/exfat/src/libexfat +INCLUDEPATH +=/home/panda/Ventoy2Disk/Lib/fat_io_lib +#INCLUDEPATH +=/usr/src/linux-headers-5.10.18-amd64-desktop/include +#INCLUDEPATH +=/usr/src/linux-headers-5.10.18-amd64-desktop/arch/x86/include +#INCLUDEPATH +=/usr/src/linux-headers-5.10.18-amd64-desktop/arch/x86/include/generated + + +DEFINES += STATIC=static +DEFINES += INIT= + + diff --git a/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro.user b/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro.user new file mode 100644 index 00000000..26acce24 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/Ventoy2Disk.pro.user @@ -0,0 +1,338 @@ + + + + + + EnvironmentId + {666f325e-a9c7-45d6-a820-626289f99bab} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 2 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.9 GCC 64bit + Desktop Qt 5.12.9 GCC 64bit + qt.qt5.5129.gcc_64_kit + 0 + 0 + 0 + + true + 0 + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + 2 + 2 + + + true + 2 + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 2 + + + true + 0 + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:/home/panda/Ventoy2Disk/Ventoy2Disk.pro + /home/panda/Ventoy2Disk/Ventoy2Disk.pro + + false + + false + true + true + false + false + true + /home/panda/Desktop/ventoy-1.0.52-linux/ventoy-1.0.52 + /home/panda/build-Ventoy2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/LinuxGUI/Ventoy2Disk/QT/build/Makefile b/LinuxGUI/Ventoy2Disk/QT/build/Makefile new file mode 100644 index 00000000..40d4a53c --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/Makefile @@ -0,0 +1,1760 @@ +############################################################################# +# Makefile for building: Ventoy2Disk +# Generated by qmake (3.1) (Qt 5.9.0) +# Project: ../Ventoy2Disk/Ventoy2Disk.pro +# Template: app +# Command: /home/panda/Qt5.9.0/5.9/gcc_64/bin/qmake -o Makefile ../Ventoy2Disk/Ventoy2Disk.pro -spec linux-g++ +############################################################################# + +MAKEFILE = Makefile + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I../Ventoy2Disk -I. -I../../Ventoy2Disk/Core -I../../Ventoy2Disk/Web -I../../Ventoy2Disk/QT -I../../Ventoy2Disk/Include -I../../Ventoy2Disk/Lib/libhttp/include -I/home/panda/Ventoy2Disk/Lib/fat_io_lib/include -I../../Ventoy2Disk/Lib/xz-embedded/linux/include -I../../Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I../../Ventoy2Disk/Lib/xz-embedded/userspace -I../../Ventoy2Disk/Lib/exfat/src/libexfat -I../../Ventoy2Disk/Lib/fat_io_lib -I../../Qt5.9.0/5.9/gcc_64/include -I../../Qt5.9.0/5.9/gcc_64/include/QtWidgets -I../../Qt5.9.0/5.9/gcc_64/include/QtGui -I../../Qt5.9.0/5.9/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++ +QMAKE = /home/panda/Qt5.9.0/5.9/gcc_64/bin/qmake +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL_FILE = /home/panda/Qt5.9.0/5.9/gcc_64/bin/qmake -install qinstall file +QINSTALL_PROGRAM = /home/panda/Qt5.9.0/5.9/gcc_64/bin/qmake -install qinstall program +QINSTALL_DIR = /home/panda/Qt5.9.0/5.9/gcc_64/bin/qmake -install qinstall directory +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = Ventoy2Disk1.0.0 +DISTDIR = /home/panda/590/build-Ventoy2Disk-Desktop_Qt_5_9_0_GCC_64bit-Release/.tmp/Ventoy2Disk1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -Wl,-rpath,/home/panda/Qt5.9.0/5.9/gcc_64/lib +LIBS = $(SUBLIBS) -L/home/panda/Qt5.9.0/5.9/gcc_64/lib -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread +AR = ar cqs +RANLIB = +SED = sed +STRIP = strip + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = ../Ventoy2Disk/Core/ventoy_crc32.c \ + ../Ventoy2Disk/Core/ventoy_disk.c \ + ../Ventoy2Disk/Core/ventoy_json.c \ + ../Ventoy2Disk/Core/ventoy_log.c \ + ../Ventoy2Disk/Core/ventoy_md5.c \ + ../Ventoy2Disk/Core/ventoy_util.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/cluster.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/io.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/lookup.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/mount.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/node.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/repair.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/time.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/utf.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/utils.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_access.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_format.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.c \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ + ../Ventoy2Disk/QT/refresh_icon_data.c \ + ../Ventoy2Disk/QT/secure_icon_data.c \ + ../Ventoy2Disk/QT/ventoy_qt_stub.c \ + ../Ventoy2Disk/Web/ventoy_http.c \ + ../Ventoy2Disk/main.cpp \ + ../Ventoy2Disk/partcfgdialog.cpp \ + ../Ventoy2Disk/ventoy2diskwindow.cpp moc_partcfgdialog.cpp \ + moc_ventoy2diskwindow.cpp +OBJECTS = ventoy_crc32.o \ + ventoy_disk.o \ + ventoy_json.o \ + ventoy_log.o \ + ventoy_md5.o \ + ventoy_util.o \ + cluster.o \ + io.o \ + lookup.o \ + mount.o \ + node.o \ + repair.o \ + time.o \ + utf.o \ + utils.o \ + cbm.o \ + fat.o \ + mkexfat.o \ + mkexfat_main.o \ + rootdir.o \ + uct.o \ + uctc.o \ + vbr.o \ + fat_access.o \ + fat_cache.o \ + fat_filelib.o \ + fat_format.o \ + fat_misc.o \ + fat_string.o \ + fat_table.o \ + fat_write.o \ + decompress_unxz.o \ + refresh_icon_data.o \ + secure_icon_data.o \ + ventoy_qt_stub.o \ + ventoy_http.o \ + main.o \ + partcfgdialog.o \ + ventoy2diskwindow.o \ + moc_partcfgdialog.o \ + moc_ventoy2diskwindow.o +DIST = ../Ventoy2Disk/Lib/fat_io_lib/API.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/COPYRIGHT.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/Configuration.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/History.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/License.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/Media \ + ../Ventoy2Disk/Access \ + ../Ventoy2Disk/API.txt \ + ../Ventoy2Disk/Lib/fat_io_lib/version.txt \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_pre.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/linux.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/sanitize.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base-unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-base.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/qconfig.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_egl_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fb_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_glx_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_input_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_kms_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldebug_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_service_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_theme_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_functions.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_config.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++/qmake.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_post.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exclusive_builds.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/toolchain.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_pre.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resolve_config.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_post.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/warn_on.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resources.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/moc.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/opengl.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/uic.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/thread.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qmake_use.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/file_copies.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/testcase_targets.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exceptions.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/yacc.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/lex.prf \ + ../Ventoy2Disk/Ventoy2Disk.pro ../Ventoy2Disk/Core/ventoy_define.h \ + ../Ventoy2Disk/Core/ventoy_disk.h \ + ../Ventoy2Disk/Core/ventoy_json.h \ + ../Ventoy2Disk/Core/ventoy_util.h \ + ../Ventoy2Disk/Include/Ventoy2Disk.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_format.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_list.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h \ + ../Ventoy2Disk/Lib/libhttp/include/civetweb.h \ + ../Ventoy2Disk/Lib/libhttp/include/handle_form.inl \ + ../Ventoy2Disk/Lib/libhttp/include/md5.inl \ + ../Ventoy2Disk/Lib/libhttp/include/mod_duktape.inl \ + ../Ventoy2Disk/Lib/libhttp/include/mod_lua.inl \ + ../Ventoy2Disk/Lib/libhttp/include/timer.inl \ + ../Ventoy2Disk/QT/ventoy_qt.h \ + ../Ventoy2Disk/Web/ventoy_http.h \ + ../Ventoy2Disk/partcfgdialog.h \ + ../Ventoy2Disk/ventoy2diskwindow.h ../Ventoy2Disk/Core/ventoy_crc32.c \ + ../Ventoy2Disk/Core/ventoy_disk.c \ + ../Ventoy2Disk/Core/ventoy_json.c \ + ../Ventoy2Disk/Core/ventoy_log.c \ + ../Ventoy2Disk/Core/ventoy_md5.c \ + ../Ventoy2Disk/Core/ventoy_util.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/cluster.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/io.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/lookup.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/mount.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/node.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/repair.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/time.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/utf.c \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/utils.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.c \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_access.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_format.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.c \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.c \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ + ../Ventoy2Disk/QT/refresh_icon_data.c \ + ../Ventoy2Disk/QT/secure_icon_data.c \ + ../Ventoy2Disk/QT/ventoy_qt_stub.c \ + ../Ventoy2Disk/Web/ventoy_http.c \ + ../Ventoy2Disk/main.cpp \ + ../Ventoy2Disk/partcfgdialog.cpp \ + ../Ventoy2Disk/ventoy2diskwindow.cpp +QMAKE_TARGET = Ventoy2Disk +DESTDIR = +TARGET = Ventoy2Disk + + +first: all +####### Build rules + +$(TARGET): ui_partcfgdialog.h ui_ventoy2diskwindow.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: ../Ventoy2Disk/Ventoy2Disk.pro ../../Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++/qmake.conf ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_pre.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/linux.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/sanitize.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base-unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-base.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-unix.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/qconfig.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_egl_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fb_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_glx_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_input_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_kms_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldebug_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_service_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_theme_support_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_functions.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_config.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++/qmake.conf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_post.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exclusive_builds.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/toolchain.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_pre.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resolve_config.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_post.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/warn_on.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resources.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/moc.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/opengl.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/uic.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/thread.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qmake_use.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/file_copies.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/testcase_targets.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exceptions.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/yacc.prf \ + ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/lex.prf \ + ../Ventoy2Disk/Ventoy2Disk.pro \ + ../../Qt5.9.0/5.9/gcc_64/lib/libQt5Widgets.prl \ + ../../Qt5.9.0/5.9/gcc_64/lib/libQt5Gui.prl \ + ../../Qt5.9.0/5.9/gcc_64/lib/libQt5Core.prl + $(QMAKE) -o Makefile ../Ventoy2Disk/Ventoy2Disk.pro -spec linux-g++ +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_pre.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/unix.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/linux.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/sanitize.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/gcc-base-unix.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-base.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/common/g++-unix.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/qconfig.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3danimation_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dcore_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dextras_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dinput_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dlogic_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquick_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickextras_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickinput_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickrender_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_3drender_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_accessibility_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bluetooth_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_bootstrap_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_charts_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_concurrent_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_core_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_datavisualization_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_dbus_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designer_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_designercomponents_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_egl_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fb_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gamepad_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_glx_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_gui_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_help_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_input_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_kms_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_location_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimedia_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_network_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_nfc_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_opengl_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_openglextensions_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_packetprotocol_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_positioning_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_printsupport_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qml_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldebug_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmldevtools_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qmltest_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quick_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickparticles_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_quickwidgets_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_scxml_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sensors_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialbus_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_serialport_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_service_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_sql_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_svg_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_testlib_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_theme_support_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uiplugin.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_uitools_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webchannel_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webengine_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecore_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginecoreheaders_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_websockets_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_webview_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_widgets_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_x11extras_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xml_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_functions.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt_config.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++/qmake.conf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/spec_post.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exclusive_builds.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/toolchain.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_pre.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resolve_config.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/default_post.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/warn_on.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qt.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/resources.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/moc.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/opengl.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/uic.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/unix/thread.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/qmake_use.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/file_copies.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/testcase_targets.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/exceptions.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/yacc.prf: +../../Qt5.9.0/5.9/gcc_64/mkspecs/features/lex.prf: +../Ventoy2Disk/Ventoy2Disk.pro: +../../Qt5.9.0/5.9/gcc_64/lib/libQt5Widgets.prl: +../../Qt5.9.0/5.9/gcc_64/lib/libQt5Gui.prl: +../../Qt5.9.0/5.9/gcc_64/lib/libQt5Core.prl: +qmake: FORCE + @$(QMAKE) -o Makefile ../Ventoy2Disk/Ventoy2Disk.pro -spec linux-g++ + +qmake_all: FORCE + + +all: Makefile $(TARGET) + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../Ventoy2Disk/Core/ventoy_define.h ../Ventoy2Disk/Core/ventoy_disk.h ../Ventoy2Disk/Core/ventoy_json.h ../Ventoy2Disk/Core/ventoy_util.h ../Ventoy2Disk/Include/Ventoy2Disk.h ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.h ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.h ../Ventoy2Disk/Lib/fat_io_lib/fat_access.h ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.h ../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h ../Ventoy2Disk/Lib/fat_io_lib/fat_format.h ../Ventoy2Disk/Lib/fat_io_lib/fat_list.h ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h ../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h ../Ventoy2Disk/Lib/fat_io_lib/fat_types.h ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h ../Ventoy2Disk/Lib/libhttp/include/civetweb.h ../Ventoy2Disk/Lib/libhttp/include/handle_form.inl ../Ventoy2Disk/Lib/libhttp/include/md5.inl ../Ventoy2Disk/Lib/libhttp/include/mod_duktape.inl ../Ventoy2Disk/Lib/libhttp/include/mod_lua.inl ../Ventoy2Disk/Lib/libhttp/include/timer.inl ../Ventoy2Disk/QT/ventoy_qt.h ../Ventoy2Disk/Web/ventoy_http.h ../Ventoy2Disk/partcfgdialog.h ../Ventoy2Disk/ventoy2diskwindow.h $(DISTDIR)/ + $(COPY_FILE) --parents ../Ventoy2Disk/Core/ventoy_crc32.c ../Ventoy2Disk/Core/ventoy_disk.c ../Ventoy2Disk/Core/ventoy_json.c ../Ventoy2Disk/Core/ventoy_log.c ../Ventoy2Disk/Core/ventoy_md5.c ../Ventoy2Disk/Core/ventoy_util.c ../Ventoy2Disk/Lib/exfat/src/libexfat/cluster.c ../Ventoy2Disk/Lib/exfat/src/libexfat/io.c ../Ventoy2Disk/Lib/exfat/src/libexfat/lookup.c ../Ventoy2Disk/Lib/exfat/src/libexfat/mount.c ../Ventoy2Disk/Lib/exfat/src/libexfat/node.c ../Ventoy2Disk/Lib/exfat/src/libexfat/repair.c ../Ventoy2Disk/Lib/exfat/src/libexfat/time.c ../Ventoy2Disk/Lib/exfat/src/libexfat/utf.c ../Ventoy2Disk/Lib/exfat/src/libexfat/utils.c ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.c ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.c ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.c ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat_main.c ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.c ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.c ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.c ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.c ../Ventoy2Disk/Lib/fat_io_lib/fat_access.c ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.c ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c ../Ventoy2Disk/Lib/fat_io_lib/fat_format.c ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.c ../Ventoy2Disk/Lib/fat_io_lib/fat_string.c ../Ventoy2Disk/Lib/fat_io_lib/fat_table.c ../Ventoy2Disk/Lib/fat_io_lib/fat_write.c ../Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c ../Ventoy2Disk/QT/refresh_icon_data.c ../Ventoy2Disk/QT/secure_icon_data.c ../Ventoy2Disk/QT/ventoy_qt_stub.c ../Ventoy2Disk/Web/ventoy_http.c ../Ventoy2Disk/main.cpp ../Ventoy2Disk/partcfgdialog.cpp ../Ventoy2Disk/ventoy2diskwindow.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../Ventoy2Disk/partcfgdialog.ui ../Ventoy2Disk/ventoy2diskwindow.ui $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) moc_predefs.h +moc_predefs.h: ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -Wall -W -dM -E -o moc_predefs.h ../../Qt5.9.0/5.9/gcc_64/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: moc_partcfgdialog.cpp moc_ventoy2diskwindow.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_partcfgdialog.cpp moc_ventoy2diskwindow.cpp +moc_partcfgdialog.cpp: ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDialog \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgetsglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtguiglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig-bootstrapped.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtcore-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsystemdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qprocessordetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcompilerdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtypeinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsysinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlogging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qflags.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbasicatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_bootstrap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qgenericatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_cxx11.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_msvc.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobalstatic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmutex.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnumeric.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qversiontagging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtgui-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgets-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnamespace.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs_win.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qchar.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrefcount.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qarraydata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringbuilder.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qalgorithms.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiterator.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhashfunctions.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpair.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearraylist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qregexp.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringmatcher.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qscopedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmetatype.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvarlengtharray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontainerfwd.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmargins.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpaintdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrect.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsize.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpoint.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpalette.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcolor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgb.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgba64.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qbrush.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvector.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qmatrix.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpolygon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qregion.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdatastream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiodevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qline.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtransform.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpainterpath.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qimage.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixelformat.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qshareddata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhash.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfont.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontmetrics.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qsizepolicy.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcursor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qkeysequence.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvariant.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdebug.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtextstream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlocale.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qset.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontiguouscache.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurlquery.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfile.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfiledevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qvector2d.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtouchdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonObject \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonvalue.h \ + ../Ventoy2Disk/partcfgdialog.h \ + moc_predefs.h \ + ../../Qt5.9.0/5.9/gcc_64/bin/moc + /home/panda/Qt5.9.0/5.9/gcc_64/bin/moc $(DEFINES) --include ./moc_predefs.h -I/home/panda/Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++ -I/home/panda/590/Ventoy2Disk -I/home/panda/Ventoy2Disk/Core -I/home/panda/Ventoy2Disk/Web -I/home/panda/Ventoy2Disk/QT -I/home/panda/Ventoy2Disk/Include -I/home/panda/Ventoy2Disk/Lib/libhttp/include -I/home/panda/Ventoy2Disk/Lib/fat_io_lib/include -I/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include -I/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I/home/panda/Ventoy2Disk/Lib/xz-embedded/userspace -I/home/panda/Ventoy2Disk/Lib/exfat/src/libexfat -I/home/panda/Ventoy2Disk/Lib/fat_io_lib -I/home/panda/Qt5.9.0/5.9/gcc_64/include -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtWidgets -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtGui -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtCore -I. -I/usr/include/c++/8 -I/usr/include/x86_64-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/x86_64-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include ../Ventoy2Disk/partcfgdialog.h -o moc_partcfgdialog.cpp + +moc_ventoy2diskwindow.cpp: ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMainWindow \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmainwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgetsglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtguiglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig-bootstrapped.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtcore-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsystemdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qprocessordetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcompilerdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtypeinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsysinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlogging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qflags.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbasicatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_bootstrap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qgenericatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_cxx11.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_msvc.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobalstatic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmutex.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnumeric.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qversiontagging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtgui-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgets-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnamespace.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs_win.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qchar.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrefcount.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qarraydata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringbuilder.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qalgorithms.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiterator.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhashfunctions.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpair.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearraylist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qregexp.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringmatcher.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qscopedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmetatype.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvarlengtharray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontainerfwd.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmargins.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpaintdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrect.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsize.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpoint.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpalette.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcolor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgb.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgba64.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qbrush.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvector.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qmatrix.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpolygon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qregion.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdatastream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiodevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qline.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtransform.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpainterpath.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qimage.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixelformat.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qshareddata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhash.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfont.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontmetrics.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qsizepolicy.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcursor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qkeysequence.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvariant.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdebug.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtextstream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlocale.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qset.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontiguouscache.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurlquery.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfile.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfiledevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qvector2d.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtouchdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtabwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qicon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QActionGroup \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qactiongroup.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qaction.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonDocument \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsondocument.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonvalue.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QFile \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonObject \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonArray \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonarray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QVector \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QtGlobal \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QDebug \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/QCloseEvent \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QThread \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qthread.h \ + ../Ventoy2Disk/partcfgdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDialog \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdialog.h \ + ../Ventoy2Disk/ventoy2diskwindow.h \ + moc_predefs.h \ + ../../Qt5.9.0/5.9/gcc_64/bin/moc + /home/panda/Qt5.9.0/5.9/gcc_64/bin/moc $(DEFINES) --include ./moc_predefs.h -I/home/panda/Qt5.9.0/5.9/gcc_64/mkspecs/linux-g++ -I/home/panda/590/Ventoy2Disk -I/home/panda/Ventoy2Disk/Core -I/home/panda/Ventoy2Disk/Web -I/home/panda/Ventoy2Disk/QT -I/home/panda/Ventoy2Disk/Include -I/home/panda/Ventoy2Disk/Lib/libhttp/include -I/home/panda/Ventoy2Disk/Lib/fat_io_lib/include -I/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include -I/home/panda/Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I/home/panda/Ventoy2Disk/Lib/xz-embedded/userspace -I/home/panda/Ventoy2Disk/Lib/exfat/src/libexfat -I/home/panda/Ventoy2Disk/Lib/fat_io_lib -I/home/panda/Qt5.9.0/5.9/gcc_64/include -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtWidgets -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtGui -I/home/panda/Qt5.9.0/5.9/gcc_64/include/QtCore -I. -I/usr/include/c++/8 -I/usr/include/x86_64-linux-gnu/c++/8 -I/usr/include/c++/8/backward -I/usr/lib/gcc/x86_64-linux-gnu/8/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/8/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include ../Ventoy2Disk/ventoy2diskwindow.h -o moc_ventoy2diskwindow.cpp + +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_partcfgdialog.h ui_ventoy2diskwindow.h +compiler_uic_clean: + -$(DEL_FILE) ui_partcfgdialog.h ui_ventoy2diskwindow.h +ui_partcfgdialog.h: ../Ventoy2Disk/partcfgdialog.ui \ + ../../Qt5.9.0/5.9/gcc_64/bin/uic + /home/panda/Qt5.9.0/5.9/gcc_64/bin/uic ../Ventoy2Disk/partcfgdialog.ui -o ui_partcfgdialog.h + +ui_ventoy2diskwindow.h: ../Ventoy2Disk/ventoy2diskwindow.ui \ + ../../Qt5.9.0/5.9/gcc_64/bin/uic + /home/panda/Qt5.9.0/5.9/gcc_64/bin/uic ../Ventoy2Disk/ventoy2diskwindow.ui -o ui_ventoy2diskwindow.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_uic_clean + +####### Compile + +ventoy_crc32.o: ../Ventoy2Disk/Core/ventoy_crc32.c + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_crc32.o ../Ventoy2Disk/Core/ventoy_crc32.c + +ventoy_disk.o: ../Ventoy2Disk/Core/ventoy_disk.c ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_disk.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_disk.o ../Ventoy2Disk/Core/ventoy_disk.c + +ventoy_json.o: ../Ventoy2Disk/Core/ventoy_json.c ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/Core/ventoy_json.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_json.o ../Ventoy2Disk/Core/ventoy_json.c + +ventoy_log.o: ../Ventoy2Disk/Core/ventoy_log.c ../../Ventoy2Disk/Core/ventoy_define.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_log.o ../Ventoy2Disk/Core/ventoy_log.c + +ventoy_md5.o: ../Ventoy2Disk/Core/ventoy_md5.c + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_md5.o ../Ventoy2Disk/Core/ventoy_md5.c + +ventoy_util.o: ../Ventoy2Disk/Core/ventoy_util.c ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_util.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_util.o ../Ventoy2Disk/Core/ventoy_util.c + +cluster.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/cluster.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cluster.o ../Ventoy2Disk/Lib/exfat/src/libexfat/cluster.c + +io.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/io.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o io.o ../Ventoy2Disk/Lib/exfat/src/libexfat/io.c + +lookup.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/lookup.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o lookup.o ../Ventoy2Disk/Lib/exfat/src/libexfat/lookup.c + +mount.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/mount.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mount.o ../Ventoy2Disk/Lib/exfat/src/libexfat/mount.c + +node.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/node.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o node.o ../Ventoy2Disk/Lib/exfat/src/libexfat/node.c + +repair.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/repair.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o repair.o ../Ventoy2Disk/Lib/exfat/src/libexfat/repair.c + +time.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/time.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o time.o ../Ventoy2Disk/Lib/exfat/src/libexfat/time.c + +utf.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/utf.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utf.o ../Ventoy2Disk/Lib/exfat/src/libexfat/utf.c + +utils.o: ../Ventoy2Disk/Lib/exfat/src/libexfat/utils.c ../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utils.o ../Ventoy2Disk/Lib/exfat/src/libexfat/utils.c + +cbm.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.c ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cbm.o ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.c + +fat.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.c ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat.o ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.c + +mkexfat.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.c ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat.o ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.c + +mkexfat_main.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat_main.c ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat_main.o ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat_main.c + +rootdir.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.c ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o rootdir.o ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.c + +uct.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.c ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uct.o ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.c + +uctc.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.c ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uctc.o ../Ventoy2Disk/Lib/exfat/src/mkfs/uctc.c + +vbr.o: ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.c ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/mkexfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfat.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/config.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/compiler.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/exfatfs.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/byteorder.h \ + ../../Ventoy2Disk/Lib/exfat/src/libexfat/platform.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/fat.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/cbm.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/uct.h \ + ../Ventoy2Disk/Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o vbr.o ../Ventoy2Disk/Lib/exfat/src/mkfs/vbr.c + +fat_access.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_access.c ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_access.o ../Ventoy2Disk/Lib/fat_io_lib/fat_access.c + +fat_cache.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.c ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_cache.o ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.c + +fat_filelib.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_list.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_cache.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_filelib.o ../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.c + +fat_format.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_format.c ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_format.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_format.o ../Ventoy2Disk/Lib/fat_io_lib/fat_format.c + +fat_misc.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.c ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_misc.o ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.c + +fat_string.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_string.c ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_string.o ../Ventoy2Disk/Lib/fat_io_lib/fat_string.c + +fat_table.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_table.c ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_table.o ../Ventoy2Disk/Lib/fat_io_lib/fat_table.c + +fat_write.o: ../Ventoy2Disk/Lib/fat_io_lib/fat_write.c ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_table.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_misc.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_write.h \ + ../Ventoy2Disk/Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_write.o ../Ventoy2Disk/Lib/fat_io_lib/fat_write.c + +decompress_unxz.o: ../Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c ../../Ventoy2Disk/Lib/xz-embedded/linux/include/linux/xz.h \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_private.h \ + ../../Ventoy2Disk/Lib/xz-embedded/userspace/xz_config.h \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_crc32.c \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_dec_stream.c \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_stream.h \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_lzma2.h \ + ../Ventoy2Disk/Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c + $(CC) -c $(CFLAGS) $(INCPATH) -o decompress_unxz.o ../Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c + +refresh_icon_data.o: ../Ventoy2Disk/QT/refresh_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o refresh_icon_data.o ../Ventoy2Disk/QT/refresh_icon_data.c + +secure_icon_data.o: ../Ventoy2Disk/QT/secure_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o secure_icon_data.o ../Ventoy2Disk/QT/secure_icon_data.c + +ventoy_qt_stub.o: ../Ventoy2Disk/QT/ventoy_qt_stub.c ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_json.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/Core/ventoy_disk.h \ + ../../Ventoy2Disk/Web/ventoy_http.h \ + ../../Ventoy2Disk/Lib/libhttp/include/civetweb.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_qt_stub.o ../Ventoy2Disk/QT/ventoy_qt_stub.c + +ventoy_http.o: ../Ventoy2Disk/Web/ventoy_http.c ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_json.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/Core/ventoy_disk.h \ + ../../Ventoy2Disk/Web/ventoy_http.h \ + ../../Ventoy2Disk/Lib/libhttp/include/civetweb.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_filelib.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_opts.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_access.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_defs.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_types.h \ + ../../Ventoy2Disk/Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o ventoy_http.o ../Ventoy2Disk/Web/ventoy_http.c + +main.o: ../Ventoy2Disk/main.cpp ../Ventoy2Disk/ventoy2diskwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMainWindow \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmainwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgetsglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtguiglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig-bootstrapped.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtcore-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsystemdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qprocessordetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcompilerdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtypeinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsysinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlogging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qflags.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbasicatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_bootstrap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qgenericatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_cxx11.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_msvc.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobalstatic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmutex.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnumeric.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qversiontagging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtgui-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgets-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnamespace.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs_win.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qchar.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrefcount.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qarraydata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringbuilder.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qalgorithms.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiterator.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhashfunctions.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpair.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearraylist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qregexp.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringmatcher.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qscopedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmetatype.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvarlengtharray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontainerfwd.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmargins.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpaintdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrect.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsize.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpoint.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpalette.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcolor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgb.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgba64.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qbrush.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvector.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qmatrix.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpolygon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qregion.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdatastream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiodevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qline.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtransform.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpainterpath.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qimage.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixelformat.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qshareddata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhash.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfont.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontmetrics.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qsizepolicy.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcursor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qkeysequence.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvariant.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdebug.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtextstream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlocale.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qset.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontiguouscache.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurlquery.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfile.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfiledevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qvector2d.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtouchdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtabwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qicon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QActionGroup \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qactiongroup.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qaction.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonDocument \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsondocument.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonvalue.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QFile \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonObject \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonArray \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonarray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QVector \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QtGlobal \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QDebug \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/QCloseEvent \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QThread \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qthread.h \ + ../Ventoy2Disk/partcfgdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDialog \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QApplication \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qapplication.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreapplication.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qeventloop.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdesktopwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qguiapplication.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qinputmethod.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMessageBox \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmessagebox.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QFileInfo \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfileinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QStyle \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qstyle.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDesktopWidget \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/QPixmap \ + ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/QT/ventoy_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o ../Ventoy2Disk/main.cpp + +partcfgdialog.o: ../Ventoy2Disk/partcfgdialog.cpp ../Ventoy2Disk/partcfgdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDialog \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgetsglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtguiglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig-bootstrapped.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtcore-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsystemdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qprocessordetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcompilerdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtypeinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsysinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlogging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qflags.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbasicatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_bootstrap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qgenericatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_cxx11.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_msvc.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobalstatic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmutex.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnumeric.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qversiontagging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtgui-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgets-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnamespace.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs_win.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qchar.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrefcount.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qarraydata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringbuilder.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qalgorithms.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiterator.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhashfunctions.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpair.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearraylist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qregexp.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringmatcher.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qscopedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmetatype.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvarlengtharray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontainerfwd.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmargins.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpaintdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrect.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsize.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpoint.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpalette.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcolor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgb.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgba64.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qbrush.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvector.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qmatrix.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpolygon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qregion.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdatastream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiodevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qline.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtransform.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpainterpath.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qimage.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixelformat.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qshareddata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhash.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfont.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontmetrics.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qsizepolicy.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcursor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qkeysequence.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvariant.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdebug.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtextstream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlocale.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qset.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontiguouscache.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurlquery.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfile.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfiledevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qvector2d.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtouchdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonObject \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonvalue.h \ + ui_partcfgdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QDebug \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMessageBox \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmessagebox.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o partcfgdialog.o ../Ventoy2Disk/partcfgdialog.cpp + +ventoy2diskwindow.o: ../Ventoy2Disk/ventoy2diskwindow.cpp ../Ventoy2Disk/ventoy2diskwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMainWindow \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmainwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgetsglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtguiglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobal.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig-bootstrapped.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qconfig.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtcore-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsystemdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qprocessordetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcompilerdetection.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtypeinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsysinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlogging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qflags.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbasicatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_bootstrap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qgenericatomic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_cxx11.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qatomic_msvc.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qglobalstatic.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmutex.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnumeric.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qversiontagging.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtgui-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtwidgets-config.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qnamespace.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobjectdefs_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qwindowdefs_win.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstring.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qchar.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrefcount.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qarraydata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringbuilder.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qalgorithms.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiterator.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhashfunctions.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpair.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qbytearraylist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringlist.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qregexp.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qstringmatcher.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcoreevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qscopedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmetatype.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvarlengtharray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontainerfwd.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qobject_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmargins.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpaintdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qrect.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsize.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qpoint.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpalette.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcolor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgb.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qrgba64.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qbrush.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvector.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qmatrix.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpolygon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qregion.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdatastream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qiodevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qline.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtransform.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpainterpath.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qimage.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixelformat.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qpixmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qshareddata.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qhash.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qsharedpointer_impl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfont.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontmetrics.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qfontinfo.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qsizepolicy.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qcursor.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qkeysequence.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qevent.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qvariant.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qmap.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qdebug.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qtextstream.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qlocale.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qset.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qcontiguouscache.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurl.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qurlquery.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfile.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qfiledevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qvector2d.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qtouchdevice.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qtabwidget.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/qicon.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QActionGroup \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qactiongroup.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qaction.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonDocument \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsondocument.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonvalue.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QFile \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonObject \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonobject.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QJsonArray \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qjsonarray.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QVector \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QtGlobal \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QDebug \ + ../../Qt5.9.0/5.9/gcc_64/include/QtGui/QCloseEvent \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/QThread \ + ../../Qt5.9.0/5.9/gcc_64/include/QtCore/qthread.h \ + ../Ventoy2Disk/partcfgdialog.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QDialog \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qdialog.h \ + ui_ventoy2diskwindow.h \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/QMessageBox \ + ../../Qt5.9.0/5.9/gcc_64/include/QtWidgets/qmessagebox.h \ + ../../Ventoy2Disk/Core/ventoy_define.h \ + ../../Ventoy2Disk/Core/ventoy_util.h \ + ../../Ventoy2Disk/Core/ventoy_disk.h \ + ../../Ventoy2Disk/Core/ventoy_json.h \ + ../../Ventoy2Disk/Web/ventoy_http.h \ + ../../Ventoy2Disk/Lib/libhttp/include/civetweb.h \ + ../../Ventoy2Disk/QT/ventoy_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ventoy2diskwindow.o ../Ventoy2Disk/ventoy2diskwindow.cpp + +moc_partcfgdialog.o: moc_partcfgdialog.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_partcfgdialog.o moc_partcfgdialog.cpp + +moc_ventoy2diskwindow.o: moc_ventoy2diskwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_ventoy2diskwindow.o moc_ventoy2diskwindow.cpp + +####### Install + +install_target: first FORCE + @test -d $(INSTALL_ROOT)/opt/Ventoy2Disk/bin || mkdir -p $(INSTALL_ROOT)/opt/Ventoy2Disk/bin + -$(QINSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/opt/Ventoy2Disk/bin/$(QMAKE_TARGET) + -$(STRIP) $(INSTALL_ROOT)/opt/Ventoy2Disk/bin/$(QMAKE_TARGET) + +uninstall_target: FORCE + -$(DEL_FILE) $(INSTALL_ROOT)/opt/Ventoy2Disk/bin/$(QMAKE_TARGET) + -$(DEL_DIR) $(INSTALL_ROOT)/opt/Ventoy2Disk/bin/ + + +install: install_target FORCE + +uninstall: uninstall_target FORCE + +FORCE: + diff --git a/LinuxGUI/Ventoy2Disk/QT/build/moc_partcfgdialog.cpp b/LinuxGUI/Ventoy2Disk/QT/build/moc_partcfgdialog.cpp new file mode 100644 index 00000000..5bd328b2 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/moc_partcfgdialog.cpp @@ -0,0 +1,124 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'partcfgdialog.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.9.0) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../partcfgdialog.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'partcfgdialog.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.9.0. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_PartCfgDialog_t { + QByteArrayData data[6]; + char stringdata0[97]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PartCfgDialog_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PartCfgDialog_t qt_meta_stringdata_PartCfgDialog = { + { +QT_MOC_LITERAL(0, 0, 13), // "PartCfgDialog" +QT_MOC_LITERAL(1, 14, 23), // "on_pushButtonOK_clicked" +QT_MOC_LITERAL(2, 38, 0), // "" +QT_MOC_LITERAL(3, 39, 27), // "on_pushButtonCancel_clicked" +QT_MOC_LITERAL(4, 67, 24), // "on_checkBox_stateChanged" +QT_MOC_LITERAL(5, 92, 4) // "arg1" + + }, + "PartCfgDialog\0on_pushButtonOK_clicked\0" + "\0on_pushButtonCancel_clicked\0" + "on_checkBox_stateChanged\0arg1" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PartCfgDialog[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x08 /* Private */, + 3, 0, 30, 2, 0x08 /* Private */, + 4, 1, 31, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + + 0 // eod +}; + +void PartCfgDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + PartCfgDialog *_t = static_cast(_o); + Q_UNUSED(_t) + switch (_id) { + case 0: _t->on_pushButtonOK_clicked(); break; + case 1: _t->on_pushButtonCancel_clicked(); break; + case 2: _t->on_checkBox_stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +const QMetaObject PartCfgDialog::staticMetaObject = { + { &QDialog::staticMetaObject, qt_meta_stringdata_PartCfgDialog.data, + qt_meta_data_PartCfgDialog, qt_static_metacall, nullptr, nullptr} +}; + + +const QMetaObject *PartCfgDialog::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PartCfgDialog::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_PartCfgDialog.stringdata0)) + return static_cast(const_cast< PartCfgDialog*>(this)); + return QDialog::qt_metacast(_clname); +} + +int PartCfgDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QDialog::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/LinuxGUI/Ventoy2Disk/QT/build/moc_predefs.h b/LinuxGUI/Ventoy2Disk/QT/build/moc_predefs.h new file mode 100644 index 00000000..868c52fd --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/moc_predefs.h @@ -0,0 +1,375 @@ +#define __DBL_MIN_EXP__ (-1021) +#define __FLT32X_MAX_EXP__ 1024 +#define __cpp_attributes 200809 +#define __UINT_LEAST16_MAX__ 0xffff +#define __ATOMIC_ACQUIRE 2 +#define __FLT128_MAX_10_EXP__ 4932 +#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F +#define __GCC_IEC_559_COMPLEX 2 +#define __UINT_LEAST8_TYPE__ unsigned char +#define __SIZEOF_FLOAT80__ 16 +#define __INTMAX_C(c) c ## L +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 0xff +#define __WINT_MAX__ 0xffffffffU +#define __FLT32_MIN_EXP__ (-125) +#define __cpp_static_assert 200410 +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __SIZE_MAX__ 0xffffffffffffffffUL +#define __WCHAR_MAX__ 0x7fffffff +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 +#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 +#define __GCC_IEC_559 2 +#define __FLT32X_DECIMAL_DIG__ 17 +#define __FLT_EVAL_METHOD__ 0 +#define __unix__ 1 +#define __cpp_binary_literals 201304 +#define __FLT64_DECIMAL_DIG__ 17 +#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 +#define __x86_64 1 +#define __cpp_variadic_templates 200704 +#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define __GNUC_PATCHLEVEL__ 0 +#define __FLT32_HAS_DENORM__ 1 +#define __UINT_FAST8_MAX__ 0xff +#define __has_include(STR) __has_include__(STR) +#define __DEC64_MAX_EXP__ 385 +#define __INT8_C(c) c +#define __INT_LEAST8_WIDTH__ 8 +#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL +#define __SHRT_MAX__ 0x7fff +#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __FLT64X_MAX_10_EXP__ 4932 +#define __UINT_LEAST8_MAX__ 0xff +#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 +#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +#define __UINTMAX_TYPE__ long unsigned int +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __FLT_EVAL_METHOD_TS_18661_3__ 0 +#define __OPTIMIZE__ 1 +#define __unix 1 +#define __UINT32_MAX__ 0xffffffffU +#define __GXX_EXPERIMENTAL_CXX0X__ 1 +#define __LDBL_MAX_EXP__ 16384 +#define __FLT128_MIN_EXP__ (-16381) +#define __WINT_MIN__ 0U +#define __linux__ 1 +#define __FLT128_MIN_10_EXP__ (-4931) +#define __INT_LEAST16_WIDTH__ 16 +#define __SCHAR_MAX__ 0x7f +#define __FLT128_MANT_DIG__ 113 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __INT64_C(c) c ## L +#define __DBL_DIG__ 15 +#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 +#define __FLT64X_MANT_DIG__ 64 +#define __SIZEOF_INT__ 4 +#define __SIZEOF_POINTER__ 8 +#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 +#define __USER_LABEL_PREFIX__ +#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x +#define __STDC_HOSTED__ 1 +#define __LDBL_HAS_INFINITY__ 1 +#define __FLT32_DIG__ 6 +#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F +#define __GXX_WEAK__ 1 +#define __SHRT_WIDTH__ 16 +#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +#define __DEC32_MAX__ 9.999999E96DF +#define __cpp_threadsafe_static_init 200806 +#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x +#define __FLT32X_HAS_INFINITY__ 1 +#define __INT32_MAX__ 0x7fffffff +#define __INT_WIDTH__ 32 +#define __SIZEOF_LONG__ 8 +#define __STDC_IEC_559__ 1 +#define __STDC_ISO_10646__ 201706L +#define __UINT16_C(c) c +#define __PTRDIFF_WIDTH__ 64 +#define __DECIMAL_DIG__ 21 +#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 +#define __gnu_linux__ 1 +#define __INTMAX_WIDTH__ 64 +#define __FLT64_MIN_EXP__ (-1021) +#define __has_include_next(STR) __has_include_next__(STR) +#define __FLT64X_MIN_10_EXP__ (-4931) +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __FLT64_MANT_DIG__ 53 +#define __GNUC__ 8 +#define __GXX_RTTI 1 +#define __MMX__ 1 +#define __cpp_delegating_constructors 200604 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 16 +#define __BIGGEST_ALIGNMENT__ 16 +#define __STDC_UTF_16__ 1 +#define __FLT64_MAX_10_EXP__ 308 +#define __FLT32_HAS_INFINITY__ 1 +#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __cpp_raw_strings 200710 +#define __INT_FAST32_MAX__ 0x7fffffffffffffffL +#define __DBL_HAS_INFINITY__ 1 +#define __DEC32_MIN_EXP__ (-94) +#define __INTPTR_WIDTH__ 64 +#define __FLT32X_HAS_DENORM__ 1 +#define __INT_FAST16_TYPE__ long int +#define __LDBL_HAS_DENORM__ 1 +#define __cplusplus 201103L +#define __cpp_ref_qualifiers 200710 +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_LEAST32_MAX__ 0x7fffffff +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __cpp_rvalue_references 200610 +#define __DBL_MAX_EXP__ 1024 +#define __WCHAR_WIDTH__ 32 +#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __DEC128_EPSILON__ 1E-33DL +#define __SSE2_MATH__ 1 +#define __ATOMIC_HLE_RELEASE 131072 +#define __PTRDIFF_MAX__ 0x7fffffffffffffffL +#define __amd64 1 +#define __ATOMIC_HLE_ACQUIRE 65536 +#define __FLT32_HAS_QUIET_NAN__ 1 +#define __GNUG__ 8 +#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL +#define __SIZEOF_SIZE_T__ 8 +#define __cpp_rvalue_reference 200610 +#define __cpp_nsdmi 200809 +#define __FLT64X_MIN_EXP__ (-16381) +#define __SIZEOF_WINT_T__ 4 +#define __LONG_LONG_WIDTH__ 64 +#define __cpp_initializer_lists 200806 +#define __FLT32_MAX_EXP__ 128 +#define __cpp_hex_float 201603 +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __GXX_ABI_VERSION 1013 +#define __FLT128_HAS_INFINITY__ 1 +#define __FLT_MIN_EXP__ (-125) +#define __cpp_lambdas 200907 +#define __FLT64X_HAS_QUIET_NAN__ 1 +#define __INT_FAST64_TYPE__ long int +#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 +#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) +#define __LP64__ 1 +#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x +#define __DECIMAL_BID_FORMAT__ 1 +#define __FLT64_MIN_10_EXP__ (-307) +#define __FLT64X_DECIMAL_DIG__ 21 +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 0xffff +#define __DBL_HAS_DENORM__ 1 +#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 +#define __UINT8_TYPE__ unsigned char +#define __FLT_MANT_DIG__ 24 +#define __LDBL_DECIMAL_DIG__ 21 +#define __VERSION__ "8.3.0" +#define __UINT64_C(c) c ## UL +#define __cpp_unicode_characters 200704 +#define _STDC_PREDEF_H 1 +#define __GCC_ATOMIC_INT_LOCK_FREE 2 +#define __FLT128_MAX_EXP__ 16384 +#define __FLT32_MANT_DIG__ 24 +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __STDC_IEC_559_COMPLEX__ 1 +#define __FLT128_HAS_DENORM__ 1 +#define __FLT128_DIG__ 33 +#define __SCHAR_WIDTH__ 8 +#define __INT32_C(c) c +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __FLT32_MAX_10_EXP__ 38 +#define __INT_FAST32_TYPE__ long int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define __FLT64X_HAS_INFINITY__ 1 +#define unix 1 +#define __INT16_MAX__ 0x7fff +#define __cpp_rtti 199711 +#define __SIZE_TYPE__ long unsigned int +#define __UINT64_MAX__ 0xffffffffffffffffUL +#define __FLT64X_DIG__ 18 +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __GCC_ASM_FLAG_OUTPUTS__ 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L +#define __UINTMAX_C(c) c ## UL +#define __GLIBCXX_BITSIZE_INT_N_0 128 +#define __k8 1 +#define __SIG_ATOMIC_MAX__ 0x7fffffff +#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 +#define __SIZEOF_PTRDIFF_T__ 8 +#define __FLT32X_MANT_DIG__ 53 +#define __x86_64__ 1 +#define __FLT32X_MIN_EXP__ (-1021) +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __INT_FAST16_MAX__ 0x7fffffffffffffffL +#define __FLT64_DIG__ 15 +#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL +#define __UINT_LEAST64_TYPE__ long unsigned int +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __LONG_MAX__ 0x7fffffffffffffffL +#define __FLT64X_HAS_DENORM__ 1 +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __cpp_unicode_literals 200710 +#define __UINT_FAST16_TYPE__ long unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __INT_FAST32_WIDTH__ 64 +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __SIZE_WIDTH__ 64 +#define __SEG_FS 1 +#define __INT_LEAST16_MAX__ 0x7fff +#define __DEC64_MANT_DIG__ 16 +#define __INT64_MAX__ 0x7fffffffffffffffL +#define __UINT_LEAST32_MAX__ 0xffffffffU +#define __SEG_GS 1 +#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 +#define __GCC_ATOMIC_LONG_LOCK_FREE 2 +#define __SIG_ATOMIC_WIDTH__ 32 +#define __INT_LEAST64_TYPE__ long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 0x7f +#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __INTPTR_MAX__ 0x7fffffffffffffffL +#define linux 1 +#define __cpp_range_based_for 200907 +#define __FLT64_HAS_QUIET_NAN__ 1 +#define __FLT32_MIN_10_EXP__ (-37) +#define __SSE2__ 1 +#define __EXCEPTIONS 1 +#define __LDBL_MANT_DIG__ 64 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __FLT64_HAS_INFINITY__ 1 +#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __code_model_small__ 1 +#define __k8__ 1 +#define __INTPTR_TYPE__ long int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __SIZEOF_FLOAT__ 4 +#define __UINTPTR_MAX__ 0xffffffffffffffffUL +#define __INT_FAST64_WIDTH__ 64 +#define __DEC64_MIN_EXP__ (-382) +#define __cpp_decltype 200707 +#define __FLT32_DECIMAL_DIG__ 9 +#define __INT_FAST64_MAX__ 0x7fffffffffffffffL +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#define __FLT_DIG__ 6 +#define __FLT64X_MAX_EXP__ 16384 +#define __UINT_FAST64_TYPE__ long unsigned int +#define __INT_MAX__ 0x7fffffff +#define __amd64__ 1 +#define __INT64_TYPE__ long int +#define __FLT_MAX_EXP__ 128 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __DBL_MANT_DIG__ 53 +#define __cpp_inheriting_constructors 201511 +#define __SIZEOF_FLOAT128__ 16 +#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __SSE__ 1 +#define __LDBL_MIN_EXP__ (-16381) +#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __WINT_WIDTH__ 32 +#define __INT_LEAST8_MAX__ 0x7f +#define __FLT32X_MAX_10_EXP__ 308 +#define __SIZEOF_INT128__ 16 +#define __LDBL_MAX_10_EXP__ 4932 +#define __ATOMIC_RELAXED 0 +#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) +#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 +#define _LP64 1 +#define __UINT8_C(c) c +#define __FLT64_MAX_EXP__ 1024 +#define __INT_LEAST32_TYPE__ int +#define __SIZEOF_WCHAR_T__ 4 +#define __FLT128_HAS_QUIET_NAN__ 1 +#define __INT_FAST8_TYPE__ signed char +#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x +#define __GNUC_STDC_INLINE__ 1 +#define __FLT64_HAS_DENORM__ 1 +#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 +#define __DBL_DECIMAL_DIG__ 17 +#define __STDC_UTF_32__ 1 +#define __INT_FAST8_WIDTH__ 8 +#define __FXSR__ 1 +#define __DEC_EVAL_METHOD__ 2 +#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __cpp_runtime_arrays 198712 +#define __UINT64_TYPE__ long unsigned int +#define __UINT32_C(c) c ## U +#define __INTMAX_MAX__ 0x7fffffffffffffffL +#define __cpp_alias_templates 200704 +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F +#define __INT8_MAX__ 0x7f +#define __LONG_WIDTH__ 64 +#define __UINT_FAST32_TYPE__ long unsigned int +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F +#define __cpp_constexpr 200704 +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __cpp_exceptions 199711 +#define __FLT_MIN_10_EXP__ (-37) +#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 +#define __INT_LEAST32_WIDTH__ 32 +#define __INTMAX_TYPE__ long int +#define __DEC128_MAX_EXP__ 6145 +#define __FLT32X_HAS_QUIET_NAN__ 1 +#define __ATOMIC_CONSUME 1 +#define __GNUC_MINOR__ 3 +#define __GLIBCXX_TYPE_INT_N_0 __int128 +#define __INT_FAST16_WIDTH__ 64 +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __DEC32_MANT_DIG__ 7 +#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L +#define __INT16_C(c) c +#define __STDC__ 1 +#define __FLT32X_DIG__ 15 +#define __PTRDIFF_TYPE__ long int +#define __ATOMIC_SEQ_CST 5 +#define __UINT32_TYPE__ unsigned int +#define __FLT32X_MIN_10_EXP__ (-307) +#define __UINTPTR_TYPE__ long unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-4931) +#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +#define __SSE_MATH__ 1 +#define __SIZEOF_LONG_LONG__ 8 +#define __cpp_user_defined_literals 200809 +#define __FLT128_DECIMAL_DIG__ 36 +#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 +#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x +#define __LDBL_DIG__ 18 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL +#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 +#define __INT_LEAST64_WIDTH__ 64 +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define __ATOMIC_ACQ_REL 4 +#define __ATOMIC_RELEASE 3 diff --git a/LinuxGUI/Ventoy2Disk/QT/build/moc_ventoy2diskwindow.cpp b/LinuxGUI/Ventoy2Disk/QT/build/moc_ventoy2diskwindow.cpp new file mode 100644 index 00000000..f04103ef --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/moc_ventoy2diskwindow.cpp @@ -0,0 +1,294 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'ventoy2diskwindow.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.9.0) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../ventoy2diskwindow.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'ventoy2diskwindow.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.9.0. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_MyQThread_t { + QByteArrayData data[5]; + char stringdata0[33]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MyQThread_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MyQThread_t qt_meta_stringdata_MyQThread = { + { +QT_MOC_LITERAL(0, 0, 9), // "MyQThread" +QT_MOC_LITERAL(1, 10, 12), // "thread_event" +QT_MOC_LITERAL(2, 23, 0), // "" +QT_MOC_LITERAL(3, 24, 3), // "msg" +QT_MOC_LITERAL(4, 28, 4) // "data" + + }, + "MyQThread\0thread_event\0\0msg\0data" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MyQThread[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + 0 // eod +}; + +void MyQThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + MyQThread *_t = static_cast(_o); + Q_UNUSED(_t) + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (MyQThread::*_t)(int , int ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&MyQThread::thread_event)) { + *result = 0; + return; + } + } + } +} + +const QMetaObject MyQThread::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_MyQThread.data, + qt_meta_data_MyQThread, qt_static_metacall, nullptr, nullptr} +}; + + +const QMetaObject *MyQThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MyQThread::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_MyQThread.stringdata0)) + return static_cast(const_cast< MyQThread*>(this)); + return QThread::qt_metacast(_clname); +} + +int MyQThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MyQThread::thread_event(int _t1, int _t2) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +struct qt_meta_stringdata_Ventoy2DiskWindow_t { + QByteArrayData data[19]; + char stringdata0[367]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_Ventoy2DiskWindow_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_Ventoy2DiskWindow_t qt_meta_stringdata_Ventoy2DiskWindow = { + { +QT_MOC_LITERAL(0, 0, 17), // "Ventoy2DiskWindow" +QT_MOC_LITERAL(1, 18, 12), // "thread_event" +QT_MOC_LITERAL(2, 31, 0), // "" +QT_MOC_LITERAL(3, 32, 3), // "msg" +QT_MOC_LITERAL(4, 36, 4), // "data" +QT_MOC_LITERAL(5, 41, 23), // "part_style_check_action" +QT_MOC_LITERAL(6, 65, 8), // "QAction*" +QT_MOC_LITERAL(7, 74, 3), // "act" +QT_MOC_LITERAL(8, 78, 17), // "lang_check_action" +QT_MOC_LITERAL(9, 96, 24), // "on_ButtonInstall_clicked" +QT_MOC_LITERAL(10, 121, 23), // "on_ButtonUpdate_clicked" +QT_MOC_LITERAL(11, 145, 24), // "on_ButtonRefresh_clicked" +QT_MOC_LITERAL(12, 170, 37), // "on_comboBoxDevice_currentInde..." +QT_MOC_LITERAL(13, 208, 5), // "index" +QT_MOC_LITERAL(14, 214, 42), // "on_actionPartition_Configurat..." +QT_MOC_LITERAL(15, 257, 31), // "on_actionClear_Ventoy_triggered" +QT_MOC_LITERAL(16, 289, 33), // "on_actionShow_All_Devices_tog..." +QT_MOC_LITERAL(17, 323, 4), // "arg1" +QT_MOC_LITERAL(18, 328, 38) // "on_actionSecure_Boot_Support_..." + + }, + "Ventoy2DiskWindow\0thread_event\0\0msg\0" + "data\0part_style_check_action\0QAction*\0" + "act\0lang_check_action\0on_ButtonInstall_clicked\0" + "on_ButtonUpdate_clicked\0" + "on_ButtonRefresh_clicked\0" + "on_comboBoxDevice_currentIndexChanged\0" + "index\0on_actionPartition_Configuration_triggered\0" + "on_actionClear_Ventoy_triggered\0" + "on_actionShow_All_Devices_toggled\0" + "arg1\0on_actionSecure_Boot_Support_triggered" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Ventoy2DiskWindow[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 11, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 2, 69, 2, 0x08 /* Private */, + 5, 1, 74, 2, 0x08 /* Private */, + 8, 1, 77, 2, 0x08 /* Private */, + 9, 0, 80, 2, 0x08 /* Private */, + 10, 0, 81, 2, 0x08 /* Private */, + 11, 0, 82, 2, 0x08 /* Private */, + 12, 1, 83, 2, 0x08 /* Private */, + 14, 0, 86, 2, 0x08 /* Private */, + 15, 0, 87, 2, 0x08 /* Private */, + 16, 1, 88, 2, 0x08 /* Private */, + 18, 0, 91, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 13, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 17, + QMetaType::Void, + + 0 // eod +}; + +void Ventoy2DiskWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + Ventoy2DiskWindow *_t = static_cast(_o); + Q_UNUSED(_t) + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->part_style_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 2: _t->lang_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 3: _t->on_ButtonInstall_clicked(); break; + case 4: _t->on_ButtonUpdate_clicked(); break; + case 5: _t->on_ButtonRefresh_clicked(); break; + case 6: _t->on_comboBoxDevice_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 7: _t->on_actionPartition_Configuration_triggered(); break; + case 8: _t->on_actionClear_Ventoy_triggered(); break; + case 9: _t->on_actionShow_All_Devices_toggled((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 10: _t->on_actionSecure_Boot_Support_triggered(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 1: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + case 2: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +const QMetaObject Ventoy2DiskWindow::staticMetaObject = { + { &QMainWindow::staticMetaObject, qt_meta_stringdata_Ventoy2DiskWindow.data, + qt_meta_data_Ventoy2DiskWindow, qt_static_metacall, nullptr, nullptr} +}; + + +const QMetaObject *Ventoy2DiskWindow::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Ventoy2DiskWindow::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_Ventoy2DiskWindow.stringdata0)) + return static_cast(const_cast< Ventoy2DiskWindow*>(this)); + return QMainWindow::qt_metacast(_clname); +} + +int Ventoy2DiskWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 11) + qt_static_metacall(this, _c, _id, _a); + _id -= 11; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 11) + qt_static_metacall(this, _c, _id, _a); + _id -= 11; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/LinuxGUI/Ventoy2Disk/QT/build/ui_partcfgdialog.h b/LinuxGUI/Ventoy2Disk/QT/build/ui_partcfgdialog.h new file mode 100644 index 00000000..e0244c95 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/ui_partcfgdialog.h @@ -0,0 +1,113 @@ +/******************************************************************************** +** Form generated from reading UI file 'partcfgdialog.ui' +** +** Created by: Qt User Interface Compiler version 5.9.0 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_PARTCFGDIALOG_H +#define UI_PARTCFGDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PartCfgDialog +{ +public: + QPushButton *pushButtonOK; + QPushButton *pushButtonCancel; + QGroupBox *groupBox; + QCheckBox *checkBox; + QGroupBox *groupBox_2; + QLineEdit *lineEdit; + QGroupBox *groupBox_3; + QComboBox *comboBox; + QGroupBox *groupBox_4; + QCheckBox *checkBox_2; + + void setupUi(QDialog *PartCfgDialog) + { + if (PartCfgDialog->objectName().isEmpty()) + PartCfgDialog->setObjectName(QStringLiteral("PartCfgDialog")); + PartCfgDialog->resize(420, 258); + pushButtonOK = new QPushButton(PartCfgDialog); + pushButtonOK->setObjectName(QStringLiteral("pushButtonOK")); + pushButtonOK->setGeometry(QRect(90, 210, 90, 30)); + pushButtonCancel = new QPushButton(PartCfgDialog); + pushButtonCancel->setObjectName(QStringLiteral("pushButtonCancel")); + pushButtonCancel->setGeometry(QRect(230, 210, 90, 30)); + groupBox = new QGroupBox(PartCfgDialog); + groupBox->setObjectName(QStringLiteral("groupBox")); + groupBox->setGeometry(QRect(10, 0, 400, 61)); + checkBox = new QCheckBox(groupBox); + checkBox->setObjectName(QStringLiteral("checkBox")); + checkBox->setGeometry(QRect(10, 20, 381, 41)); + checkBox->setAutoRepeatInterval(0); + groupBox_2 = new QGroupBox(PartCfgDialog); + groupBox_2->setObjectName(QStringLiteral("groupBox_2")); + groupBox_2->setGeometry(QRect(10, 60, 200, 61)); + lineEdit = new QLineEdit(groupBox_2); + lineEdit->setObjectName(QStringLiteral("lineEdit")); + lineEdit->setGeometry(QRect(10, 30, 181, 26)); + lineEdit->setMaxLength(14); + groupBox_3 = new QGroupBox(PartCfgDialog); + groupBox_3->setObjectName(QStringLiteral("groupBox_3")); + groupBox_3->setGeometry(QRect(210, 60, 200, 60)); + comboBox = new QComboBox(groupBox_3); + comboBox->setObjectName(QStringLiteral("comboBox")); + comboBox->setGeometry(QRect(10, 30, 181, 26)); + groupBox_4 = new QGroupBox(PartCfgDialog); + groupBox_4->setObjectName(QStringLiteral("groupBox_4")); + groupBox_4->setGeometry(QRect(10, 120, 401, 61)); + checkBox_2 = new QCheckBox(groupBox_4); + checkBox_2->setObjectName(QStringLiteral("checkBox_2")); + checkBox_2->setGeometry(QRect(10, 30, 381, 24)); + checkBox_2->setChecked(true); + + retranslateUi(PartCfgDialog); + + comboBox->setCurrentIndex(1); + + + QMetaObject::connectSlotsByName(PartCfgDialog); + } // setupUi + + void retranslateUi(QDialog *PartCfgDialog) + { + PartCfgDialog->setWindowTitle(QApplication::translate("PartCfgDialog", "Partition Configuration", Q_NULLPTR)); + pushButtonOK->setText(QApplication::translate("PartCfgDialog", "OK", Q_NULLPTR)); + pushButtonCancel->setText(QApplication::translate("PartCfgDialog", "Cancel", Q_NULLPTR)); + groupBox->setTitle(QString()); + checkBox->setText(QApplication::translate("PartCfgDialog", "Preserve some space at the end of the disk", Q_NULLPTR)); + groupBox_2->setTitle(QString()); + groupBox_3->setTitle(QString()); + comboBox->clear(); + comboBox->insertItems(0, QStringList() + << QApplication::translate("PartCfgDialog", "MB", Q_NULLPTR) + << QApplication::translate("PartCfgDialog", "GB", Q_NULLPTR) + ); + groupBox_4->setTitle(QString()); + checkBox_2->setText(QApplication::translate("PartCfgDialog", "Align partitions with 4KB", Q_NULLPTR)); + } // retranslateUi + +}; + +namespace Ui { + class PartCfgDialog: public Ui_PartCfgDialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_PARTCFGDIALOG_H diff --git a/LinuxGUI/Ventoy2Disk/QT/build/ui_ventoy2diskwindow.h b/LinuxGUI/Ventoy2Disk/QT/build/ui_ventoy2diskwindow.h new file mode 100644 index 00000000..57eceef1 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/build/ui_ventoy2diskwindow.h @@ -0,0 +1,202 @@ +/******************************************************************************** +** Form generated from reading UI file 'ventoy2diskwindow.ui' +** +** Created by: Qt User Interface Compiler version 5.9.0 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_VENTOY2DISKWINDOW_H +#define UI_VENTOY2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Ventoy2DiskWindow +{ +public: + QAction *actionSecure_Boot_Support; + QAction *actionMBR; + QAction *actionGPT; + QAction *actionPartition_Configuration; + QAction *actionClear_Ventoy; + QAction *actionShow_All_Devices; + QWidget *centralwidget; + QGroupBox *groupBoxDevice; + QComboBox *comboBoxDevice; + QPushButton *ButtonRefresh; + QGroupBox *groupBoxVentoyLocal; + QLabel *labelVentoyLocalVer; + QLabel *labelVentoyLocalPartStyle; + QLabel *labelVentoyLocalSecure; + QGroupBox *groupBoxVentoyDevice; + QLabel *labelVentoyDeviceVer; + QLabel *labelVentoyDevicePartStyle; + QLabel *labelVentoyDeviceSecure; + QGroupBox *groupBoxStatus; + QProgressBar *progressBar; + QPushButton *ButtonInstall; + QPushButton *ButtonUpdate; + QMenuBar *menubar; + QMenu *menuOption; + QMenu *menuPartition_Style; + QMenu *menuLanguage; + + void setupUi(QMainWindow *Ventoy2DiskWindow) + { + if (Ventoy2DiskWindow->objectName().isEmpty()) + Ventoy2DiskWindow->setObjectName(QStringLiteral("Ventoy2DiskWindow")); + Ventoy2DiskWindow->resize(441, 367); + actionSecure_Boot_Support = new QAction(Ventoy2DiskWindow); + actionSecure_Boot_Support->setObjectName(QStringLiteral("actionSecure_Boot_Support")); + actionSecure_Boot_Support->setCheckable(true); + actionMBR = new QAction(Ventoy2DiskWindow); + actionMBR->setObjectName(QStringLiteral("actionMBR")); + actionMBR->setCheckable(true); + actionGPT = new QAction(Ventoy2DiskWindow); + actionGPT->setObjectName(QStringLiteral("actionGPT")); + actionGPT->setCheckable(true); + actionPartition_Configuration = new QAction(Ventoy2DiskWindow); + actionPartition_Configuration->setObjectName(QStringLiteral("actionPartition_Configuration")); + actionClear_Ventoy = new QAction(Ventoy2DiskWindow); + actionClear_Ventoy->setObjectName(QStringLiteral("actionClear_Ventoy")); + actionShow_All_Devices = new QAction(Ventoy2DiskWindow); + actionShow_All_Devices->setObjectName(QStringLiteral("actionShow_All_Devices")); + actionShow_All_Devices->setCheckable(true); + centralwidget = new QWidget(Ventoy2DiskWindow); + centralwidget->setObjectName(QStringLiteral("centralwidget")); + groupBoxDevice = new QGroupBox(centralwidget); + groupBoxDevice->setObjectName(QStringLiteral("groupBoxDevice")); + groupBoxDevice->setGeometry(QRect(10, 10, 421, 80)); + comboBoxDevice = new QComboBox(groupBoxDevice); + comboBoxDevice->setObjectName(QStringLiteral("comboBoxDevice")); + comboBoxDevice->setGeometry(QRect(10, 40, 361, 26)); + ButtonRefresh = new QPushButton(groupBoxDevice); + ButtonRefresh->setObjectName(QStringLiteral("ButtonRefresh")); + ButtonRefresh->setGeometry(QRect(380, 37, 30, 30)); + QIcon icon; + icon.addFile(QStringLiteral("../refresh.ico"), QSize(), QIcon::Normal, QIcon::Off); + ButtonRefresh->setIcon(icon); + ButtonRefresh->setIconSize(QSize(24, 24)); + groupBoxVentoyLocal = new QGroupBox(centralwidget); + groupBoxVentoyLocal->setObjectName(QStringLiteral("groupBoxVentoyLocal")); + groupBoxVentoyLocal->setGeometry(QRect(10, 100, 205, 80)); + groupBoxVentoyLocal->setAlignment(Qt::AlignCenter); + labelVentoyLocalVer = new QLabel(groupBoxVentoyLocal); + labelVentoyLocalVer->setObjectName(QStringLiteral("labelVentoyLocalVer")); + labelVentoyLocalVer->setGeometry(QRect(30, 30, 135, 41)); + labelVentoyLocalVer->setAlignment(Qt::AlignCenter); + labelVentoyLocalPartStyle = new QLabel(groupBoxVentoyLocal); + labelVentoyLocalPartStyle->setObjectName(QStringLiteral("labelVentoyLocalPartStyle")); + labelVentoyLocalPartStyle->setGeometry(QRect(172, 60, 31, 18)); + labelVentoyLocalSecure = new QLabel(groupBoxVentoyLocal); + labelVentoyLocalSecure->setObjectName(QStringLiteral("labelVentoyLocalSecure")); + labelVentoyLocalSecure->setGeometry(QRect(12, 36, 21, 31)); + labelVentoyLocalSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxVentoyDevice = new QGroupBox(centralwidget); + groupBoxVentoyDevice->setObjectName(QStringLiteral("groupBoxVentoyDevice")); + groupBoxVentoyDevice->setGeometry(QRect(225, 100, 205, 80)); + groupBoxVentoyDevice->setAlignment(Qt::AlignCenter); + labelVentoyDeviceVer = new QLabel(groupBoxVentoyDevice); + labelVentoyDeviceVer->setObjectName(QStringLiteral("labelVentoyDeviceVer")); + labelVentoyDeviceVer->setGeometry(QRect(30, 30, 135, 41)); + labelVentoyDeviceVer->setAlignment(Qt::AlignCenter); + labelVentoyDevicePartStyle = new QLabel(groupBoxVentoyDevice); + labelVentoyDevicePartStyle->setObjectName(QStringLiteral("labelVentoyDevicePartStyle")); + labelVentoyDevicePartStyle->setGeometry(QRect(172, 60, 31, 18)); + labelVentoyDeviceSecure = new QLabel(groupBoxVentoyDevice); + labelVentoyDeviceSecure->setObjectName(QStringLiteral("labelVentoyDeviceSecure")); + labelVentoyDeviceSecure->setGeometry(QRect(12, 36, 21, 31)); + labelVentoyDeviceSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QStringLiteral("groupBoxStatus")); + groupBoxStatus->setGeometry(QRect(10, 190, 421, 61)); + progressBar = new QProgressBar(groupBoxStatus); + progressBar->setObjectName(QStringLiteral("progressBar")); + progressBar->setGeometry(QRect(10, 30, 401, 23)); + progressBar->setValue(0); + progressBar->setTextVisible(false); + ButtonInstall = new QPushButton(centralwidget); + ButtonInstall->setObjectName(QStringLiteral("ButtonInstall")); + ButtonInstall->setGeometry(QRect(90, 275, 101, 41)); + ButtonUpdate = new QPushButton(centralwidget); + ButtonUpdate->setObjectName(QStringLiteral("ButtonUpdate")); + ButtonUpdate->setGeometry(QRect(250, 275, 101, 41)); + Ventoy2DiskWindow->setCentralWidget(centralwidget); + menubar = new QMenuBar(Ventoy2DiskWindow); + menubar->setObjectName(QStringLiteral("menubar")); + menubar->setGeometry(QRect(0, 0, 441, 23)); + menuOption = new QMenu(menubar); + menuOption->setObjectName(QStringLiteral("menuOption")); + menuPartition_Style = new QMenu(menuOption); + menuPartition_Style->setObjectName(QStringLiteral("menuPartition_Style")); + menuLanguage = new QMenu(menubar); + menuLanguage->setObjectName(QStringLiteral("menuLanguage")); + Ventoy2DiskWindow->setMenuBar(menubar); + + menubar->addAction(menuOption->menuAction()); + menubar->addAction(menuLanguage->menuAction()); + menuOption->addAction(actionSecure_Boot_Support); + menuOption->addAction(menuPartition_Style->menuAction()); + menuOption->addAction(actionPartition_Configuration); + menuOption->addAction(actionClear_Ventoy); + menuOption->addAction(actionShow_All_Devices); + menuPartition_Style->addAction(actionMBR); + menuPartition_Style->addAction(actionGPT); + + retranslateUi(Ventoy2DiskWindow); + + QMetaObject::connectSlotsByName(Ventoy2DiskWindow); + } // setupUi + + void retranslateUi(QMainWindow *Ventoy2DiskWindow) + { + Ventoy2DiskWindow->setWindowTitle(QApplication::translate("Ventoy2DiskWindow", "Ventoy2Disk", Q_NULLPTR)); + actionSecure_Boot_Support->setText(QApplication::translate("Ventoy2DiskWindow", "Secure Boot Support", Q_NULLPTR)); + actionMBR->setText(QApplication::translate("Ventoy2DiskWindow", "MBR", Q_NULLPTR)); + actionGPT->setText(QApplication::translate("Ventoy2DiskWindow", "GPT", Q_NULLPTR)); + actionPartition_Configuration->setText(QApplication::translate("Ventoy2DiskWindow", "Partition Configuration", Q_NULLPTR)); + actionClear_Ventoy->setText(QApplication::translate("Ventoy2DiskWindow", "Clear Ventoy", Q_NULLPTR)); + actionShow_All_Devices->setText(QApplication::translate("Ventoy2DiskWindow", "Show All Devices", Q_NULLPTR)); + groupBoxDevice->setTitle(QApplication::translate("Ventoy2DiskWindow", "Device", Q_NULLPTR)); + ButtonRefresh->setText(QString()); + groupBoxVentoyLocal->setTitle(QApplication::translate("Ventoy2DiskWindow", "Ventoy In Package", Q_NULLPTR)); + labelVentoyLocalVer->setText(QApplication::translate("Ventoy2DiskWindow", "

1.0.53

", Q_NULLPTR)); + labelVentoyLocalPartStyle->setText(QApplication::translate("Ventoy2DiskWindow", "

MBR

", Q_NULLPTR)); + labelVentoyLocalSecure->setText(QString()); + groupBoxVentoyDevice->setTitle(QApplication::translate("Ventoy2DiskWindow", "Ventoy In Device", Q_NULLPTR)); + labelVentoyDeviceVer->setText(QApplication::translate("Ventoy2DiskWindow", "

1.0.52

", Q_NULLPTR)); + labelVentoyDevicePartStyle->setText(QApplication::translate("Ventoy2DiskWindow", "

GPT

", Q_NULLPTR)); + labelVentoyDeviceSecure->setText(QString()); + groupBoxStatus->setTitle(QApplication::translate("Ventoy2DiskWindow", "Status: REDAY", Q_NULLPTR)); + progressBar->setFormat(QString()); + ButtonInstall->setText(QApplication::translate("Ventoy2DiskWindow", "Install", Q_NULLPTR)); + ButtonUpdate->setText(QApplication::translate("Ventoy2DiskWindow", "Update", Q_NULLPTR)); + menuOption->setTitle(QApplication::translate("Ventoy2DiskWindow", "Option", Q_NULLPTR)); + menuPartition_Style->setTitle(QApplication::translate("Ventoy2DiskWindow", "Partition Style", Q_NULLPTR)); + menuLanguage->setTitle(QApplication::translate("Ventoy2DiskWindow", "Language", Q_NULLPTR)); + } // retranslateUi + +}; + +namespace Ui { + class Ventoy2DiskWindow: public Ui_Ventoy2DiskWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_VENTOY2DISKWINDOW_H diff --git a/LinuxGUI/Ventoy2Disk/QT/main.cpp b/LinuxGUI/Ventoy2Disk/QT/main.cpp new file mode 100644 index 00000000..60e6281e --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/main.cpp @@ -0,0 +1,121 @@ +#include "ventoy2diskwindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "ventoy_define.h" +#include "ventoy_util.h" +#include "ventoy_qt.h" +} + +using namespace std; + +char g_log_file[4096]; +char g_ini_file[4096]; + +int main(int argc, char *argv[]) +{ + int ret; + long long size; + QApplication a(argc, argv); + Ventoy2DiskWindow w; + +#ifdef QT_CHECK_EUID + if (geteuid() != 0) + { + QMessageBox::critical(NULL, "Error", "Permission denied!\nPlease run with root privileges."); + return 1; + } +#endif + + if (!QFileInfo::exists("./boot/boot.img")) + { + QString curdir = a.applicationDirPath(); + int index = curdir.indexOf("/tool/"); + + if (index >= 0) + { + QDir::setCurrent(curdir.left(index)); + } + else + { + QDir::setCurrent(curdir); + } + } + + if (!QFileInfo::exists("./boot/boot.img")) + { + QMessageBox::critical(NULL, "Error", "Please run under the correct directory."); + return 1; + } + + ventoy_log_init(); + + snprintf(g_log_file, sizeof(g_log_file), "./log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Ventoy2Disk.ini"); + for (int i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + QFileInfo Info(g_log_file); + size = (long long)Info.size(); + if (size >= 4 * SIZE_1MB) + { + QFile::remove(g_log_file); + } + + vlog("===================================================\n"); + vlog("===== Ventoy2Disk %s powered by QT %s =====\n", ventoy_get_local_version(), qVersion()); + vlog("===================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)size); + vlog("ini file is <%s>\n", g_ini_file); + + ventoy_disk_init(); + ventoy_http_init(); + + w.setGeometry(QStyle::alignedRect(Qt::LeftToRight, + Qt::AlignCenter, + w.size(), + a.desktop()->availableGeometry())); + + QPixmap pix; + QIcon icon; + int len; + const uchar *data; + + data = (const uchar *)get_window_icon_raw_data(&len); + pix.loadFromData(data, len); + icon.addPixmap(pix); + w.setWindowIcon(icon); + + w.show(); + w.setFixedSize(w.size()); + + ret = a.exec(); + + ventoy_disk_exit(); + ventoy_http_exit(); + + vlog("######## Ventoy2Disk QT %s exit ########\n", ventoy_get_local_version()); + + /* log exit must at the end */ + ventoy_log_exit(); + + return ret; +} diff --git a/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.cpp b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.cpp new file mode 100644 index 00000000..c232b8ac --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.cpp @@ -0,0 +1,101 @@ +#include "partcfgdialog.h" +#include "ui_partcfgdialog.h" +#include +#include + +PartCfgDialog::PartCfgDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PartCfgDialog) +{ + reserve = false; + unit = 1; + align = true; + valuestr = ""; + resvalue = 0; + + ui->setupUi(this); + + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); +} + +PartCfgDialog::~PartCfgDialog() +{ + delete ui; +} + +void PartCfgDialog::update_ui_status() +{ + ui->checkBox->setChecked(reserve); + ui->lineEdit->setEnabled(reserve); + ui->comboBox->setEnabled(reserve); + ui->checkBox_2->setChecked(align); +} + +void PartCfgDialog::update_language_ui(QJsonObject &obj) +{ + ui->checkBox->setText(_LANG_STR("STR_PRESERVE_SPACE")); + ui->checkBox_2->setText(_LANG_STR("STR_PART_ALIGN_4KB")); + ui->pushButtonOK->setText(_LANG_STR("STR_BTN_OK")); + ui->pushButtonCancel->setText(_LANG_STR("STR_BTN_CANCEL")); + + invalid_value = _LANG_STR("STR_SPACE_VAL_INVALID"); + err_title = _LANG_STR("STR_ERROR"); +} + +void PartCfgDialog::on_pushButtonOK_clicked() +{ + if (ui->checkBox->isChecked()) + { + QString str = ui->lineEdit->text(); + + if (str.isEmpty()) + { + QMessageBox::critical(NULL, err_title, invalid_value); + return; + } + + for (int i = 0; i < str.size(); i++) + { + if (str[i] < '0' || str[i] > '9') + { + QMessageBox::critical(NULL, err_title, invalid_value); + return; + } + } + + valuestr = str; + resvalue = str.toLongLong(); + reserve = true; + } + else + { + reserve = false; + } + + align = ui->checkBox_2->isChecked(); + unit = ui->comboBox->currentIndex(); + + accept(); +} + +void PartCfgDialog::on_pushButtonCancel_clicked() +{ + reject(); +} + +void PartCfgDialog::on_checkBox_stateChanged(int arg1) +{ + (void)arg1; + + if (ui->checkBox->isChecked()) + { + ui->lineEdit->setEnabled(true); + ui->comboBox->setEnabled(true); + } + else + { + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); + } +} diff --git a/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.h b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.h new file mode 100644 index 00000000..c57a9ae1 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.h @@ -0,0 +1,44 @@ +#ifndef PARTCFGDIALOG_H +#define PARTCFGDIALOG_H + +#include +#include + +namespace Ui { +class PartCfgDialog; +} + +class PartCfgDialog : public QDialog +{ + Q_OBJECT + +public: + + bool reserve; + int unit; + bool align; + QString valuestr; + qint64 resvalue; + + QString invalid_value; + QString err_title; + void update_ui_status(); + void update_language_ui(QJsonObject &obj); + + explicit PartCfgDialog(QWidget *parent = nullptr); + ~PartCfgDialog(); + +private slots: + void on_pushButtonOK_clicked(); + + void on_pushButtonCancel_clicked(); + + void on_checkBox_stateChanged(int arg1); + +private: + Ui::PartCfgDialog *ui; +}; + +#define _LANG_STR(id) obj.value(id).toString() + +#endif // PARTCFGDIALOG_H diff --git a/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.ui b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.ui new file mode 100644 index 00000000..fd131b8c --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/partcfgdialog.ui @@ -0,0 +1,165 @@ + + + PartCfgDialog + + + + 0 + 0 + 420 + 258 + + + + Partition Configuration + + + + + 90 + 210 + 90 + 30 + + + + OK + + + + + + 230 + 210 + 90 + 30 + + + + Cancel + + + + + + 10 + 10 + 400 + 51 + + + + + + + + + 10 + 10 + 381 + 41 + + + + Preserve some space at the end of the disk + + + 0 + + + + + + + 10 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 14 + + + + + + + 210 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 1 + + + + MB + + + + + GB + + + + + + + + 10 + 130 + 401 + 51 + + + + + + + + + 10 + 18 + 381 + 24 + + + + Align partitions with 4KB + + + true + + + + + + + diff --git a/LinuxGUI/Ventoy2Disk/QT/refresh_icon_data.c b/LinuxGUI/Ventoy2Disk/QT/refresh_icon_data.c new file mode 100644 index 00000000..0b678ff5 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/LinuxGUI/Ventoy2Disk/QT/secure_icon_data.c b/LinuxGUI/Ventoy2Disk/QT/secure_icon_data.c new file mode 100644 index 00000000..d72c8472 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.cpp b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.cpp new file mode 100644 index 00000000..eac24eb8 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.cpp @@ -0,0 +1,881 @@ +#include "ventoy2diskwindow.h" +#include "ui_ventoy2diskwindow.h" +#include "partcfgdialog.h" + +#include + +extern "C" { +#include "ventoy_define.h" +#include "ventoy_util.h" +#include "ventoy_disk.h" +#include "ventoy_json.h" +#include "ventoy_http.h" +#include "ventoy_qt.h" +} + +MyQThread::MyQThread(QObject *parent) : QThread(parent) +{ + m_index = -1; + m_type = 0; + m_running = false; +} + +void MyQThread::install_run() +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + char disk_name[32]; + ventoy_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(dec, sizeof(dec), "%llu", (unsigned long long)m_reserve_space); + + buflen = sizeof(buf); + VTOY_JSON_FMT_BEGIN(pos, buf, buflen); + VTOY_JSON_FMT_OBJ_BEGIN(); + VTOY_JSON_FMT_STRN("method", "install"); + VTOY_JSON_FMT_STRN("disk", disk_name); + VTOY_JSON_FMT_STRN("reserve_space", dec); + VTOY_JSON_FMT_UINT("partstyle", ventoy_code_get_cur_part_style()); + VTOY_JSON_FMT_UINT("secure_boot", m_secureboot); + VTOY_JSON_FMT_UINT("align_4kb", m_align4K); + VTOY_JSON_FMT_OBJ_END(); + VTOY_JSON_FMT_END(pos); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = ventoy_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_INSTALL_FINISH, ret); + m_running = false; +} + +void MyQThread::update_run() +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + char disk_name[32]; + ventoy_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", disk_name, m_secureboot); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = ventoy_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_UPDATE_FINISH, ret); + m_running = false; +} + +void MyQThread::run() +{ + if (THREAD_TYPE_INSTALL == m_type) + { + install_run(); + } + else if (THREAD_TYPE_UPDATE == m_type) + { + update_run(); + } + else + { + + } +} + + +Ventoy2DiskWindow::Ventoy2DiskWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::Ventoy2DiskWindow) +{ + m_partcfg = new PartCfgDialog(); + m_part_group = new QActionGroup(this); + m_lang_group = new QActionGroup(this); + m_thread = new MyQThread(this); + + ui->setupUi(this); +} + +Ventoy2DiskWindow::~Ventoy2DiskWindow() +{ + delete m_partcfg; + delete m_part_group; + delete m_lang_group; + delete m_thread; + delete ui; +} + +bool LangCompare(const QString &s1, const QString &s2) +{ + if (true == s1.startsWith("Chinese Simplified") && false == s2.startsWith("Chinese Simplified")) + { + return true; + } + else if (false == s1.startsWith("Chinese Simplified") && true == s2.startsWith("Chinese Simplified")) + { + return false; + } + else + { + return s1 < s2; + } +} + +int Ventoy2DiskWindow::lang_string(const QString &id, QString &str) +{ + QString cur = ventoy_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + str = p->toObject().value(id).toString(); + str = str.replace("#@", "\r\n"); + return 0; + } + } + + return 1; +} + +void Ventoy2DiskWindow::update_ui_language() +{ + QString dev; + QJsonObject obj; + QString cur = ventoy_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + obj = p->toObject(); + break; + } + } + + ui->menuOption->setTitle(_LANG_STR("STR_MENU_OPTION")); + ui->actionSecure_Boot_Support->setText(_LANG_STR("STR_MENU_SECURE_BOOT")); + ui->menuPartition_Style->setTitle(_LANG_STR("STR_MENU_PART_STYLE")); + ui->actionPartition_Configuration->setText(_LANG_STR("STR_MENU_PART_CFG")); + ui->actionClear_Ventoy->setText(_LANG_STR("STR_MENU_CLEAR")); + ui->actionShow_All_Devices->setText(_LANG_STR("STR_SHOW_ALL_DEV")); + + dev = _LANG_STR("STR_DEVICE"); + if (m_partcfg->reserve) + { + QString str; + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + + ui->groupBoxVentoyLocal->setTitle(_LANG_STR("STR_LOCAL_VER")); + ui->groupBoxVentoyDevice->setTitle(_LANG_STR("STR_DISK_VER")); + ui->groupBoxStatus->setTitle(_LANG_STR("STR_STATUS")); + ui->ButtonInstall->setText(_LANG_STR("STR_INSTALL")); + ui->ButtonUpdate->setText(_LANG_STR("STR_UPDATE")); + m_partcfg->update_language_ui(obj); + m_partcfg->setWindowTitle(_LANG_STR("STR_MENU_PART_CFG")); +} + +void Ventoy2DiskWindow::lang_check_action(QAction *act) +{ + ventoy_code_set_cur_language(act->text().toStdString().c_str()); + update_ui_language(); +} + +void Ventoy2DiskWindow::LoadLanguages() +{ + QString curlang = ventoy_code_get_cur_language(); + if (curlang.isEmpty()) + { + QString LANG = qgetenv("LANG"); + if (LANG.startsWith("zh_CN")) + { + ventoy_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + ventoy_code_set_cur_language("English (English)"); + } + curlang = ventoy_code_get_cur_language(); + } + + + QFile inFile("./tool/languages.json"); + inFile.open(QIODevice::ReadOnly|QIODevice::Text); + QByteArray data = inFile.readAll(); + inFile.close(); + + QJsonParseError errorPtr; + QJsonDocument doc = QJsonDocument::fromJson(data, &errorPtr); + + m_lang_array = doc.array(); + QVector List; + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + List.push_back(p->toObject().value("name").toString()); + } + + connect(m_lang_group, SIGNAL(triggered(QAction *)), this, SLOT(lang_check_action(QAction *))); + + std::sort(List.begin(), List.end(), LangCompare); + + for (QVector::iterator p = List.begin(); p != List.end(); p++) + { + QAction *action = new QAction(*p, m_lang_group); + action->setCheckable(true); + + if (p->compare(curlang) == 0) + { + action->setChecked(true); + m_lang_group->triggered(action); + } + + ui->menuLanguage->addAction(action); + } + + +} + +void Ventoy2DiskWindow::part_style_check_action(QAction *action) +{ + int style = 0; + + if (action->text() == "MBR") + { + style = 0; + ui->labelVentoyLocalPartStyle->setText("MBR"); + } + else + { + style = 1; + ui->labelVentoyLocalPartStyle->setText("GPT"); + } + + if (style != ventoy_code_get_cur_part_style()) + { + ventoy_code_set_cur_part_style(style); + } +} + +static ventoy_disk *select_active_dev(const QString &select, int *activeid) +{ + int i; + int alldev = ventoy_code_get_cur_show_all(); + ventoy_disk *cur = NULL; + + /* find the match one */ + if (!select.isEmpty()) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (select.compare(cur->disk_name) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Ventoy */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (cur->vtoydata.ventoy_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + if (cur->type == VTOY_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + + +void Ventoy2DiskWindow::FillDeviceList(const QString &select) +{ + int active; + int count = 0; + int alldev = ventoy_code_get_cur_show_all(); + ventoy_disk *cur; + + ui->comboBoxDevice->clear(); + + for (int i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != VTOY_DEVICE_USB) + { + continue; + } + + QString item; + item.sprintf("%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + ui->comboBoxDevice->addItem(item); + count++; + } + + cur = select_active_dev(select, &active); + if (cur) + { + vlog("combox count:%d, active:%s id:%d\n", count, cur->disk_name, active); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(cur->vtoydata.ventoy_valid); + ui->comboBoxDevice->setCurrentIndex(active); + } + else + { + vlog("combox count:%d, no active id\n", count); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + } +} + + +void Ventoy2DiskWindow::OnInitWindow(void) +{ + int len; + const uchar *data; + QIcon icon; + QPixmap pix1; + QPixmap pix2; + char ver[512]; + + ui->labelVentoyLocalSecure->hide(); + + m_part_group->addAction(ui->actionMBR); + m_part_group->addAction(ui->actionGPT); + connect(m_part_group, SIGNAL(triggered(QAction *)), this, SLOT(part_style_check_action(QAction *))); + + if (ventoy_code_get_cur_part_style()) + { + ui->actionGPT->setChecked(true); + m_part_group->triggered(ui->actionGPT); + } + else + { + ui->actionMBR->setChecked(true); + m_part_group->triggered(ui->actionMBR); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, ventoy_get_local_version()); + ui->labelVentoyLocalVer->setText(QApplication::translate("Ventoy2DiskWindow", ver, nullptr)); + + LoadLanguages(); + + data = (const uchar *)get_refresh_icon_raw_data(&len); + pix1.loadFromData(data, len); + icon.addPixmap(pix1); + ui->ButtonRefresh->setIcon(icon); + + data = (const uchar *)get_secure_icon_raw_data(&len); + pix2.loadFromData(data, len); + ui->labelVentoyLocalSecure->setPixmap(pix2); + ui->labelVentoyDeviceSecure->setPixmap(pix2); + + ui->labelVentoyDeviceSecure->setHidden(true); + ui->labelVentoyDeviceVer->setText(""); + ui->labelVentoyDevicePartStyle->setText(""); + + ui->actionShow_All_Devices->setChecked(ventoy_code_get_cur_show_all()); + + connect(m_thread, &MyQThread::thread_event, this, &Ventoy2DiskWindow::thread_event); + + FillDeviceList(""); +} + +void Ventoy2DiskWindow::showEvent(QShowEvent *ev) +{ + QMainWindow::showEvent(ev); + OnInitWindow(); +} + +void Ventoy2DiskWindow::on_ButtonInstall_clicked() +{ + int index; + quint64 size = 0, space = 0; + ventoy_disk *cur; + QString title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + + if (m_thread->m_running || ventoy_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(NULL, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentIndex(); + if (index < 0 || index > g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (ventoy_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + lang_string("STR_DISK_2TB_MBR_ERROR", msg); + QMessageBox::critical(NULL, title_err, msg); + return; + } + + if (m_partcfg->reserve) + { + size = cur->size_in_byte / SIZE_1MB; + space = m_partcfg->resvalue; + if (m_partcfg->unit == 1) + { + space = m_partcfg->resvalue * 1024; + } + + if (size <= space || (size - space) <= VTOYEFI_PART_BYTES / SIZE_1MB) + { + lang_string("STR_SPACE_VAL_INVALID", msg); + QMessageBox::critical(NULL, title_err, msg); + vlog("reserved space too big.\n"); + return; + } + } + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(NULL, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(NULL, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonRefresh->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_INSTALL; + m_thread->m_index = index; + m_thread->m_reserve_space = space * SIZE_1MB; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + m_thread->m_align4K = m_partcfg->align; + m_thread->m_running = true; + + m_thread->start(); +} + +void Ventoy2DiskWindow::on_ButtonUpdate_clicked() +{ + int index; + ventoy_disk *cur; + QString title_info, title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || ventoy_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(NULL, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentIndex(); + if (index < 0 || index > g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->vtoydata.ventoy_valid == 0) + { + vlog("invalid ventoy version"); + return; + } + + lang_string("STR_UPDATE_TIP", msg); + if (QMessageBox::Yes != QMessageBox::information(NULL, title_info, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonRefresh->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_UPDATE; + m_thread->m_index = index; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + + m_thread->m_running = true; + m_thread->start(); +} + +void Ventoy2DiskWindow::on_ButtonRefresh_clicked() +{ + QString title_warn, msg; + + if (m_thread->m_running || ventoy_code_is_busy()) + { + lang_string("STR_WARNING", title_warn); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(NULL, title_warn, msg); + return; + } + + ventoy_code_refresh_device(); + FillDeviceList(""); +} + +void Ventoy2DiskWindow::on_comboBoxDevice_currentIndexChanged(int index) +{ + char ver[512]; + ventoy_disk *cur; + + ui->labelVentoyDeviceSecure->setHidden(true); + ui->labelVentoyDeviceVer->setText(""); + ui->labelVentoyDevicePartStyle->setText(""); + + if (index < 0 || index > g_disk_num) + { + vlog("invalid combobox index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->vtoydata.ventoy_valid) + { + if (cur->vtoydata.secure_boot_flag) + { + ui->labelVentoyDeviceSecure->setHidden(false); + } + else + { + ui->labelVentoyDeviceSecure->setHidden(true); + } + + if ((int)(ui->actionSecure_Boot_Support->isChecked()) != cur->vtoydata.secure_boot_flag) + { + ui->actionSecure_Boot_Support->trigger(); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, cur->vtoydata.ventoy_ver); + ui->labelVentoyDeviceVer->setText(QApplication::translate("Ventoy2DiskWindow", ver, nullptr)); + ui->labelVentoyDevicePartStyle->setText(cur->vtoydata.partition_style ? "GPT" : "MBR"); + } + else + { + if (ui->actionSecure_Boot_Support->isChecked()) + { + ui->actionSecure_Boot_Support->trigger(); + } + } +} + +void Ventoy2DiskWindow::on_actionPartition_Configuration_triggered() +{ + m_partcfg->update_ui_status(); + if (QDialog::Accepted == m_partcfg->exec()) + { + QString str; + QString dev; + lang_string("STR_DEVICE", dev); + + if (m_partcfg->reserve) + { + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + } +} + +void Ventoy2DiskWindow::on_actionClear_Ventoy_triggered() +{ + int ret; + int index; + ventoy_disk *cur; + QString title_err, title_warn, title_info, msg; + char disk_name[64]; + char buf[256]; + char out[256]; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || ventoy_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(NULL, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentIndex(); + if (index < 0 || index > g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(NULL, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(NULL, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + ventoy_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = ventoy_code_get_result(); + ventoy_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + lang_string("STR_CLEAR_SUCCESS", msg); + QMessageBox::information(NULL, title_info, msg); + } + else + { + lang_string("STR_CLEAR_FAILED", msg); + QMessageBox::critical(NULL, title_err, msg); + } + + FillDeviceList(disk_name); +} + +void Ventoy2DiskWindow::on_actionShow_All_Devices_toggled(bool arg1) +{ + ventoy_code_set_cur_show_all(arg1); + FillDeviceList(""); +} + + +void Ventoy2DiskWindow::closeEvent(QCloseEvent *event) +{ + vlog("On closeEvent ...\n"); + + if (m_thread->m_running) + { + QString title; + QString msg; + + lang_string("STR_WARNING", title); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(NULL, title, msg); + + event->ignore(); + return; + } + + ventoy_code_save_cfg(); + + event->accept(); +} + +void Ventoy2DiskWindow::on_actionSecure_Boot_Support_triggered() +{ + ui->labelVentoyLocalSecure->setHidden(!(ui->actionSecure_Boot_Support->isChecked())); +} + +void Ventoy2DiskWindow::set_percent(int percent) +{ + int index; + QString status, radio; + + ui->progressBar->setValue(percent); + + lang_string("STR_STATUS", status); + + if (percent == 0) + { + ui->groupBoxStatus->setTitle(status); + } + else + { + index = status.indexOf("-"); + radio.sprintf("%d%%", percent); + ui->groupBoxStatus->setTitle(status.left(index + 2) + radio); + } +} + +void Ventoy2DiskWindow::thread_event(int msg, int data) +{ + char disk_name[32]; + QString title_err, title_info, tipmsg; + + if (msg == THREAD_MSG_PROGRESS_BAR) + { + set_percent(data); + } + else if (msg == THREAD_MSG_INSTALL_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_INSTALL_SUCCESS", tipmsg); + QMessageBox::information(NULL, title_info, tipmsg); + } + else + { + lang_string("STR_INSTALL_FAILED", tipmsg); + QMessageBox::critical(NULL, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonRefresh->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } + else if (msg == THREAD_MSG_UPDATE_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_UPDATE_SUCCESS", tipmsg); + QMessageBox::information(NULL, title_info, tipmsg); + } + else + { + lang_string("STR_UPDATE_FAILED", tipmsg); + QMessageBox::critical(NULL, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonRefresh->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } +} diff --git a/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.h b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.h new file mode 100644 index 00000000..4a3be008 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.h @@ -0,0 +1,105 @@ +#ifndef VENTOY2DISKWINDOW_H +#define VENTOY2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "partcfgdialog.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class Ventoy2DiskWindow; } +QT_END_NAMESPACE + +#define THREAD_TYPE_INSTALL 1 +#define THREAD_TYPE_UPDATE 2 + +#define THREAD_MSG_PROGRESS_BAR 1 +#define THREAD_MSG_INSTALL_FINISH 2 +#define THREAD_MSG_UPDATE_FINISH 3 + +class MyQThread : public QThread +{ + Q_OBJECT +public: + quint64 m_reserve_space; + int m_index; + int m_type; + int m_secureboot; + int m_align4K; + bool m_running; + void install_run(); + void update_run(); + + explicit MyQThread(QObject *parent = nullptr); +protected: + void run(); +signals: + void thread_event(int msg, int data); +public slots: +}; + + +class Ventoy2DiskWindow : public QMainWindow +{ + Q_OBJECT + +public: + Ventoy2DiskWindow(QWidget *parent = nullptr); + ~Ventoy2DiskWindow(); + + QActionGroup *m_part_group; + QActionGroup *m_lang_group; + QJsonArray m_lang_array; + PartCfgDialog *m_partcfg; + MyQThread *m_thread; + + void FillDeviceList(const QString &select); + void OnInitWindow(void); + void LoadLanguages(); + int lang_string(const QString &id, QString &str); + void update_ui_language(); + void set_percent(int percent); +protected: + void showEvent(QShowEvent *ev); + void closeEvent(QCloseEvent *event); + +private slots: + + void thread_event(int msg, int data); + void part_style_check_action(QAction *act); + void lang_check_action(QAction *act); + + void on_ButtonInstall_clicked(); + + void on_ButtonUpdate_clicked(); + + void on_ButtonRefresh_clicked(); + + void on_comboBoxDevice_currentIndexChanged(int index); + + void on_actionPartition_Configuration_triggered(); + + void on_actionClear_Ventoy_triggered(); + + void on_actionShow_All_Devices_toggled(bool arg1); + + void on_actionSecure_Boot_Support_triggered(); + +private: + Ui::Ventoy2DiskWindow *ui; + + +}; + +#define _LANG_STR(id) obj.value(id).toString() +#define VERSION_FMT "

%s

" + +#endif // VENTOY2DISKWINDOW_H diff --git a/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.ui b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.ui new file mode 100644 index 00000000..bb6da842 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/ventoy2diskwindow.ui @@ -0,0 +1,323 @@ + + + Ventoy2DiskWindow + + + + 0 + 0 + 441 + 367 + + + + Ventoy2Disk + + + + + + 10 + 10 + 421 + 80 + + + + Device + + + + + 10 + 40 + 361 + 26 + + + + + + + 380 + 37 + 30 + 30 + + + + + + + + ../refresh.ico../refresh.ico + + + + 24 + 24 + + + + + + + + 10 + 100 + 205 + 80 + + + + Ventoy In Package + + + Qt::AlignCenter + + + + + 30 + 30 + 135 + 41 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#ff0000;">1.0.53</span></p></body></html> + + + Qt::AlignCenter + + + + + + 172 + 60 + 31 + 18 + + + + <html><head/><body><p>MBR</p></body></html> + + + + + + 12 + 36 + 21 + 31 + + + + + + + ../secure.ico + + + + + + + 225 + 100 + 205 + 80 + + + + Ventoy In Device + + + Qt::AlignCenter + + + + + 30 + 30 + 135 + 41 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#ff0000;">1.0.52</span></p></body></html> + + + Qt::AlignCenter + + + + + + 172 + 60 + 31 + 18 + + + + <html><head/><body><p>GPT</p></body></html> + + + + + + 12 + 36 + 21 + 31 + + + + + + + ../secure.ico + + + + + + + 10 + 190 + 421 + 61 + + + + Status: REDAY + + + + + 10 + 30 + 401 + 23 + + + + 0 + + + false + + + + + + + + + + 90 + 275 + 101 + 41 + + + + Install + + + + + + 250 + 275 + 101 + 41 + + + + Update + + + + + + + 0 + 0 + 441 + 23 + + + + + Option + + + + Partition Style + + + + + + + + + + + + + Language + + + + + + + + true + + + Secure Boot Support + + + + + true + + + MBR + + + + + true + + + GPT + + + + + Partition Configuration + + + + + Clear Ventoy + + + + + true + + + Show All Devices + + + + + + diff --git a/LinuxGUI/Ventoy2Disk/QT/ventoy_qt.h b/LinuxGUI/Ventoy2Disk/QT/ventoy_qt.h new file mode 100644 index 00000000..6179d8b2 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/ventoy_qt.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * ventoy_qt.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_QT_H__ +#define __VENTOY_QT_H__ + +int ventoy_disk_init(void); +void ventoy_disk_exit(void); +int ventoy_http_init(void); +void ventoy_http_exit(void); +int ventoy_log_init(void); +void ventoy_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * ventoy_code_get_cur_language(void); +int ventoy_code_get_cur_part_style(void); +void ventoy_code_set_cur_part_style(int style); +int ventoy_code_get_cur_show_all(void); +void ventoy_code_set_cur_show_all(int show_all); +void ventoy_code_set_cur_language(const char *lang); +void ventoy_code_save_cfg(void); +void ventoy_code_refresh_device(void); +int ventoy_code_is_busy(void); +int ventoy_code_get_percent(void); +int ventoy_code_get_result(void); + +#endif /* __VENTOY_QT_H__ */ + + diff --git a/LinuxGUI/Ventoy2Disk/QT/ventoy_qt_stub.c b/LinuxGUI/Ventoy2Disk/QT/ventoy_qt_stub.c new file mode 100644 index 00000000..cee209d2 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/QT/ventoy_qt_stub.c @@ -0,0 +1,600 @@ +/****************************************************************************** + * ventoy_qt_stub.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct mg_context * +mg_start(const struct mg_callbacks *callbacks, + void *user_data, + const char **options) +{ + (void)callbacks; + (void)user_data; + (void)options; + + return NULL; +} + +void mg_stop(struct mg_context *ctx) +{ + (void)ctx; +} + +int mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + (void)conn; + (void)buf; + (void)len; + return 0; +} + + +const struct mg_request_info * mg_get_request_info(const struct mg_connection *conn) +{ + (void)conn; + return NULL; +} + +int mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + +int mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + (void)conn; + (void)fmt; + + return 0; +} + +static unsigned char window_icon_hexData[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0xAA, 0x69, 0x71, + 0xDE, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xAF, 0xC8, 0x37, 0x05, 0x8A, + 0xE9, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, + 0x84, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, + 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, + 0x06, 0x62, 0x4B, 0x47, 0x44, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xA0, 0xBD, 0xA7, 0x93, 0x00, + 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xE4, 0x03, 0x17, 0x04, 0x10, 0x05, 0xF6, 0xCE, + 0xA8, 0xC0, 0x00, 0x00, 0x1C, 0x68, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xCD, 0x9B, 0x79, 0x94, + 0x1D, 0x57, 0x7D, 0xE7, 0x3F, 0xF7, 0xDE, 0xAA, 0x7A, 0xFB, 0xEB, 0xD7, 0xBB, 0xA4, 0x56, 0xCB, + 0xDA, 0x6C, 0x59, 0xB6, 0x64, 0x83, 0x91, 0x17, 0xBC, 0xE1, 0x0D, 0x2F, 0x04, 0x1B, 0xB0, 0x43, + 0x3C, 0x40, 0x32, 0x43, 0x4E, 0x38, 0x19, 0x87, 0x43, 0x26, 0x03, 0x84, 0x98, 0xC9, 0x1C, 0x98, + 0x93, 0x70, 0x48, 0x72, 0x66, 0x58, 0x86, 0x81, 0x10, 0x0E, 0x06, 0xC6, 0x21, 0xC1, 0x83, 0xC1, + 0x36, 0x18, 0xDB, 0x6C, 0xC6, 0x60, 0xB0, 0x65, 0xBC, 0x1B, 0x5B, 0x8B, 0x6D, 0x59, 0x92, 0xB5, + 0x75, 0x5B, 0x52, 0xAB, 0xD7, 0xB7, 0x56, 0xD5, 0x5D, 0xE6, 0x8F, 0xAA, 0xF7, 0xF4, 0xBA, 0xD5, + 0xF2, 0xC2, 0x92, 0x99, 0x3A, 0xE7, 0xD7, 0xF5, 0x96, 0x7A, 0x75, 0x7F, 0xDF, 0xEF, 0x6F, 0xB9, + 0xBF, 0xFB, 0xBB, 0xD5, 0x82, 0xDF, 0xD1, 0x61, 0x8C, 0x45, 0x7D, 0x70, 0x9A, 0xFD, 0x7F, 0x57, + 0x61, 0x57, 0xD5, 0x31, 0x17, 0x39, 0x9C, 0x83, 0xD8, 0xC1, 0xEF, 0xAF, 0x1A, 0xE6, 0xC9, 0x23, + 0x13, 0x41, 0x55, 0xA3, 0xB4, 0x75, 0xD2, 0x93, 0xB8, 0xBC, 0x27, 0xCC, 0xA6, 0x7E, 0x19, 0xDD, + 0xBA, 0x5B, 0xBB, 0xBC, 0x07, 0x02, 0x28, 0x78, 0x82, 0xD1, 0xA2, 0x60, 0x6D, 0x59, 0x52, 0x8F, + 0x1D, 0xC5, 0x40, 0xFE, 0xD6, 0xF5, 0x14, 0xBF, 0xED, 0x1B, 0x3E, 0xBC, 0x67, 0x92, 0x3C, 0x9A, + 0x03, 0xAE, 0x44, 0x84, 0xC7, 0xDB, 0x56, 0xFA, 0x3C, 0x3A, 0x61, 0x7A, 0x26, 0x43, 0x96, 0x59, + 0xEB, 0xD6, 0x6A, 0xC7, 0x09, 0x16, 0x46, 0x05, 0xF4, 0x03, 0x79, 0x01, 0xBE, 0x03, 0x03, 0x34, + 0x81, 0x19, 0x21, 0x18, 0xF3, 0x05, 0x7B, 0x95, 0x10, 0xBB, 0x8A, 0x3E, 0xFB, 0xCE, 0x1B, 0x56, + 0xD3, 0x77, 0xEC, 0x89, 0x4D, 0x5E, 0x5A, 0xFA, 0x5C, 0x9D, 0x59, 0xF2, 0xAC, 0x72, 0x87, 0x39, + 0x71, 0xD5, 0x09, 0xFF, 0x7F, 0x11, 0xF0, 0xD3, 0x17, 0x67, 0xC9, 0xA1, 0x99, 0xB0, 0x39, 0xBE, + 0x19, 0xE6, 0x78, 0x5F, 0xA1, 0xD1, 0x17, 0x4B, 0xFF, 0x8C, 0x96, 0x11, 0x17, 0x59, 0xC7, 0xD9, + 0xC6, 0xB1, 0xCE, 0x41, 0x9F, 0x14, 0xE4, 0x3C, 0x89, 0x54, 0x02, 0x94, 0x48, 0x14, 0x70, 0x80, + 0x75, 0x60, 0x8E, 0x4A, 0x53, 0xC0, 0x9C, 0x27, 0xD8, 0x2D, 0x04, 0x8F, 0x67, 0x24, 0xF7, 0x07, + 0xE8, 0x47, 0x2E, 0x52, 0xDF, 0x19, 0xBF, 0x3B, 0xBC, 0xD6, 0x55, 0x44, 0xC8, 0x6E, 0xBF, 0xCC, + 0x99, 0xCD, 0x3D, 0x9C, 0xB2, 0x76, 0xD5, 0xFF, 0x5B, 0x02, 0x7E, 0xBE, 0x6B, 0x92, 0x3E, 0xD1, + 0x64, 0x8F, 0xA9, 0x70, 0xF5, 0x89, 0x05, 0xBE, 0xBF, 0xBB, 0xB1, 0xAA, 0xE5, 0xD4, 0xD5, 0x06, + 0xF1, 0x76, 0xE3, 0xC4, 0xEB, 0x8D, 0xA3, 0x22, 0x05, 0xE4, 0x3C, 0x41, 0xD1, 0x83, 0xAC, 0x27, + 0x08, 0x24, 0xC8, 0x14, 0x7C, 0x9B, 0x80, 0x36, 0x09, 0xDA, 0x41, 0x4B, 0x3B, 0xEA, 0x1A, 0x1A, + 0xDA, 0x61, 0x1C, 0x28, 0x41, 0xC3, 0x13, 0xEE, 0x79, 0x0F, 0xEE, 0xC9, 0x48, 0x73, 0xC7, 0x3A, + 0x6F, 0x66, 0xCB, 0x56, 0x3D, 0xA0, 0x4F, 0xC8, 0x69, 0xE6, 0xB4, 0xE4, 0xFC, 0x91, 0xEC, 0xBF, + 0x3D, 0x01, 0x8F, 0xFE, 0x6A, 0x2B, 0xBB, 0x4B, 0xEB, 0xA9, 0x98, 0x39, 0x76, 0xDB, 0x0A, 0xAB, + 0xBC, 0xEA, 0xB2, 0x3A, 0xFE, 0xBB, 0x0D, 0xF2, 0xDF, 0x6B, 0xCB, 0x29, 0x91, 0x75, 0x4A, 0x20, + 0xA8, 0x64, 0x04, 0xBD, 0x19, 0x41, 0xCE, 0x13, 0x2C, 0x16, 0xC1, 0xEE, 0x38, 0x8A, 0x38, 0x20, + 0x34, 0x30, 0x1B, 0x39, 0xA6, 0x42, 0x8B, 0x76, 0x90, 0x91, 0x10, 0x48, 0xF6, 0x79, 0xC2, 0xDD, + 0x9E, 0xF7, 0xF8, 0xCA, 0xE5, 0x37, 0xFB, 0xDB, 0xEF, 0x7B, 0x6F, 0xCC, 0x25, 0xA3, 0x9A, 0xA7, + 0x0E, 0x29, 0xCE, 0x58, 0x92, 0xFB, 0xB7, 0x21, 0xE0, 0x91, 0xFD, 0x73, 0x9C, 0x55, 0xAE, 0xF2, + 0x9D, 0xC3, 0x15, 0x86, 0x5D, 0x35, 0xFB, 0x12, 0xA5, 0xAB, 0x62, 0x27, 0x3F, 0xA8, 0x11, 0xE7, + 0xB6, 0x0C, 0x2A, 0x32, 0x8E, 0x9E, 0x40, 0xB0, 0xAC, 0xA0, 0x28, 0x78, 0xA2, 0x33, 0x8A, 0x7B, + 0x8D, 0xE3, 0xB4, 0x95, 0x0B, 0x8D, 0xE3, 0x50, 0xD3, 0x72, 0xA4, 0x65, 0x51, 0x42, 0x50, 0xF0, + 0xC0, 0x97, 0xE2, 0xD9, 0x8C, 0x74, 0xFF, 0x34, 0x98, 0x71, 0xDF, 0xD8, 0xDF, 0x10, 0x53, 0xEB, + 0x8A, 0x9A, 0x99, 0x58, 0x72, 0xD1, 0x8A, 0xFC, 0xEF, 0x96, 0x80, 0x7B, 0x76, 0xD6, 0xE9, 0x0F, + 0x0C, 0x4F, 0xCD, 0x78, 0xAC, 0xC8, 0x9B, 0xD1, 0xAA, 0x96, 0x1F, 0x8E, 0x91, 0xEF, 0x6D, 0x69, + 0xD7, 0x53, 0xD7, 0x09, 0xC4, 0xD1, 0xA2, 0x62, 0x28, 0x2F, 0x51, 0x42, 0xBC, 0x66, 0xD0, 0xC7, + 0x3F, 0x1C, 0xD3, 0xA1, 0x63, 0x6F, 0xD5, 0x10, 0x19, 0x47, 0xD1, 0x97, 0xE4, 0x7D, 0x11, 0x65, + 0x25, 0xDF, 0xCF, 0x7A, 0x7C, 0xE2, 0xA1, 0xC9, 0xE0, 0xC9, 0x2B, 0x07, 0x1A, 0xB4, 0x2C, 0xBC, + 0x79, 0x55, 0xF1, 0x77, 0x43, 0xC0, 0x3D, 0xCF, 0xCF, 0x90, 0x55, 0xF0, 0xAB, 0x39, 0x9F, 0x35, + 0x25, 0x77, 0x66, 0x4D, 0x8B, 0x7F, 0x88, 0x0C, 0x17, 0xD7, 0x62, 0x27, 0x1A, 0xDA, 0xE1, 0x2B, + 0xC1, 0xEA, 0x1E, 0x45, 0x7F, 0x4E, 0x26, 0xC0, 0x7F, 0x7B, 0xE8, 0x13, 0x65, 0x05, 0xD4, 0x63, + 0xC7, 0xAE, 0x19, 0x43, 0x2D, 0x76, 0xE4, 0x3D, 0x41, 0x29, 0x10, 0xE4, 0x3D, 0xB1, 0xBD, 0xA0, + 0xDC, 0xC7, 0x2E, 0xAC, 0x34, 0xEE, 0x7C, 0x6A, 0xCE, 0x37, 0xA1, 0x15, 0x5C, 0xBE, 0xA6, 0xFC, + 0xDB, 0x25, 0xE0, 0x7B, 0xCF, 0xCD, 0x90, 0x53, 0x8E, 0xB7, 0x6C, 0xAF, 0xF0, 0x8D, 0x75, 0xF5, + 0x37, 0x37, 0x0D, 0x9F, 0x69, 0x6A, 0xB7, 0xA1, 0x1A, 0x39, 0x5A, 0xC6, 0xE1, 0x29, 0xC1, 0x89, + 0x15, 0x8F, 0xFE, 0x9C, 0xE4, 0x77, 0x80, 0xBD, 0x73, 0x48, 0xA0, 0x16, 0x3B, 0x76, 0x4C, 0x6B, + 0xEA, 0xDA, 0x91, 0x51, 0x82, 0x1E, 0x5F, 0x52, 0x0A, 0xC4, 0xE1, 0x82, 0xE7, 0xFE, 0xE6, 0x94, + 0x5C, 0xFD, 0xA6, 0xFD, 0x61, 0x10, 0x87, 0x16, 0xAE, 0x5A, 0x5B, 0xF9, 0xED, 0x10, 0x70, 0xCF, + 0x73, 0x53, 0x64, 0x14, 0xFC, 0x7C, 0xAA, 0xC0, 0x86, 0x52, 0x78, 0x45, 0xC3, 0x88, 0x2F, 0xD4, + 0x22, 0xB7, 0x76, 0x2E, 0xB2, 0xC4, 0xD6, 0x81, 0x10, 0xAC, 0x2C, 0x7B, 0x8C, 0x94, 0xD4, 0xEF, + 0x08, 0xF6, 0x02, 0xA5, 0x05, 0x4C, 0xB5, 0x2C, 0x3B, 0xA6, 0x35, 0xDA, 0x3A, 0x7C, 0x29, 0x28, + 0x07, 0x92, 0xDE, 0xAC, 0x9C, 0x2B, 0x2A, 0xF7, 0xF1, 0x8D, 0xF9, 0xD9, 0x7F, 0xDC, 0xD3, 0xCA, + 0xE9, 0xD8, 0x49, 0xAE, 0x3C, 0xF1, 0xE5, 0x49, 0x78, 0x45, 0x02, 0x7E, 0xB6, 0x65, 0x0F, 0x85, + 0x5C, 0x86, 0x87, 0x66, 0x0A, 0x0C, 0xE7, 0x38, 0xAF, 0x1E, 0xBB, 0x9B, 0x6A, 0x91, 0x5D, 0x3F, + 0x1B, 0x3A, 0x62, 0xE7, 0x70, 0x40, 0x5F, 0xCE, 0x63, 0x5D, 0x9F, 0x8F, 0xFA, 0xED, 0x17, 0x6A, + 0xC7, 0x1C, 0xCE, 0xB9, 0x8E, 0xD2, 0x7B, 0xAB, 0x86, 0x03, 0x55, 0x8D, 0x00, 0x3C, 0x29, 0xE8, + 0xC9, 0x48, 0xFA, 0xB2, 0x72, 0xAA, 0xE8, 0xF1, 0x97, 0xEF, 0x28, 0xEF, 0xBB, 0xF9, 0xFE, 0xFA, + 0x52, 0x67, 0x10, 0x5C, 0xB6, 0xB6, 0xF7, 0xD7, 0x27, 0xC0, 0x39, 0xF8, 0xCA, 0xD3, 0x73, 0xF4, + 0xA8, 0xE8, 0xD4, 0xD9, 0xD8, 0xBB, 0xB9, 0x1A, 0xD9, 0x4D, 0x33, 0x2D, 0x43, 0xEC, 0x12, 0x37, + 0xF7, 0x94, 0xE0, 0xA4, 0xBE, 0x80, 0xBE, 0xAC, 0x24, 0x75, 0x86, 0xDF, 0x00, 0xDD, 0x02, 0x8D, + 0x1C, 0xB8, 0xF6, 0x24, 0xE2, 0xC0, 0x5A, 0x43, 0xD6, 0x4B, 0x94, 0x0A, 0x2D, 0x84, 0x56, 0xF2, + 0xEC, 0x64, 0x4C, 0x33, 0x76, 0x08, 0x01, 0x9E, 0x84, 0xDE, 0xAC, 0xA2, 0x3F, 0xA7, 0xC6, 0xCB, + 0x9E, 0xFD, 0x8F, 0x7B, 0x9B, 0xFE, 0xDD, 0x67, 0x97, 0xE6, 0x88, 0x1B, 0x35, 0x2E, 0x38, 0xED, + 0xC4, 0xD7, 0x4E, 0xC0, 0x37, 0x9F, 0x3C, 0x08, 0x52, 0x92, 0x51, 0xF4, 0x1F, 0x89, 0xBC, 0x2F, + 0x57, 0x43, 0x7B, 0xED, 0x54, 0xD3, 0x10, 0xA6, 0x48, 0x9D, 0x80, 0xBE, 0xAC, 0xE2, 0xA4, 0xBE, + 0x00, 0x29, 0x39, 0xFE, 0xA4, 0xFE, 0x5A, 0x80, 0x2F, 0x76, 0x0F, 0x07, 0xD6, 0x6A, 0x7A, 0x02, + 0x38, 0x7D, 0xB8, 0x40, 0x64, 0x0C, 0x4F, 0xBD, 0x54, 0x25, 0x72, 0x1E, 0xFB, 0xEB, 0x30, 0x56, + 0x35, 0x9D, 0xCB, 0x7D, 0x29, 0x18, 0xC8, 0x4B, 0x06, 0x72, 0xEA, 0xE9, 0x5E, 0xCF, 0xFC, 0x61, + 0x9D, 0xCC, 0xD6, 0xEB, 0x4F, 0x2E, 0x1C, 0xD7, 0x32, 0xC7, 0x55, 0xF5, 0xAE, 0x87, 0xB6, 0x60, + 0x72, 0x15, 0xCE, 0x29, 0x4F, 0xC9, 0x7B, 0xA6, 0x47, 0x6E, 0x9C, 0x0D, 0xED, 0xDF, 0x4E, 0x36, + 0xB4, 0xD7, 0xD0, 0xC9, 0xAF, 0x84, 0x4C, 0x7E, 0xBA, 0xB2, 0x12, 0xB0, 0xA4, 0xE8, 0xFD, 0x06, + 0x66, 0xEF, 0xC2, 0xED, 0x1C, 0xCE, 0x5A, 0x04, 0x0E, 0x87, 0x40, 0xC8, 0x34, 0xA1, 0x9A, 0x98, + 0xC1, 0xBC, 0xE4, 0x75, 0x4B, 0x0B, 0xE4, 0x14, 0x78, 0x4A, 0xB1, 0x7F, 0xA6, 0xC9, 0xD3, 0x2F, + 0x55, 0x99, 0x8C, 0x3C, 0x76, 0xCC, 0x58, 0x8C, 0x13, 0x1D, 0x40, 0x19, 0x4F, 0xB0, 0xA4, 0xE0, + 0x31, 0x90, 0x93, 0xB7, 0x0C, 0xFB, 0xD1, 0x0D, 0x4D, 0x2B, 0xAB, 0x9E, 0x89, 0xB8, 0x72, 0xE3, + 0xC8, 0x31, 0xE3, 0x1E, 0x37, 0x6A, 0xDF, 0xAA, 0x7F, 0xCA, 0x78, 0x5C, 0xE0, 0x47, 0x53, 0x43, + 0x6F, 0xAC, 0x85, 0xF6, 0xFD, 0xD3, 0xF5, 0xD8, 0xAB, 0xB6, 0x34, 0xDA, 0x18, 0x8C, 0xB5, 0x68, + 0x63, 0xC1, 0x39, 0x32, 0x0A, 0xB4, 0x71, 0xC4, 0xDA, 0xFE, 0x46, 0x12, 0x45, 0x31, 0x26, 0x0E, + 0x59, 0x5E, 0x70, 0x9C, 0x36, 0xE8, 0x51, 0x10, 0x21, 0xAD, 0x56, 0x83, 0x28, 0x6C, 0xB2, 0xB4, + 0x20, 0xD8, 0xB4, 0xAC, 0x40, 0xC9, 0x97, 0x6C, 0xDD, 0x77, 0x80, 0x7D, 0x13, 0x47, 0x58, 0x51, + 0xC9, 0xB1, 0x7E, 0x30, 0x4F, 0xC6, 0x85, 0x48, 0x13, 0xA1, 0xB5, 0xC6, 0x18, 0x83, 0x36, 0x86, + 0x46, 0xA8, 0x99, 0xA8, 0x45, 0xCC, 0xB6, 0xEC, 0x3B, 0x26, 0x63, 0x75, 0xFD, 0x77, 0xF4, 0x00, + 0x81, 0x6D, 0xBD, 0x7A, 0x0F, 0xF8, 0xC1, 0x63, 0xDB, 0x99, 0xB2, 0x25, 0xF2, 0x52, 0x17, 0xC7, + 0xE3, 0xDC, 0x57, 0x26, 0x6B, 0xFA, 0xFA, 0x89, 0xBA, 0x26, 0xC6, 0x21, 0xA4, 0x44, 0xC8, 0xA4, + 0xC0, 0xC9, 0xF9, 0x92, 0x93, 0x07, 0x32, 0x04, 0xF2, 0x37, 0x5B, 0x52, 0x58, 0x6B, 0xC8, 0x49, + 0xCD, 0xE9, 0x4B, 0x72, 0xAC, 0xEA, 0xCB, 0xE3, 0x49, 0xC1, 0x74, 0x23, 0xE2, 0xA9, 0x03, 0xD3, + 0x14, 0x32, 0x3E, 0xA7, 0x8F, 0x54, 0x08, 0x54, 0xB2, 0x72, 0x98, 0x6B, 0xB6, 0x70, 0xCE, 0x51, + 0x29, 0xE4, 0x70, 0x08, 0xB6, 0x1F, 0x9C, 0xE5, 0xB6, 0x2D, 0x87, 0x99, 0x8C, 0x33, 0x48, 0xCF, + 0x4F, 0x6D, 0xEA, 0xF0, 0x84, 0x60, 0xB0, 0xE0, 0x31, 0x52, 0xF2, 0x7F, 0x35, 0xE0, 0xC7, 0xD7, + 0xC5, 0x4E, 0xEE, 0x56, 0x71, 0x9D, 0xB7, 0x6F, 0x5A, 0xFD, 0xCA, 0x1E, 0x30, 0x68, 0x27, 0x19, + 0x0B, 0xB3, 0x4C, 0x84, 0xEA, 0xD2, 0x6A, 0x53, 0xBF, 0x65, 0xAA, 0x1E, 0xD2, 0x8C, 0x35, 0xDA, + 0xD8, 0x84, 0x65, 0x9D, 0x88, 0xB3, 0x16, 0x63, 0x1D, 0x91, 0xB1, 0xBF, 0xB6, 0xB4, 0xA2, 0x88, + 0x2C, 0x11, 0x67, 0x2E, 0xCD, 0xB1, 0xBA, 0x37, 0x07, 0xCE, 0x11, 0x6B, 0x43, 0x29, 0x50, 0x9C, + 0x73, 0x42, 0x1F, 0xA7, 0x2D, 0x2D, 0xA3, 0x70, 0x98, 0x74, 0xEC, 0x42, 0xE0, 0x53, 0xCA, 0x66, + 0x98, 0xAB, 0x37, 0xA9, 0x37, 0x5B, 0x9C, 0x3C, 0x54, 0xE2, 0xCC, 0x65, 0x79, 0x6C, 0x73, 0x96, + 0x38, 0x0C, 0xD1, 0x5A, 0xA3, 0xB5, 0x25, 0x8C, 0x0D, 0x93, 0xF5, 0x88, 0x99, 0xA6, 0x3E, 0xBD, + 0xAA, 0xE5, 0xBB, 0xAF, 0x7D, 0xF6, 0x1A, 0xA1, 0xCC, 0xB1, 0x5E, 0x70, 0x8C, 0xE9, 0xA6, 0x1B, + 0x31, 0xF7, 0x3E, 0x77, 0x84, 0xDE, 0x9C, 0x2A, 0x6E, 0x3B, 0x14, 0x7E, 0xFD, 0xE0, 0x5C, 0xF4, + 0x8E, 0x89, 0x5A, 0x8C, 0x41, 0x20, 0x94, 0x48, 0x62, 0x5F, 0x08, 0x1C, 0x82, 0x52, 0x46, 0x72, + 0x62, 0x7F, 0x8E, 0x5F, 0xCF, 0x01, 0x1C, 0xC6, 0x68, 0x7A, 0x7C, 0xC3, 0x79, 0x2B, 0x4A, 0x8C, + 0xF4, 0xE4, 0xB0, 0xCE, 0xE1, 0x52, 0xE9, 0x56, 0x31, 0x36, 0x1A, 0x29, 0x25, 0x9E, 0x94, 0x38, + 0xE7, 0x90, 0x52, 0x72, 0x60, 0x72, 0x8A, 0x17, 0xC6, 0x0E, 0x72, 0xEE, 0x29, 0xEB, 0x90, 0x42, + 0xF0, 0xBD, 0xAD, 0xE3, 0xDC, 0xFF, 0x62, 0x1D, 0x82, 0x22, 0x88, 0xA4, 0x1E, 0x51, 0x02, 0x06, + 0x0B, 0x3E, 0x2B, 0x2B, 0xC1, 0xF6, 0x01, 0x3F, 0xBE, 0x26, 0x76, 0x62, 0x97, 0x98, 0x1D, 0xE3, + 0x0F, 0x2E, 0x3D, 0xFB, 0xF8, 0x1E, 0xD0, 0x9B, 0xBF, 0x86, 0xC3, 0x35, 0xCD, 0x4B, 0x35, 0x73, + 0x66, 0xB5, 0x19, 0x5F, 0x38, 0x53, 0x0D, 0x09, 0x23, 0xDD, 0xB1, 0xBA, 0xD6, 0x36, 0x15, 0x43, + 0x14, 0x1B, 0xC2, 0x58, 0x13, 0xC5, 0xE6, 0x35, 0x8A, 0xA6, 0x15, 0x86, 0xE4, 0x08, 0x39, 0x67, + 0x24, 0xCF, 0xD2, 0x72, 0x06, 0x6D, 0x0C, 0xD6, 0xDA, 0x8E, 0x98, 0xF4, 0xBD, 0xB3, 0x06, 0x09, + 0x34, 0x5A, 0x2D, 0x9A, 0x61, 0x88, 0x73, 0x0E, 0xA3, 0x35, 0x4B, 0x2A, 0x3D, 0xAC, 0x18, 0x1A, + 0x24, 0xD6, 0x1A, 0xE1, 0x2C, 0x67, 0x8E, 0x56, 0x28, 0xAA, 0x98, 0x28, 0x6C, 0xA5, 0x5E, 0x60, + 0x08, 0x63, 0xC3, 0x54, 0x3D, 0x64, 0xBA, 0x19, 0xAF, 0x6B, 0x38, 0xEF, 0xF7, 0x0E, 0xAC, 0x18, + 0x81, 0xB0, 0x3E, 0x0F, 0xEF, 0x31, 0xA5, 0xDB, 0xE3, 0x7B, 0x9F, 0xE0, 0x6D, 0xA7, 0x0D, 0xCA, + 0x5F, 0xBC, 0x30, 0xF5, 0x81, 0xC3, 0x33, 0xAD, 0x4B, 0x27, 0x6B, 0x11, 0xB1, 0x4D, 0x0A, 0x1E, + 0xE7, 0x1C, 0xB6, 0x2D, 0xD6, 0x82, 0x75, 0x94, 0x32, 0x49, 0xCC, 0x69, 0x6B, 0x31, 0xAF, 0x52, + 0xE2, 0x58, 0x93, 0x17, 0x11, 0xE7, 0x9F, 0x50, 0x62, 0xB4, 0x92, 0xEF, 0x58, 0xBE, 0x9B, 0x80, + 0xB6, 0x27, 0xB4, 0xBF, 0x53, 0x42, 0xD2, 0x88, 0x22, 0xAC, 0x73, 0x28, 0x29, 0xB1, 0xC6, 0xD0, + 0x57, 0xCA, 0x03, 0x82, 0x5D, 0x07, 0x8F, 0xD0, 0x88, 0x2D, 0x4F, 0xEE, 0x9D, 0xA2, 0x6E, 0x14, + 0x4E, 0x48, 0xAC, 0x75, 0x29, 0x91, 0x16, 0x4F, 0x08, 0x59, 0x0C, 0x84, 0xBF, 0x7C, 0xF2, 0xC0, + 0x5D, 0x3A, 0xD7, 0xD7, 0x3A, 0xE3, 0xC4, 0xE5, 0xDC, 0xF7, 0x93, 0x9F, 0x00, 0x30, 0x6F, 0xFE, + 0xAA, 0xB6, 0x34, 0x77, 0x3E, 0x7D, 0x88, 0x83, 0x73, 0xE1, 0x92, 0x5A, 0x23, 0xBA, 0x64, 0xA6, + 0x16, 0xD2, 0x0A, 0x63, 0x9C, 0x92, 0x08, 0x27, 0x3B, 0x09, 0xB0, 0x3D, 0xA7, 0x5A, 0x63, 0xA9, + 0xB5, 0x62, 0x8A, 0x19, 0x85, 0x7B, 0x95, 0xC5, 0xBF, 0xB3, 0x86, 0x9C, 0x88, 0x79, 0xE3, 0xCA, + 0x32, 0x2B, 0x2A, 0x39, 0x8C, 0xB5, 0xC9, 0xE7, 0x29, 0x01, 0xC7, 0x86, 0x40, 0x5A, 0xFD, 0x09, + 0x41, 0xDE, 0x0F, 0x68, 0xE9, 0x98, 0x50, 0x08, 0x02, 0x25, 0xA9, 0xB7, 0x22, 0xB6, 0x1F, 0x38, + 0x48, 0x23, 0x76, 0x6C, 0xDE, 0x35, 0xC9, 0x44, 0xCD, 0x21, 0xB2, 0x60, 0xB5, 0x49, 0xA2, 0xDB, + 0x81, 0xC1, 0x31, 0x5D, 0x83, 0x5A, 0x5E, 0xBD, 0x3E, 0xEF, 0xAB, 0x0D, 0xDA, 0x8A, 0x07, 0x97, + 0xAE, 0xDF, 0xD4, 0xB9, 0xF7, 0x3C, 0x02, 0x4A, 0xD9, 0xA5, 0x7C, 0xFE, 0xBE, 0x47, 0x30, 0xC6, + 0x9E, 0x36, 0x5B, 0x0F, 0xD7, 0xD4, 0x1A, 0x21, 0x51, 0x6C, 0x91, 0x4E, 0x21, 0x9C, 0x03, 0xE9, + 0xD2, 0xF9, 0xBF, 0xDD, 0xC7, 0x11, 0xCC, 0xD4, 0x05, 0x81, 0x08, 0x5E, 0xD5, 0xE2, 0xC7, 0x59, + 0x43, 0x40, 0xC4, 0xD9, 0xAB, 0x4B, 0xAC, 0xEE, 0xCF, 0x77, 0x80, 0xB5, 0xDD, 0x5F, 0x00, 0xDA, + 0x18, 0x62, 0xAD, 0xF1, 0x3D, 0x6F, 0x1E, 0x78, 0x21, 0x04, 0xCE, 0x19, 0x7C, 0x21, 0xF0, 0x94, + 0x62, 0xA6, 0xD1, 0xE4, 0xC1, 0x67, 0x77, 0xD3, 0x34, 0x8A, 0xC7, 0xF6, 0xCE, 0xF2, 0x52, 0x1D, + 0xBC, 0x6C, 0x19, 0x61, 0x00, 0x6B, 0x8E, 0xA6, 0x37, 0xE7, 0xA8, 0x3A, 0xCB, 0x6C, 0xC3, 0xEF, + 0xAB, 0x54, 0x32, 0xE7, 0xE9, 0x33, 0x56, 0x3E, 0x68, 0x6F, 0x7F, 0x72, 0x71, 0x02, 0x76, 0x1E, + 0xDE, 0xC3, 0xDA, 0xB5, 0x9F, 0xE6, 0x33, 0xDF, 0x7E, 0xD7, 0x59, 0xD5, 0x7A, 0x58, 0x6A, 0x34, + 0x23, 0x34, 0x02, 0x89, 0x43, 0x38, 0x09, 0x52, 0x22, 0x84, 0x9C, 0xD7, 0xE0, 0x98, 0xAE, 0x59, + 0x8A, 0xBE, 0x40, 0xBD, 0x42, 0x26, 0x74, 0xD6, 0xA2, 0x6C, 0xC4, 0xA6, 0x55, 0x45, 0x4E, 0x19, + 0x2E, 0xE2, 0xAC, 0xE5, 0x70, 0xB5, 0xCE, 0xC1, 0xA9, 0x19, 0x96, 0x0F, 0xF6, 0x91, 0xF5, 0x3C, + 0xF6, 0x1F, 0x99, 0x62, 0xC7, 0xD8, 0x21, 0xF2, 0x19, 0x9F, 0xB3, 0xD7, 0xAD, 0x86, 0x2E, 0xF0, + 0x6D, 0x32, 0xA4, 0x94, 0x60, 0x0C, 0xB3, 0xF5, 0x26, 0xFB, 0xA7, 0x1A, 0xEC, 0x98, 0x74, 0x1C, + 0x6A, 0x2A, 0x94, 0x9F, 0xC7, 0x38, 0x0F, 0x8C, 0x65, 0xDE, 0x5A, 0xD4, 0x39, 0x9A, 0x06, 0x66, + 0x1A, 0xA1, 0x18, 0xCA, 0x8B, 0xB3, 0x46, 0x1E, 0xFE, 0x65, 0xBE, 0xB6, 0x6C, 0x6D, 0x63, 0xD1, + 0x24, 0xB8, 0xEB, 0x50, 0x95, 0xDD, 0xBB, 0x3F, 0x9C, 0x0B, 0xC3, 0xF8, 0xB4, 0x6A, 0xAD, 0x45, + 0x2B, 0x8C, 0x3A, 0x09, 0x25, 0x8E, 0x0D, 0x3A, 0xD6, 0xC9, 0xFB, 0x38, 0x11, 0x13, 0x6B, 0xAA, + 0x8D, 0x88, 0xC9, 0x6A, 0x8B, 0x28, 0xD6, 0x84, 0xD1, 0xF1, 0x24, 0x26, 0x6C, 0x35, 0xD8, 0x30, + 0xE4, 0xF3, 0xFA, 0x91, 0x12, 0xCE, 0x59, 0xB4, 0xB5, 0xFC, 0xEC, 0x99, 0xE7, 0xF8, 0x97, 0xFB, + 0x1F, 0xE7, 0xB1, 0x1D, 0xFB, 0x88, 0xB4, 0xE6, 0xBE, 0x67, 0x76, 0x72, 0xFF, 0x73, 0x63, 0x84, + 0x5A, 0xE0, 0x8C, 0xC1, 0xA6, 0x9E, 0x91, 0xE8, 0xA0, 0x3B, 0x7A, 0x5A, 0x6B, 0x29, 0xE7, 0x72, + 0x28, 0x95, 0xE1, 0x70, 0x55, 0x63, 0x45, 0x06, 0xE3, 0x64, 0x92, 0x9C, 0xDB, 0x7A, 0xB6, 0x45, + 0x27, 0x3A, 0xCC, 0xD5, 0x43, 0x42, 0xED, 0x4E, 0xCE, 0x0D, 0xAD, 0xEE, 0x0F, 0xCA, 0x83, 0x8B, + 0x7B, 0xC0, 0xBE, 0x23, 0x75, 0xE6, 0x9A, 0x71, 0xB9, 0xDE, 0x8C, 0x56, 0xD7, 0x9B, 0x11, 0x51, + 0xAC, 0xC1, 0x3A, 0xA4, 0x73, 0x08, 0xA5, 0x40, 0x0A, 0x84, 0xB4, 0x2C, 0x9C, 0x3D, 0x27, 0xE6, + 0x42, 0x3C, 0x01, 0xFE, 0x22, 0xCB, 0x41, 0xE7, 0x1C, 0x56, 0x87, 0x6C, 0x18, 0xF6, 0x39, 0x6F, + 0x55, 0x05, 0x81, 0xC3, 0x68, 0x8B, 0x13, 0x82, 0x6C, 0x90, 0x65, 0xC3, 0xAA, 0x13, 0x58, 0xBD, + 0x64, 0x80, 0x83, 0x33, 0x55, 0x7C, 0x3F, 0xE0, 0xCC, 0xB5, 0x2B, 0x58, 0xD6, 0x57, 0xC6, 0xA4, + 0x6E, 0xEC, 0x52, 0xE0, 0x5E, 0x1A, 0x12, 0x52, 0x0A, 0x0E, 0x4C, 0x4E, 0xF3, 0xC4, 0xCE, 0xFD, + 0xBC, 0xFE, 0x84, 0x11, 0x9E, 0x3A, 0xD0, 0xE0, 0x70, 0x2B, 0x46, 0xFA, 0x92, 0x45, 0xEB, 0xBA, + 0x34, 0xA7, 0xD4, 0x9A, 0x50, 0x6F, 0xC5, 0x4B, 0xAC, 0x63, 0xD4, 0x58, 0xB7, 0x3F, 0xD2, 0x86, + 0xC0, 0x53, 0xF3, 0x09, 0x68, 0x45, 0x31, 0x51, 0x20, 0x07, 0xEA, 0xAD, 0x78, 0xB8, 0xD1, 0x8C, + 0x88, 0x63, 0x8D, 0x74, 0x0E, 0x9B, 0xDE, 0xA8, 0x93, 0x04, 0x17, 0x0C, 0xA4, 0xB5, 0xE1, 0xB0, + 0x70, 0x0C, 0x14, 0x03, 0x04, 0xDD, 0x6D, 0x30, 0x87, 0xD1, 0x11, 0xAB, 0x7A, 0x04, 0x97, 0xAC, + 0xED, 0xC5, 0x17, 0x0E, 0xAD, 0x93, 0xE5, 0xAB, 0x76, 0x50, 0xCC, 0x7A, 0x5C, 0xBC, 0x71, 0x2D, + 0x47, 0xE6, 0x6A, 0xFC, 0x62, 0xEB, 0x6E, 0xCE, 0x5D, 0xB7, 0x92, 0x91, 0x4A, 0x21, 0x99, 0x51, + 0x8C, 0xED, 0xB8, 0xBC, 0x52, 0xAA, 0x13, 0x0A, 0x5B, 0x5F, 0x1C, 0xE3, 0xD1, 0x1D, 0xBB, 0x39, + 0xFF, 0xD4, 0x93, 0x18, 0x1D, 0x2A, 0x53, 0x50, 0x86, 0x28, 0x6C, 0xE1, 0x09, 0x6F, 0x71, 0x02, + 0x70, 0x38, 0xEB, 0x68, 0x86, 0x8E, 0x46, 0x18, 0xE7, 0x6B, 0xAD, 0x68, 0xB4, 0x15, 0xE9, 0x4E, + 0xD2, 0x9E, 0x47, 0x80, 0xB3, 0x0E, 0x9C, 0x1B, 0x6C, 0x85, 0x51, 0x3E, 0x0C, 0x23, 0x74, 0x6C, + 0x69, 0xF3, 0x2A, 0x9C, 0x4A, 0x92, 0xA0, 0x68, 0xCF, 0x02, 0xF3, 0xD3, 0xDE, 0x74, 0xD5, 0x60, + 0x8D, 0xA5, 0x27, 0xE7, 0xA7, 0x39, 0xD2, 0x61, 0x4D, 0xCC, 0x70, 0xCE, 0x72, 0xF9, 0xBA, 0x61, + 0x8A, 0x3E, 0x44, 0x71, 0xDC, 0x89, 0x67, 0x84, 0xC0, 0x13, 0x82, 0xF1, 0xA9, 0x59, 0x1E, 0x7A, + 0x76, 0x37, 0x67, 0x9D, 0x74, 0x02, 0x4B, 0x7A, 0x0A, 0x84, 0x5A, 0x23, 0x21, 0x99, 0xEE, 0x94, + 0x42, 0x4A, 0x89, 0x94, 0x02, 0x63, 0x2D, 0x0F, 0x6C, 0xDD, 0xC1, 0xF6, 0x7D, 0x2F, 0x71, 0xF9, + 0x1B, 0x36, 0xB0, 0x7A, 0xA8, 0x97, 0xF1, 0xD9, 0x1A, 0x47, 0x66, 0xAB, 0x18, 0x53, 0x80, 0xD8, + 0x2C, 0xA2, 0x97, 0xE8, 0x10, 0xD0, 0xC2, 0xD2, 0x0C, 0x75, 0x50, 0x6F, 0xE9, 0xC1, 0xBD, 0x13, + 0xB5, 0xCE, 0xE2, 0x70, 0x1E, 0x01, 0x49, 0xB9, 0xE9, 0x7A, 0x1A, 0xCD, 0xD8, 0x8F, 0xA2, 0x18, + 0x6D, 0xDC, 0xD1, 0xFE, 0xBD, 0x03, 0xA4, 0x4D, 0x93, 0xE0, 0xD1, 0x59, 0xA0, 0x9B, 0xE9, 0xC9, + 0xAA, 0x49, 0xCA, 0xD8, 0xAC, 0x87, 0xB3, 0x9A, 0xA2, 0x8C, 0xB8, 0xFC, 0xA4, 0x41, 0x86, 0xF2, + 0x8A, 0x28, 0xD6, 0x1D, 0xF0, 0xD6, 0x5A, 0x02, 0xDF, 0xA3, 0x11, 0xC5, 0xDC, 0xFD, 0xE8, 0x36, + 0xAE, 0xDA, 0x74, 0x2A, 0xFD, 0xA5, 0x1C, 0x5F, 0xFA, 0xE1, 0x66, 0x7A, 0xF3, 0x19, 0xAE, 0x3D, + 0xF7, 0x74, 0x02, 0xA5, 0x10, 0x29, 0xF8, 0x7A, 0x2B, 0xE2, 0x07, 0x8F, 0x6D, 0xE1, 0xF0, 0x4C, + 0x8D, 0xB7, 0x9D, 0xFB, 0x3A, 0x46, 0xFA, 0xCA, 0xEC, 0x99, 0x98, 0xE5, 0xAB, 0x3F, 0x7D, 0x9A, + 0xF1, 0x19, 0x8D, 0xCC, 0x95, 0x70, 0xC6, 0x1C, 0xA3, 0x4F, 0x32, 0x15, 0x3A, 0x9C, 0xB3, 0xC4, + 0x56, 0xD0, 0x0A, 0x63, 0xA9, 0xB5, 0xE9, 0xFD, 0xFB, 0x3B, 0xB7, 0xF2, 0xD7, 0xD7, 0x9C, 0x7A, + 0x2C, 0x01, 0x61, 0xA4, 0xD1, 0xC6, 0x64, 0xA7, 0xE7, 0x1A, 0xAA, 0x5E, 0x6F, 0xE1, 0x94, 0x4A, + 0x3C, 0xC0, 0x81, 0xB0, 0x0E, 0x94, 0x44, 0x08, 0x97, 0x8E, 0xB3, 0xB8, 0xBB, 0x4D, 0x6A, 0x4D, + 0xA3, 0x29, 0xE8, 0xCD, 0x68, 0x2E, 0xDE, 0xD8, 0xC7, 0xEA, 0xFE, 0x0C, 0xB1, 0x8E, 0x3B, 0xD7, + 0x0B, 0x21, 0xF0, 0x3C, 0x45, 0x23, 0xB6, 0x6C, 0xD9, 0x73, 0x08, 0x27, 0x3D, 0xEA, 0x51, 0xCC, + 0xB6, 0xAD, 0xE3, 0x4C, 0xD7, 0x22, 0x7A, 0x8B, 0x05, 0x3C, 0xCF, 0x47, 0x4A, 0x81, 0x92, 0x92, + 0xC3, 0xB3, 0x55, 0x6E, 0x7F, 0xE0, 0x71, 0x10, 0x8A, 0x3F, 0xB8, 0xF0, 0x0D, 0xF4, 0x17, 0xF3, + 0x3C, 0xB1, 0x73, 0x8C, 0xAF, 0xFD, 0xF4, 0x57, 0xEC, 0x99, 0x15, 0xF8, 0x85, 0x41, 0x9C, 0x93, + 0xA0, 0xCD, 0x22, 0x3A, 0x25, 0x5D, 0x1B, 0xE7, 0x2C, 0x42, 0xC0, 0x6C, 0x3D, 0xA4, 0x15, 0xE9, + 0x7C, 0xF4, 0xF5, 0x2F, 0xE3, 0xBE, 0x7A, 0xFD, 0xB1, 0x04, 0xE0, 0x2C, 0x38, 0x27, 0xC3, 0x48, + 0x73, 0x64, 0xA6, 0x4E, 0xA1, 0x90, 0x21, 0x48, 0xEF, 0x23, 0xAC, 0x43, 0xD8, 0xA4, 0x18, 0x7A, + 0xB9, 0xB6, 0x8F, 0x73, 0x96, 0xA8, 0xDE, 0xE4, 0xE2, 0x0D, 0x15, 0x36, 0xAD, 0x28, 0xA7, 0x45, + 0xCD, 0x51, 0xF0, 0x8D, 0x48, 0xF3, 0xE3, 0x87, 0xB7, 0x70, 0x70, 0xAE, 0xC5, 0x29, 0x2B, 0x47, + 0x58, 0xB3, 0x74, 0x80, 0x6A, 0xA3, 0xC9, 0x8A, 0xC1, 0x5E, 0xCE, 0x3B, 0x65, 0x35, 0xF9, 0xC0, + 0x43, 0x09, 0x90, 0x42, 0xB0, 0x63, 0xEC, 0x10, 0xB7, 0xFE, 0xEC, 0x51, 0x46, 0x06, 0xFB, 0xB8, + 0xEE, 0xFC, 0x33, 0x08, 0x3C, 0xC9, 0x77, 0x1F, 0xDE, 0xCA, 0x37, 0x1F, 0x7A, 0x9E, 0x19, 0x93, + 0xC7, 0xCF, 0xF7, 0x63, 0x44, 0x90, 0xEC, 0xA7, 0x61, 0x8E, 0xA7, 0x10, 0xCE, 0x5A, 0xEA, 0xA1, + 0xA6, 0x9A, 0xF7, 0xB0, 0xCE, 0x49, 0xD8, 0xDF, 0x89, 0x14, 0x6F, 0xE1, 0xC5, 0x02, 0x17, 0x49, + 0x9C, 0x0D, 0xC3, 0x88, 0x56, 0x6C, 0xE8, 0xED, 0x15, 0xF8, 0x90, 0x14, 0x42, 0x4E, 0x21, 0xE4, + 0xCB, 0xF4, 0xBD, 0x9C, 0xC5, 0xC4, 0x2D, 0xCE, 0x5D, 0x99, 0xE3, 0x9A, 0xD7, 0x2D, 0x45, 0x89, + 0x24, 0x61, 0x4A, 0x29, 0x13, 0xCB, 0x2B, 0xC5, 0x0B, 0x2F, 0x1D, 0xE1, 0xAE, 0x47, 0xB6, 0x93, + 0x2F, 0xF4, 0xF0, 0xEE, 0x8B, 0xCF, 0x66, 0x49, 0xC9, 0xC7, 0x51, 0x42, 0x2A, 0xD5, 0xF1, 0x5A, + 0x21, 0x24, 0x9B, 0xB7, 0xEE, 0xE0, 0xB6, 0x5F, 0x3C, 0xCE, 0xB9, 0xA7, 0x9E, 0xC4, 0x35, 0x6F, + 0x3C, 0x8D, 0xD9, 0x7A, 0x93, 0xAF, 0xFC, 0xE8, 0x49, 0xEE, 0xDD, 0x32, 0x86, 0x0E, 0xFA, 0xF0, + 0xB2, 0x3D, 0x18, 0x82, 0x14, 0xF7, 0xE2, 0xE0, 0x93, 0x54, 0xE4, 0xA8, 0x37, 0x23, 0xC2, 0x30, + 0x06, 0x5B, 0x40, 0x38, 0x17, 0x52, 0xBE, 0x36, 0x8D, 0xE9, 0x85, 0x04, 0xE0, 0x10, 0x82, 0x9A, + 0x12, 0x4E, 0x0B, 0x2C, 0xCD, 0x96, 0x66, 0x7A, 0x56, 0x50, 0x2E, 0x83, 0x9F, 0xF1, 0x93, 0x30, + 0x90, 0xB2, 0xD3, 0xA9, 0x59, 0xF8, 0x5B, 0x1D, 0x87, 0x9C, 0x3C, 0xA8, 0xF8, 0xE3, 0xF3, 0x57, + 0xD1, 0x5B, 0xCC, 0x62, 0xEC, 0xD1, 0x84, 0x24, 0x84, 0xC0, 0x5A, 0xCB, 0xCA, 0xE1, 0x01, 0xDE, + 0x79, 0xE1, 0x26, 0xF2, 0xF9, 0x1C, 0x7D, 0x85, 0x00, 0xEB, 0x1C, 0x52, 0x29, 0x84, 0x48, 0xE2, + 0x3D, 0xD2, 0x86, 0x6F, 0xDF, 0xFF, 0x4B, 0xEE, 0x7D, 0x62, 0x3B, 0xEF, 0xBA, 0xF4, 0x8D, 0x5C, + 0xF6, 0xFA, 0x93, 0xD9, 0xBA, 0x67, 0x9C, 0x2F, 0xFF, 0xF0, 0x31, 0x9E, 0x19, 0xAF, 0xA3, 0x72, + 0x03, 0x48, 0xBF, 0x84, 0xC1, 0x7B, 0x79, 0xCB, 0xA7, 0xE0, 0x9B, 0xA1, 0xA6, 0xDA, 0x08, 0xC9, + 0x28, 0xF0, 0xA4, 0x73, 0x52, 0x30, 0x77, 0xD5, 0x47, 0x2E, 0x46, 0xA4, 0x5E, 0x79, 0x8C, 0x07, + 0x38, 0xEB, 0x26, 0x03, 0x4F, 0x46, 0xCA, 0x39, 0x30, 0x9A, 0x30, 0x0C, 0x99, 0xAD, 0x42, 0xC1, + 0xE6, 0x08, 0x32, 0x3E, 0x42, 0x2A, 0x90, 0xB6, 0x8B, 0xE3, 0x24, 0x49, 0x58, 0x1D, 0x33, 0x98, + 0x33, 0xFC, 0xE9, 0xC5, 0xEB, 0x58, 0x31, 0x58, 0x46, 0x1B, 0x8B, 0x27, 0xE7, 0x13, 0x04, 0x82, + 0xA2, 0xE7, 0x71, 0xED, 0x79, 0x1B, 0xD3, 0x69, 0x2D, 0xB1, 0xB6, 0x10, 0x49, 0xBC, 0x4F, 0x57, + 0xEB, 0x7C, 0xE9, 0xCE, 0x9F, 0xF0, 0xFC, 0xFE, 0x43, 0xFC, 0xC5, 0x75, 0x57, 0xB0, 0x71, 0xF5, + 0x08, 0x77, 0x3F, 0xBC, 0x95, 0xFF, 0xFD, 0x93, 0xA7, 0x38, 0xD4, 0xF4, 0xF1, 0xF3, 0x43, 0x38, + 0x2F, 0x8F, 0x71, 0x32, 0xA9, 0xF8, 0xDC, 0xC2, 0x9A, 0x24, 0x19, 0x43, 0x08, 0xB0, 0xD6, 0xD1, + 0x8C, 0x74, 0xB2, 0x96, 0x31, 0x06, 0x25, 0x15, 0x81, 0x14, 0x71, 0xA0, 0xC4, 0x91, 0x37, 0x9D, + 0xBA, 0x94, 0xB6, 0x0D, 0xE7, 0x11, 0x90, 0xF1, 0x15, 0xD9, 0x40, 0x4D, 0xE4, 0x33, 0x6A, 0xCA, + 0x97, 0x0C, 0x38, 0xA3, 0x41, 0x0B, 0xE2, 0x50, 0x50, 0x75, 0x90, 0x33, 0x96, 0x20, 0xE3, 0x27, + 0xE5, 0x68, 0x57, 0x18, 0x58, 0x6B, 0xC8, 0x8A, 0x16, 0x7F, 0xF2, 0xA6, 0xF5, 0xBC, 0x61, 0xF5, + 0x10, 0xC6, 0x3A, 0x3C, 0x71, 0x14, 0xBD, 0x58, 0x10, 0x32, 0xF3, 0xE6, 0x76, 0x40, 0x29, 0xC5, + 0xCE, 0x03, 0x07, 0xF9, 0xEC, 0xAD, 0xF7, 0x20, 0xA4, 0xC7, 0x27, 0xDE, 0xF7, 0x4E, 0x0A, 0x19, + 0x9F, 0xCF, 0xDE, 0xFE, 0x33, 0xBE, 0xF7, 0xD8, 0x6E, 0x22, 0x59, 0xC6, 0xCB, 0x55, 0x30, 0x22, + 0x9B, 0xD4, 0xFA, 0x2F, 0x63, 0x75, 0x00, 0xE3, 0x1C, 0xAD, 0xC8, 0x10, 0xC7, 0x1A, 0x67, 0x1D, + 0xCE, 0x1A, 0x3C, 0x5F, 0x90, 0xF3, 0x65, 0xAB, 0xB7, 0x10, 0x8C, 0x6B, 0x63, 0x16, 0xAF, 0x03, + 0x86, 0x2B, 0x39, 0x56, 0x0E, 0xF7, 0xCC, 0x94, 0x72, 0xC1, 0xBE, 0x8C, 0x2F, 0x4F, 0x12, 0x46, + 0xE3, 0x84, 0xC0, 0x49, 0x81, 0x89, 0x05, 0x0D, 0xE7, 0x88, 0x8D, 0x21, 0x13, 0xF8, 0x48, 0x25, + 0x93, 0xA2, 0xC7, 0x59, 0x9C, 0x6E, 0xF2, 0xCE, 0x37, 0xAD, 0xE2, 0xF7, 0x36, 0xAD, 0x4A, 0x00, + 0x09, 0xD7, 0x01, 0xBD, 0x10, 0x7C, 0x1B, 0x78, 0xFB, 0x3B, 0x01, 0x6C, 0x7E, 0xE6, 0x59, 0x3E, + 0xFF, 0xED, 0x1F, 0xB2, 0x61, 0xCD, 0x4A, 0xDE, 0x7F, 0xED, 0x9B, 0xD9, 0x77, 0x68, 0x92, 0xBF, + 0xF9, 0xFA, 0x0F, 0x79, 0x62, 0xCF, 0x0C, 0x32, 0xDB, 0x87, 0x0C, 0x4A, 0x18, 0xFC, 0xE3, 0xBA, + 0x7C, 0x77, 0x43, 0x39, 0x36, 0x96, 0x58, 0x1B, 0xAC, 0x4D, 0x57, 0x95, 0xD6, 0x82, 0x31, 0x64, + 0x94, 0x4F, 0x39, 0xE7, 0xCF, 0x64, 0x7C, 0x6F, 0x6F, 0xE0, 0x29, 0x02, 0x4F, 0x1D, 0x4B, 0xC0, + 0x89, 0xCB, 0x7A, 0xD9, 0x74, 0xE2, 0x50, 0xF5, 0x8E, 0x9F, 0xFB, 0xCF, 0x16, 0x73, 0xFE, 0x65, + 0xC2, 0x59, 0xAC, 0x8E, 0x71, 0x32, 0x5D, 0x8D, 0x09, 0x88, 0xA3, 0xA4, 0x5E, 0xF0, 0x3C, 0x85, + 0xE7, 0x49, 0x4C, 0xDC, 0xE2, 0x8A, 0x8D, 0x43, 0xFC, 0xC9, 0x65, 0x1B, 0x08, 0x3C, 0x0F, 0xEB, + 0xE6, 0x83, 0x6F, 0x2F, 0x6D, 0x93, 0x82, 0xE6, 0xA8, 0x57, 0x48, 0x29, 0x89, 0xA2, 0x98, 0xDB, + 0xEE, 0xDB, 0xCC, 0x37, 0x7E, 0xFC, 0x20, 0xD7, 0x5D, 0xFC, 0x46, 0xAE, 0xBD, 0xF8, 0x2C, 0x7E, + 0xF4, 0xE8, 0x36, 0xBE, 0xF8, 0xBD, 0x87, 0x19, 0xAB, 0x82, 0x9F, 0x1B, 0xC4, 0x79, 0x79, 0x2C, + 0xAA, 0x03, 0xFE, 0x38, 0x5D, 0x73, 0xAC, 0x75, 0xC4, 0xC6, 0xA6, 0x79, 0xC7, 0xB5, 0xC3, 0x39, + 0x69, 0xA8, 0x58, 0x4B, 0x7F, 0x31, 0xA0, 0x9C, 0x95, 0x2F, 0xCE, 0x4E, 0x8C, 0x1F, 0x6E, 0x36, + 0x8F, 0x92, 0x38, 0x8F, 0x80, 0x4D, 0x27, 0x0E, 0xF1, 0xC7, 0xFF, 0xE3, 0xFB, 0x76, 0xDD, 0x8A, + 0xFE, 0xC7, 0x2B, 0xC5, 0x6C, 0xE4, 0x09, 0x02, 0xA3, 0x35, 0x4E, 0x26, 0xE0, 0x3B, 0x2E, 0xEF, + 0x1C, 0x91, 0xB5, 0xB4, 0x9A, 0x11, 0xA7, 0x8D, 0x16, 0xF9, 0xD0, 0x3B, 0x36, 0xD1, 0x5B, 0xCC, + 0x26, 0x71, 0xDF, 0x65, 0xF1, 0x76, 0x29, 0xDB, 0x9E, 0x05, 0x3A, 0x5E, 0x20, 0x25, 0xD3, 0xB3, + 0x73, 0x7C, 0xF1, 0xB6, 0xEF, 0xF3, 0xD0, 0x96, 0x17, 0xF8, 0x8B, 0xEB, 0xDF, 0xCA, 0xC6, 0x35, + 0xA3, 0xFC, 0xCF, 0x6F, 0xDD, 0xC7, 0xB7, 0x1F, 0x7C, 0x8E, 0x96, 0x28, 0xE2, 0x65, 0x2B, 0x58, + 0x99, 0x41, 0x58, 0x12, 0x2B, 0x2E, 0x38, 0x5C, 0x97, 0x2E, 0xD6, 0xBA, 0xA3, 0xC0, 0xA1, 0x33, + 0xF7, 0x63, 0x2D, 0xCE, 0x18, 0xF2, 0x81, 0x62, 0xA4, 0xBF, 0x40, 0x3E, 0x90, 0x4F, 0x7E, 0xEB, + 0x3F, 0x9F, 0x3B, 0xBB, 0xE6, 0xDD, 0x9F, 0x5A, 0x9C, 0x80, 0xC3, 0x33, 0x4D, 0x36, 0xAE, 0x1A, + 0x64, 0xA8, 0xAF, 0xF0, 0xC4, 0x40, 0x6F, 0xE1, 0x60, 0x36, 0x50, 0x2B, 0xC2, 0x30, 0xC2, 0xC5, + 0x02, 0x8B, 0x40, 0x72, 0x74, 0x1D, 0x60, 0x75, 0x4C, 0x7F, 0xC1, 0x71, 0xE3, 0x75, 0x67, 0xB2, + 0x7A, 0xA8, 0x27, 0xA9, 0xF1, 0x3B, 0xEB, 0xF6, 0xF9, 0x56, 0x5F, 0x08, 0x7E, 0xF7, 0x81, 0x71, + 0x3E, 0xFD, 0xF5, 0x3B, 0x98, 0x6D, 0x84, 0x7C, 0xF2, 0xCF, 0xDE, 0x4D, 0x6C, 0x1C, 0x1F, 0xFA, + 0xC7, 0x3B, 0xF8, 0xE5, 0x8E, 0x09, 0x44, 0xB6, 0x17, 0x15, 0x94, 0x92, 0x29, 0xCE, 0x42, 0xFA, + 0xE7, 0x18, 0xF4, 0x36, 0x2D, 0x71, 0xAD, 0x5B, 0xE4, 0xCB, 0xB6, 0xF5, 0x8D, 0xC1, 0x17, 0x8E, + 0x25, 0x3D, 0x39, 0xFA, 0x8B, 0x99, 0x66, 0x5F, 0xB9, 0xF8, 0xD0, 0x45, 0xFF, 0xF0, 0xA4, 0xDD, + 0xF7, 0xF0, 0x77, 0x17, 0x27, 0x60, 0xB8, 0x37, 0xCF, 0x77, 0x36, 0xEF, 0x60, 0xD3, 0xFA, 0xE5, + 0xBB, 0x1F, 0xDD, 0xBA, 0xFF, 0x91, 0x4A, 0x29, 0xB7, 0x62, 0x6E, 0xAE, 0x8E, 0xD5, 0x71, 0x52, + 0x55, 0x76, 0x7A, 0x0C, 0x86, 0x40, 0x69, 0xFE, 0xFC, 0xAD, 0x67, 0x73, 0xC1, 0xA9, 0xCB, 0x89, + 0xD3, 0x15, 0x5B, 0x27, 0xE6, 0x84, 0x40, 0x76, 0xAD, 0xE1, 0x9D, 0x4B, 0xAA, 0x47, 0x29, 0x04, + 0x8F, 0x3E, 0xB3, 0x9D, 0x4F, 0xFD, 0xEB, 0x77, 0x59, 0xB3, 0x7C, 0x29, 0x1F, 0x7C, 0xCF, 0xDB, + 0xF9, 0xE5, 0xB6, 0x17, 0xF9, 0x5F, 0xDF, 0xD9, 0xCC, 0xFE, 0x19, 0x83, 0x9F, 0x1B, 0x40, 0xB4, + 0x5D, 0x7E, 0xA1, 0xD5, 0xD3, 0xAD, 0x38, 0x97, 0xEE, 0x47, 0x1E, 0xFD, 0x23, 0xBA, 0x92, 0x80, + 0xEB, 0xAC, 0xFE, 0x9C, 0xB1, 0xF8, 0xD2, 0x31, 0x50, 0xCC, 0x30, 0x50, 0xCE, 0xD0, 0x5B, 0xCC, + 0xEC, 0x2A, 0x17, 0x82, 0x47, 0x85, 0x08, 0xF1, 0x8B, 0x95, 0xC5, 0x09, 0x00, 0xB8, 0xE2, 0x0D, + 0xAB, 0xB8, 0xEA, 0xC6, 0x5B, 0x9A, 0x97, 0x9F, 0xB9, 0xE6, 0x9E, 0xE1, 0x81, 0xD2, 0x35, 0x07, + 0x0F, 0x4E, 0x66, 0x9A, 0x51, 0x04, 0xC2, 0x75, 0xDC, 0xCE, 0xC4, 0x96, 0x6B, 0x2E, 0x58, 0xC3, + 0x1F, 0x5E, 0xB2, 0x01, 0x1D, 0xC7, 0xA9, 0x15, 0x5C, 0x7B, 0x12, 0x4A, 0x9E, 0x80, 0xEA, 0x02, + 0xDF, 0xF6, 0x8A, 0x1F, 0x3C, 0xF0, 0x18, 0x37, 0xDF, 0x79, 0x2F, 0x57, 0x5C, 0x70, 0x16, 0x6F, + 0x3A, 0x63, 0x03, 0x37, 0xDD, 0xFD, 0x10, 0xB7, 0xFE, 0x7C, 0x1B, 0x4D, 0x97, 0xC7, 0xCB, 0xF6, + 0x63, 0x65, 0x16, 0x61, 0x45, 0xE2, 0xBA, 0x8B, 0xB9, 0xFC, 0xF1, 0x1E, 0x3A, 0xE8, 0x5E, 0x03, + 0xB9, 0xD4, 0xF2, 0x0A, 0xFA, 0x0B, 0x19, 0xCA, 0x59, 0x45, 0x5F, 0x29, 0x4B, 0x4F, 0x21, 0xF3, + 0x93, 0xF7, 0x5C, 0xBC, 0x7E, 0xEC, 0xB6, 0x5F, 0xEC, 0xE0, 0xCF, 0xFE, 0xDB, 0x87, 0x8E, 0x4F, + 0xC0, 0xBE, 0xC3, 0x73, 0xFC, 0xFE, 0x9B, 0x4E, 0x61, 0xA0, 0x52, 0xB8, 0x6F, 0x74, 0xB8, 0xB2, + 0xED, 0xC5, 0x3D, 0xD9, 0x33, 0x5A, 0x47, 0x5A, 0x10, 0x77, 0x0F, 0x6D, 0x38, 0x30, 0x7E, 0x88, + 0xC3, 0xD3, 0x73, 0x0C, 0x57, 0x0A, 0x49, 0xB3, 0x22, 0xB5, 0xBA, 0x50, 0x2A, 0x59, 0x09, 0x76, + 0x85, 0x41, 0x18, 0xC5, 0xDC, 0x72, 0xCF, 0x7D, 0xFC, 0xE2, 0x89, 0xAD, 0xBC, 0xFF, 0xFA, 0xAB, + 0xC9, 0x64, 0x73, 0xFC, 0xD5, 0x97, 0xEE, 0xE4, 0xE1, 0xE7, 0x0F, 0x23, 0x32, 0x15, 0x54, 0xA6, + 0x88, 0x13, 0xFE, 0xD1, 0xD8, 0x7D, 0xAD, 0x47, 0x1A, 0x07, 0x6D, 0x0F, 0xCC, 0x7A, 0x92, 0xBE, + 0x62, 0x40, 0xCE, 0x13, 0x94, 0x32, 0x1E, 0x83, 0x3D, 0xB9, 0x89, 0x4A, 0x31, 0xFB, 0x9D, 0x4F, + 0x7F, 0xFB, 0x51, 0xF3, 0xF5, 0x9F, 0x1F, 0x9C, 0xF7, 0xD3, 0x63, 0x4A, 0xBA, 0x93, 0x57, 0xF4, + 0xB3, 0x62, 0xB8, 0xC2, 0xBB, 0x2E, 0x39, 0xE5, 0xC0, 0xC8, 0x50, 0xCF, 0xAD, 0x23, 0x4B, 0x7A, + 0x6D, 0xE0, 0x49, 0x9C, 0x8E, 0xB1, 0x71, 0x8C, 0x8B, 0x23, 0x84, 0x73, 0x3C, 0xBC, 0x65, 0x2F, + 0x9F, 0xFC, 0xDA, 0xF7, 0xA9, 0x35, 0x93, 0x56, 0xB5, 0x6B, 0x2B, 0x61, 0x8F, 0x6E, 0x62, 0x00, + 0xCC, 0x56, 0x6B, 0x7C, 0xE1, 0x5F, 0xEF, 0x60, 0xE7, 0xBE, 0x71, 0x3E, 0xFA, 0xBE, 0x7F, 0xC7, + 0xD8, 0x54, 0x9D, 0x0F, 0x7C, 0xEE, 0x76, 0x36, 0x3F, 0x37, 0x89, 0xCC, 0xF6, 0x23, 0xFD, 0x12, + 0x4E, 0x78, 0x09, 0x78, 0x6B, 0xE7, 0x09, 0xAF, 0x20, 0xDD, 0xD7, 0x38, 0x63, 0xC0, 0x18, 0x8A, + 0x81, 0x64, 0xB0, 0x14, 0x90, 0x55, 0xE0, 0x0B, 0x47, 0x7F, 0x4F, 0x8E, 0x81, 0x9E, 0xFC, 0x8F, + 0xD7, 0x2C, 0xEB, 0x7D, 0x6C, 0xB0, 0x27, 0xC7, 0x27, 0xDE, 0xB3, 0x7E, 0x1E, 0xDE, 0x45, 0x9F, + 0x68, 0x78, 0xDB, 0x7B, 0x6E, 0xE0, 0xEC, 0x2B, 0xDF, 0xC3, 0x60, 0x6F, 0x71, 0xAC, 0xD6, 0x08, + 0x2F, 0x9A, 0x98, 0x9C, 0x5D, 0x5A, 0xAF, 0x37, 0xD2, 0x8D, 0xCB, 0xA4, 0x06, 0x12, 0x52, 0xF2, + 0xC2, 0x9E, 0x71, 0xB0, 0x31, 0xE7, 0x9C, 0xB6, 0x16, 0x29, 0x8E, 0xBA, 0xBC, 0x73, 0x16, 0xA5, + 0x14, 0x63, 0x87, 0x27, 0xF9, 0xD2, 0xAD, 0x77, 0xB1, 0x6C, 0x68, 0x80, 0x6B, 0x2F, 0xBF, 0x88, + 0x7F, 0xFE, 0xFE, 0xC3, 0x7C, 0xEE, 0xF6, 0xCD, 0x4C, 0xB5, 0x02, 0xFC, 0x6C, 0x2F, 0x42, 0x65, + 0x93, 0x4D, 0x0C, 0x77, 0x34, 0x7E, 0x5F, 0xB3, 0xA4, 0x44, 0x28, 0x1C, 0xBD, 0x85, 0x80, 0xDE, + 0x82, 0x8F, 0x87, 0x45, 0x3A, 0x43, 0x4F, 0x21, 0x60, 0xF5, 0x48, 0xFF, 0xC4, 0xE8, 0x70, 0xE5, + 0xBF, 0xEE, 0x1A, 0x9B, 0x7A, 0xE1, 0x5D, 0x97, 0xAC, 0xE7, 0x8C, 0x13, 0x97, 0xBD, 0xBC, 0x07, + 0x00, 0xBC, 0xEB, 0xD2, 0x53, 0x39, 0x61, 0x49, 0x85, 0xF7, 0xFF, 0xF9, 0x97, 0xF7, 0xAC, 0x1C, + 0xE9, 0xFF, 0xA7, 0x55, 0xA3, 0x43, 0xAD, 0x5C, 0xC6, 0x07, 0x13, 0xE3, 0x74, 0x84, 0x8B, 0x63, + 0x30, 0x60, 0xC8, 0x72, 0xD3, 0x9D, 0x8F, 0x70, 0xF3, 0x5D, 0x9B, 0x41, 0xC8, 0xD4, 0xF2, 0x1A, + 0x29, 0x24, 0xDB, 0x76, 0xED, 0xE5, 0x96, 0xBB, 0x7F, 0xC2, 0x65, 0xE7, 0x9E, 0xC9, 0xC6, 0x53, + 0x4E, 0xE6, 0x23, 0x9F, 0xBF, 0x9D, 0xAF, 0xFE, 0xE0, 0x57, 0x84, 0xA2, 0x8C, 0x97, 0xE9, 0x01, + 0x19, 0x24, 0xC1, 0xFB, 0x2A, 0xAD, 0x8D, 0x4D, 0x4A, 0x5F, 0xD7, 0x65, 0x7D, 0x67, 0x4C, 0xD2, + 0x66, 0xF7, 0x04, 0xC3, 0x3D, 0x59, 0x2A, 0x39, 0x0F, 0x65, 0x0D, 0xC2, 0x18, 0xB2, 0x9E, 0x60, + 0x49, 0x5F, 0x89, 0xA1, 0x4A, 0xF1, 0xD6, 0xD3, 0x4F, 0x5C, 0xFA, 0xE0, 0xE8, 0x50, 0x99, 0x07, + 0xB6, 0x8C, 0x1D, 0x83, 0xF5, 0xB8, 0xCF, 0xB4, 0x5C, 0xF1, 0xCE, 0xF7, 0x71, 0xE9, 0xA5, 0x1B, + 0x59, 0x39, 0xD2, 0xBF, 0xAB, 0xD6, 0x08, 0xD7, 0xCF, 0xCC, 0xD5, 0x4F, 0x99, 0x9B, 0xAD, 0x61, + 0x8D, 0xE9, 0x2C, 0x71, 0x85, 0x90, 0xC4, 0x16, 0x1E, 0xDF, 0xF6, 0x02, 0xA5, 0xBC, 0xCF, 0xE9, + 0x27, 0xAD, 0x40, 0x08, 0xC1, 0xA3, 0x5B, 0x9F, 0x67, 0xDB, 0xCE, 0x3D, 0x5C, 0x7D, 0xE9, 0x05, + 0x3C, 0xBB, 0x77, 0x82, 0xBF, 0xFE, 0xE2, 0x77, 0xD9, 0xB6, 0x7F, 0x0E, 0x2F, 0xD7, 0x8B, 0xF4, + 0xF2, 0x20, 0xD5, 0xC2, 0xCC, 0xB6, 0xE0, 0x38, 0x4E, 0x93, 0xBD, 0x63, 0xF9, 0x84, 0x80, 0x40, + 0x0A, 0x7A, 0x0B, 0x01, 0x7D, 0xC5, 0x0C, 0x19, 0x05, 0xC2, 0x1A, 0xB0, 0x06, 0x5F, 0x3A, 0x06, + 0x7B, 0x0B, 0xAC, 0x5A, 0x3E, 0xF0, 0xCC, 0x09, 0x4B, 0x7B, 0xFF, 0x6A, 0xEF, 0x4B, 0xD3, 0x87, + 0x8E, 0xCC, 0x35, 0xF8, 0xD3, 0xAB, 0xDF, 0x70, 0xCC, 0x2D, 0x5F, 0xB6, 0x97, 0xED, 0x9C, 0xE3, + 0x23, 0x5F, 0xF8, 0x01, 0xC3, 0xFD, 0xE5, 0x33, 0x1E, 0x7B, 0x66, 0xF7, 0x2D, 0x0F, 0x3F, 0xF1, + 0xDC, 0xBA, 0x89, 0x89, 0x69, 0xAC, 0x13, 0xA0, 0x14, 0x42, 0x79, 0x08, 0x4F, 0x62, 0x6D, 0x4C, + 0xCE, 0x0B, 0xB9, 0xE1, 0xBA, 0xF3, 0x39, 0xF3, 0x94, 0x15, 0xF8, 0x9E, 0x60, 0x74, 0x64, 0x19, + 0x37, 0xDD, 0xFE, 0x33, 0x6E, 0xB9, 0xF7, 0x49, 0x42, 0x0A, 0xA8, 0x6C, 0x19, 0x21, 0x03, 0xE8, + 0xB4, 0xD5, 0x5F, 0xE5, 0x86, 0x62, 0x17, 0x49, 0xED, 0xFA, 0xC2, 0x93, 0x82, 0x62, 0xCE, 0xA7, + 0x9C, 0x0B, 0x08, 0x94, 0x40, 0xB8, 0xC4, 0x3B, 0x84, 0xB5, 0x28, 0x61, 0xA9, 0x14, 0x73, 0xAC, + 0x5D, 0xB9, 0x64, 0x76, 0xDD, 0xCA, 0xA1, 0x1B, 0x3E, 0xFD, 0xAD, 0x27, 0xBF, 0x79, 0xEB, 0xC7, + 0xAF, 0xE2, 0xE0, 0xAC, 0xE6, 0xDA, 0x0B, 0x4F, 0x7E, 0xF5, 0x1E, 0x00, 0xB0, 0xF6, 0xDC, 0x6B, + 0x19, 0x19, 0xAC, 0x70, 0xC3, 0xF5, 0x7F, 0xFB, 0xD2, 0x75, 0xEF, 0xB9, 0x6C, 0x3A, 0x36, 0xF6, + 0x92, 0xE9, 0xE9, 0x6A, 0x36, 0x6C, 0xB6, 0xDA, 0xFD, 0xC3, 0x64, 0xEA, 0x13, 0x8A, 0xD8, 0x08, + 0x1E, 0x79, 0x66, 0x27, 0xE3, 0x47, 0xA6, 0x59, 0x35, 0x3A, 0xC2, 0xA7, 0x6E, 0xBE, 0x9B, 0xEF, + 0x6D, 0x7E, 0x0E, 0xEB, 0xF5, 0x20, 0xFD, 0x22, 0x42, 0xFA, 0xB4, 0x5B, 0x54, 0x9D, 0x95, 0xC8, + 0xAB, 0x88, 0xEF, 0x76, 0x43, 0x03, 0xE7, 0xF0, 0xA4, 0xA0, 0x94, 0xF3, 0x18, 0x28, 0x65, 0x29, + 0x67, 0x3D, 0x3C, 0xE1, 0x10, 0x2E, 0xB1, 0xBA, 0xB0, 0x06, 0xE9, 0x0C, 0xA5, 0x5C, 0xC0, 0x8A, + 0x91, 0x7E, 0xBD, 0x72, 0xD9, 0xC0, 0x67, 0x2F, 0xD9, 0xB4, 0xE6, 0x4B, 0xAF, 0x5B, 0x3B, 0x60, + 0x9A, 0x91, 0xE6, 0xBA, 0x8B, 0x4E, 0x5D, 0x14, 0xE3, 0xCB, 0x12, 0xF0, 0x82, 0x38, 0x95, 0xB7, + 0x9F, 0xBF, 0x9E, 0xF3, 0xAF, 0x3C, 0x9B, 0x2B, 0xCE, 0x3B, 0xF5, 0xB9, 0x83, 0x93, 0x73, 0x26, + 0x36, 0xF6, 0xDC, 0xD9, 0xD9, 0xAA, 0x1F, 0x85, 0x61, 0x92, 0x14, 0xD3, 0x82, 0x45, 0x08, 0x09, + 0xD2, 0x63, 0xFF, 0xA1, 0x59, 0xEE, 0x7D, 0x78, 0x3B, 0x7B, 0x0F, 0xD7, 0xF1, 0x82, 0x12, 0xB2, + 0x93, 0xE8, 0x5C, 0x32, 0x5D, 0x39, 0x9B, 0x36, 0x57, 0xEC, 0xCB, 0x82, 0x4F, 0x4A, 0x59, 0x87, + 0xC4, 0x91, 0xF5, 0x25, 0x3D, 0xF9, 0xC4, 0xD5, 0x4B, 0x59, 0x2F, 0x59, 0x66, 0xBB, 0x04, 0xB4, + 0xE8, 0x80, 0xB7, 0x14, 0xB2, 0x3E, 0xA3, 0xCB, 0xFA, 0xDD, 0xE8, 0xB2, 0xFE, 0x7F, 0x1E, 0xEA, + 0x2F, 0xFF, 0x8D, 0xD1, 0xB6, 0xFE, 0xF4, 0xCE, 0x43, 0x7C, 0xF2, 0x5F, 0x1E, 0x60, 0xE4, 0x8C, + 0xB7, 0x52, 0x5C, 0x77, 0x19, 0xB3, 0xCF, 0xFE, 0xF8, 0xD5, 0x11, 0xD0, 0x73, 0xE5, 0x27, 0x31, + 0xD6, 0x32, 0x35, 0x53, 0xE7, 0xC7, 0x8F, 0xEF, 0xE2, 0xE3, 0xFF, 0xE1, 0x02, 0xBB, 0x7D, 0xFF, + 0xF4, 0x93, 0xBE, 0x92, 0xBE, 0xC5, 0x9D, 0x3D, 0x3B, 0x57, 0xF3, 0xA2, 0x56, 0x88, 0xB3, 0xA6, + 0xCB, 0xAA, 0x02, 0x21, 0x14, 0x0E, 0x0F, 0xA9, 0x32, 0x20, 0xD2, 0x32, 0xA3, 0x03, 0xD6, 0x76, + 0x48, 0xC0, 0x76, 0xC5, 0x73, 0x97, 0xE0, 0x2C, 0x12, 0x4B, 0xA0, 0x24, 0xC5, 0xAC, 0x47, 0x6F, + 0x21, 0xA0, 0x27, 0x1F, 0x90, 0x0B, 0x54, 0x62, 0x71, 0x6B, 0xBB, 0xC0, 0x5B, 0xB0, 0x1A, 0x89, + 0xA3, 0x90, 0xF5, 0x59, 0xBE, 0xB4, 0x8F, 0xE5, 0x4B, 0xFB, 0xEF, 0x40, 0x79, 0x37, 0x7E, 0xF4, + 0x8F, 0x2E, 0x3C, 0xFC, 0xC3, 0x83, 0x23, 0xF2, 0xF1, 0xE7, 0xC7, 0xC8, 0x67, 0x7C, 0x96, 0x0F, + 0x94, 0x78, 0xF1, 0xE0, 0x2C, 0x76, 0xF4, 0x42, 0xEC, 0x9E, 0xFB, 0x5F, 0x3E, 0x07, 0x8C, 0xBC, + 0xFD, 0xBF, 0x13, 0xC6, 0x86, 0xD8, 0x58, 0x02, 0x4F, 0x89, 0x30, 0xD2, 0x38, 0x10, 0xD5, 0x47, + 0x76, 0x8A, 0xF7, 0x7F, 0xFC, 0xBA, 0x12, 0x71, 0xF4, 0xD1, 0x67, 0x77, 0xEC, 0xFB, 0x4F, 0xDB, + 0x9F, 0x7B, 0x31, 0x37, 0x3B, 0x53, 0x4D, 0x16, 0x22, 0x52, 0xA5, 0x9B, 0x27, 0x5D, 0x67, 0xA9, + 0x40, 0x76, 0x6F, 0xA9, 0xB5, 0x5B, 0xEA, 0x47, 0x37, 0x58, 0x45, 0x5A, 0x40, 0x29, 0x25, 0xF1, + 0x3D, 0x45, 0x26, 0x50, 0x64, 0x03, 0x8F, 0xC0, 0x53, 0x28, 0x99, 0x36, 0x4D, 0xD2, 0x90, 0x11, + 0x38, 0x84, 0x73, 0x08, 0x12, 0x42, 0x85, 0xB3, 0x28, 0x01, 0xC5, 0x7C, 0x86, 0x91, 0xA5, 0x03, + 0x6E, 0xC9, 0x70, 0xDF, 0x9D, 0x73, 0x4D, 0x7D, 0xE3, 0x97, 0xBF, 0x76, 0xFF, 0xDE, 0xE2, 0x09, + 0x03, 0x90, 0x2C, 0x24, 0xAC, 0x00, 0x2B, 0xA5, 0x64, 0x76, 0xAE, 0xE1, 0xCE, 0x58, 0xBF, 0x9C, + 0xFE, 0x9E, 0x1C, 0xF7, 0x7E, 0xF6, 0xBD, 0xC7, 0xF7, 0x80, 0x81, 0x8D, 0x57, 0xB2, 0xB4, 0xAF, + 0xC8, 0x4C, 0x2D, 0x14, 0xAD, 0x48, 0x0B, 0x92, 0xE9, 0xD2, 0x0B, 0x46, 0xFA, 0x82, 0xCD, 0xCF, + 0xEC, 0xC5, 0xCF, 0x66, 0x9F, 0x3A, 0x69, 0xC5, 0x60, 0x54, 0x2C, 0x64, 0x4F, 0x0B, 0xC3, 0x28, + 0x17, 0xB6, 0x42, 0x9C, 0xD1, 0x47, 0x2D, 0x6B, 0xDB, 0x96, 0xB2, 0x88, 0xD4, 0xE5, 0x85, 0x4B, + 0xF6, 0x18, 0x14, 0xC9, 0xE3, 0x6C, 0x81, 0x92, 0xE4, 0x03, 0x45, 0x21, 0xA3, 0x28, 0xE5, 0x7C, + 0xCA, 0x39, 0x9F, 0x52, 0xC6, 0x23, 0xEB, 0x2B, 0x7C, 0x49, 0xBA, 0x1F, 0x69, 0x13, 0x4B, 0xBB, + 0x64, 0x5E, 0x17, 0xCE, 0x20, 0xAC, 0xEE, 0xC4, 0x7B, 0x20, 0x05, 0xBD, 0xE5, 0x02, 0xA3, 0xCB, + 0x06, 0xA3, 0x9E, 0x4A, 0xE9, 0xDB, 0x5B, 0xF6, 0x4C, 0xFE, 0xFD, 0x6D, 0x3F, 0x7F, 0xF6, 0x48, + 0x71, 0xA0, 0x94, 0xCE, 0xB1, 0x47, 0x0D, 0x6C, 0xAD, 0x25, 0x97, 0x0B, 0xB8, 0xEA, 0x9C, 0x93, + 0x68, 0x86, 0x9A, 0x0F, 0xDF, 0xF8, 0x5F, 0xB8, 0xEB, 0xFF, 0xDC, 0xB4, 0x88, 0x07, 0x9C, 0xFF, + 0x31, 0x0A, 0xD9, 0x00, 0x29, 0x05, 0xCE, 0x39, 0x91, 0xEA, 0xAC, 0x00, 0x1F, 0xC8, 0x00, 0x39, + 0x6D, 0x6C, 0xA6, 0x98, 0xCF, 0xE4, 0x2F, 0xDA, 0xB8, 0xFC, 0x2A, 0x11, 0x87, 0x37, 0xEC, 0xDD, + 0x3B, 0xBE, 0x6A, 0x7C, 0x7C, 0x82, 0x66, 0xB3, 0x99, 0xF6, 0x03, 0x12, 0xEB, 0x0B, 0x25, 0x91, + 0x4A, 0xCD, 0x93, 0xF6, 0x66, 0x87, 0x52, 0xE9, 0x76, 0x7B, 0xBB, 0x84, 0xEE, 0xB4, 0xC8, 0x44, + 0x47, 0x73, 0x21, 0xDA, 0x0F, 0x45, 0xBA, 0xA4, 0x35, 0x8F, 0x43, 0xE0, 0x50, 0x02, 0xB2, 0xD9, + 0x80, 0x81, 0xBE, 0x1E, 0x06, 0x06, 0x7B, 0xA7, 0x5B, 0x56, 0xDE, 0xF6, 0xC0, 0xD6, 0x03, 0xDF, + 0x7A, 0x69, 0xB2, 0x36, 0xE3, 0x7B, 0x32, 0x22, 0xF9, 0xEF, 0x93, 0x56, 0x7A, 0x0E, 0x81, 0x18, + 0xD0, 0x4A, 0x0A, 0x7B, 0xCE, 0xA9, 0xA3, 0xEE, 0x47, 0x9F, 0xF9, 0xA6, 0xBB, 0xEB, 0xA1, 0xCF, + 0x72, 0xF5, 0xB9, 0x27, 0x2F, 0xE2, 0x01, 0xA3, 0x17, 0x12, 0xCF, 0x35, 0x50, 0x59, 0x5F, 0xC8, + 0x64, 0x1D, 0xAB, 0x80, 0x00, 0xC8, 0x02, 0x45, 0xA0, 0x2C, 0xA5, 0xE8, 0x8D, 0xB5, 0xED, 0xDB, + 0x31, 0x36, 0x3D, 0xE3, 0x67, 0x33, 0x2F, 0xAE, 0x1C, 0x19, 0x2C, 0xF4, 0xF5, 0x14, 0x87, 0x04, + 0x78, 0xCE, 0x18, 0x04, 0x16, 0x25, 0x93, 0xAC, 0xED, 0x49, 0x50, 0x42, 0xA0, 0x64, 0xD2, 0x29, + 0x92, 0x24, 0x22, 0x52, 0x0B, 0xCB, 0xD4, 0xA5, 0x85, 0x33, 0xF3, 0x2C, 0x9E, 0x48, 0x12, 0xE7, + 0xC2, 0x26, 0xF7, 0x94, 0x58, 0xB2, 0xBE, 0x47, 0x6F, 0xA5, 0xC8, 0xB2, 0xA5, 0x03, 0xA6, 0x50, + 0x2E, 0xBD, 0xB0, 0xF3, 0x70, 0xED, 0xF6, 0x9F, 0x3D, 0xBD, 0xEF, 0xF1, 0x5A, 0x33, 0xCA, 0x78, + 0x4A, 0x16, 0x52, 0x23, 0xB5, 0x9F, 0x96, 0x4A, 0xD8, 0x4B, 0x43, 0xC1, 0x5A, 0xE7, 0xC2, 0x48, + 0xBB, 0xBF, 0xFC, 0xE8, 0x3B, 0xF9, 0xE5, 0x96, 0xFD, 0x3C, 0x75, 0xDF, 0xAD, 0xC7, 0x12, 0x50, + 0x38, 0xF9, 0xCD, 0x54, 0x7A, 0x8B, 0x44, 0xDA, 0x08, 0x29, 0x84, 0x24, 0x59, 0x30, 0x05, 0x40, + 0x1E, 0x28, 0x03, 0xBD, 0x40, 0xBF, 0x10, 0x0C, 0x48, 0x21, 0x06, 0x0F, 0x4D, 0x37, 0xBC, 0x03, + 0x53, 0x8D, 0x03, 0x95, 0x9E, 0xE2, 0xDC, 0x8A, 0x65, 0x03, 0xA5, 0x9E, 0x52, 0xBE, 0x20, 0x85, + 0x94, 0xAE, 0xAB, 0x7A, 0x4B, 0x2C, 0x67, 0x3B, 0xC0, 0x65, 0x1A, 0xCB, 0x12, 0xDB, 0x05, 0xD6, + 0xCE, 0x07, 0x9E, 0x82, 0x97, 0x24, 0x44, 0x66, 0x03, 0x9F, 0xDE, 0x9E, 0x22, 0x4B, 0x87, 0xFB, + 0xE9, 0x1B, 0xE8, 0x9D, 0x3E, 0xDC, 0x30, 0x8F, 0x6D, 0x7E, 0xEE, 0xE0, 0x43, 0xBB, 0xC6, 0x67, + 0x66, 0x85, 0xA0, 0x24, 0x84, 0x28, 0xA4, 0x46, 0x0A, 0xBA, 0x42, 0xDB, 0x92, 0xF4, 0xD0, 0x34, + 0x60, 0x85, 0x10, 0xB6, 0x15, 0x6A, 0xFA, 0x4A, 0x39, 0xB7, 0xEB, 0xC0, 0x24, 0xFB, 0x1E, 0xBF, + 0xEB, 0x58, 0x02, 0xD6, 0x5F, 0x70, 0x1D, 0x2B, 0x86, 0x7B, 0x38, 0x3C, 0x5D, 0x97, 0x2E, 0x8D, + 0xFD, 0x94, 0xD5, 0x36, 0x01, 0x15, 0xA0, 0xAF, 0x2D, 0x52, 0x88, 0x5E, 0xAD, 0x6D, 0x79, 0x7C, + 0xAA, 0xD6, 0x3C, 0x52, 0x8B, 0x0F, 0xF6, 0xF4, 0x94, 0x1A, 0xCB, 0x96, 0xF4, 0x65, 0x06, 0x7A, + 0xCB, 0x99, 0x6C, 0x36, 0x90, 0x2A, 0xDD, 0x5D, 0x92, 0x0B, 0xAC, 0xDF, 0x26, 0xA1, 0x9D, 0xD4, + 0xDA, 0x16, 0x4E, 0xBC, 0x24, 0x79, 0x04, 0x37, 0x1B, 0xF8, 0x14, 0x8B, 0x39, 0x06, 0xFA, 0x7A, + 0x18, 0x1E, 0xEE, 0xB7, 0xA5, 0x4A, 0xCF, 0xDC, 0x74, 0xC4, 0xCE, 0x27, 0x76, 0x4F, 0x3E, 0xB3, + 0x6D, 0xEF, 0xE4, 0xC1, 0x30, 0xD2, 0x9E, 0x94, 0x22, 0x9F, 0xEA, 0x17, 0xA4, 0xBA, 0xB6, 0x9F, + 0x59, 0x35, 0xA9, 0xEB, 0x47, 0xED, 0x10, 0x20, 0xE9, 0x9C, 0xB9, 0xB1, 0x23, 0x73, 0xEE, 0xE0, + 0x74, 0x83, 0xE6, 0x0B, 0xF7, 0x1D, 0xBB, 0x1C, 0x56, 0x69, 0x5C, 0x2E, 0xD8, 0x67, 0x6C, 0x27, + 0x42, 0x95, 0x0E, 0xE2, 0xA7, 0x03, 0x06, 0x40, 0x46, 0x08, 0x32, 0x02, 0x91, 0x99, 0xA9, 0x35, + 0x79, 0xF4, 0x85, 0xE6, 0xDE, 0x52, 0x3E, 0x33, 0x31, 0x3A, 0x50, 0x1C, 0x58, 0x32, 0xB4, 0x64, + 0xC9, 0xE0, 0x12, 0xD7, 0x6F, 0xA2, 0xB0, 0xD0, 0x6A, 0xB6, 0xBC, 0x56, 0x2B, 0x24, 0x8A, 0x22, + 0x74, 0x6C, 0xB0, 0xF6, 0x68, 0x67, 0x56, 0x4A, 0x81, 0x54, 0x12, 0xDF, 0xF3, 0x08, 0x02, 0x9F, + 0x4C, 0x26, 0x20, 0x9B, 0xCD, 0x90, 0xCB, 0x65, 0x8D, 0xF4, 0xFD, 0x56, 0xD3, 0x30, 0xB3, 0x6F, + 0xA6, 0x75, 0x68, 0xCF, 0xC4, 0xF4, 0x91, 0xA9, 0xB9, 0x56, 0xDD, 0xE1, 0xAC, 0x14, 0x22, 0x07, + 0x22, 0x4E, 0xC1, 0xB5, 0x5D, 0x3D, 0xEE, 0xD2, 0xCB, 0x4B, 0xF5, 0x95, 0xA9, 0x74, 0xF2, 0x9D, + 0x36, 0x4E, 0xD8, 0x74, 0xBD, 0x7E, 0x0C, 0x01, 0xA6, 0xF3, 0x9C, 0xCE, 0xBC, 0x8F, 0xDB, 0x71, + 0xD4, 0xCD, 0x6A, 0x98, 0x4A, 0x7B, 0x5F, 0xDA, 0x09, 0x21, 0xAC, 0x00, 0xAF, 0xD6, 0x88, 0xEC, + 0xB6, 0xBD, 0x93, 0x8D, 0xE7, 0x95, 0x1C, 0xAB, 0x14, 0x32, 0xB9, 0xC1, 0x9E, 0x5C, 0xB9, 0xBF, + 0x58, 0xAE, 0x94, 0xCB, 0xB2, 0xE4, 0x4B, 0xF2, 0x9E, 0x20, 0x27, 0x70, 0x7E, 0xB2, 0xA9, 0x97, + 0xF4, 0x4B, 0xA4, 0x94, 0x0E, 0x21, 0x63, 0xED, 0x68, 0xC5, 0x96, 0x66, 0x2B, 0xB6, 0xF5, 0xF1, + 0xE9, 0x70, 0xF6, 0xD0, 0xCC, 0xDC, 0xDC, 0x74, 0xAD, 0xD5, 0x88, 0x62, 0xA3, 0x11, 0x38, 0x29, + 0x84, 0x15, 0x49, 0x73, 0xBC, 0xAD, 0x4B, 0x9C, 0xEA, 0xD1, 0xEA, 0xD2, 0xA9, 0x93, 0xF8, 0xDA, + 0xF1, 0xDF, 0x6D, 0xCE, 0xC0, 0x57, 0xAE, 0xFD, 0xF6, 0x18, 0x02, 0x76, 0x8D, 0x4F, 0x93, 0xCF, + 0xD4, 0x88, 0x8D, 0x71, 0x4A, 0xCA, 0x36, 0x70, 0x9D, 0x82, 0x6E, 0x74, 0x25, 0x19, 0xD2, 0x41, + 0x9A, 0x69, 0xEC, 0x65, 0xD3, 0xCF, 0x93, 0xC7, 0x78, 0x84, 0xF0, 0x9C, 0x73, 0x72, 0xAA, 0xDA, + 0x94, 0x47, 0xE6, 0x9A, 0x07, 0x85, 0x40, 0x7A, 0x4A, 0xAA, 0x8C, 0xEF, 0x79, 0xB9, 0x8C, 0xE7, + 0x67, 0x7D, 0x15, 0x28, 0x21, 0x54, 0xBA, 0x45, 0xE3, 0xAC, 0xC5, 0x46, 0xDA, 0xE8, 0x46, 0x18, + 0xC7, 0xAD, 0xC8, 0xC4, 0xDA, 0x58, 0x6B, 0x9D, 0xB3, 0x49, 0x57, 0x5E, 0x38, 0x29, 0x85, 0x65, + 0x7E, 0x4C, 0xEB, 0x2E, 0xBD, 0xDA, 0x04, 0x34, 0x80, 0x2A, 0x30, 0x9B, 0x9E, 0x1B, 0xE9, 0x77, + 0x6D, 0x22, 0x9C, 0xA7, 0x04, 0x6F, 0x39, 0x7B, 0x2D, 0xBB, 0xC7, 0xA6, 0xF8, 0xE9, 0x62, 0x04, + 0xD4, 0x1B, 0x21, 0xF5, 0x23, 0x73, 0xE4, 0xFA, 0x8A, 0xDD, 0x96, 0x6F, 0x03, 0x6D, 0x67, 0x56, + 0x9D, 0xBE, 0xAF, 0x02, 0xB9, 0x14, 0x7C, 0x9B, 0x98, 0xB6, 0x78, 0x80, 0x12, 0x42, 0x28, 0x95, + 0xFC, 0xC3, 0x98, 0xB4, 0xD6, 0xC9, 0x46, 0x2B, 0x16, 0xF5, 0x56, 0x24, 0xE9, 0xD8, 0xE0, 0xA8, + 0x6B, 0x0A, 0x91, 0xB4, 0xD4, 0x84, 0x48, 0xB6, 0x23, 0x94, 0xE8, 0x80, 0xEE, 0x06, 0xDF, 0x4D, + 0x40, 0xDB, 0x1B, 0x23, 0x8E, 0x4E, 0x7B, 0x0D, 0xA0, 0x96, 0xEA, 0x56, 0x4D, 0x3F, 0x8B, 0x01, + 0xE3, 0x9C, 0x73, 0xC3, 0xBD, 0x25, 0xF7, 0xBA, 0x93, 0x96, 0x52, 0xC8, 0x07, 0x8B, 0x13, 0x80, + 0x10, 0xE4, 0xFB, 0x4B, 0x48, 0x21, 0x3A, 0x2D, 0xC0, 0x54, 0xC9, 0xB0, 0x2B, 0xB9, 0x84, 0xE9, + 0x20, 0x6D, 0xCB, 0xB7, 0xE3, 0xAE, 0x1B, 0x7C, 0x3B, 0x06, 0xDB, 0x71, 0xA8, 0x20, 0x9D, 0xF2, + 0x11, 0xB2, 0xB3, 0x39, 0x37, 0x9F, 0x04, 0xD7, 0x75, 0xB6, 0x5D, 0xE7, 0xE3, 0x59, 0x7F, 0x31, + 0x12, 0x42, 0xE6, 0xD7, 0x01, 0xED, 0x24, 0x68, 0x00, 0xE7, 0xFB, 0xCA, 0x7D, 0xE0, 0xBA, 0x73, + 0x78, 0x70, 0xCB, 0x5E, 0x3E, 0xB7, 0x28, 0x01, 0x0F, 0x7E, 0x02, 0xF9, 0xE6, 0x4F, 0x2C, 0x8C, + 0x7F, 0xDD, 0xA5, 0x8C, 0x4E, 0x6F, 0xEE, 0x2F, 0x22, 0x0B, 0x81, 0x77, 0x13, 0xD0, 0x9D, 0x8C, + 0xDA, 0x49, 0xF5, 0x78, 0xC7, 0xF1, 0x08, 0x68, 0x8F, 0x6F, 0xBA, 0xA4, 0x1D, 0xEB, 0x71, 0x97, + 0x44, 0x5D, 0x9F, 0xB5, 0xAF, 0x77, 0x80, 0xDB, 0xB6, 0x65, 0x3F, 0x1B, 0xFE, 0xE8, 0xF3, 0x8C, + 0x4D, 0xCC, 0xC1, 0xA2, 0x04, 0x1C, 0xAB, 0x48, 0xFB, 0xDC, 0x4D, 0x40, 0xDC, 0x65, 0xD5, 0xC5, + 0xC0, 0x76, 0xBF, 0x6E, 0x17, 0x53, 0x62, 0x81, 0xBC, 0x12, 0x01, 0xDD, 0x63, 0x2E, 0x46, 0x84, + 0x59, 0x40, 0x48, 0x77, 0x88, 0x98, 0x45, 0xAE, 0x47, 0x08, 0xE1, 0x0A, 0x03, 0x45, 0x76, 0x8D, + 0x4D, 0x71, 0xFD, 0x25, 0x1B, 0xE7, 0xB9, 0xDE, 0x31, 0x47, 0x71, 0xBE, 0x17, 0x74, 0x5F, 0xDB, + 0x0D, 0xA0, 0xFB, 0xB5, 0x5C, 0xE4, 0xBB, 0xEE, 0xCF, 0xBA, 0x85, 0x45, 0xCE, 0x0B, 0x09, 0x5F, + 0x48, 0xC4, 0x42, 0x42, 0x16, 0x92, 0xB3, 0xF0, 0xBC, 0xF0, 0xF7, 0x9D, 0xA3, 0x76, 0xEF, 0xC7, + 0x8E, 0x01, 0xF5, 0x6A, 0x49, 0x58, 0x4C, 0xF1, 0x85, 0xC4, 0x74, 0xBF, 0x7E, 0x25, 0xC0, 0xAF, + 0x74, 0x1C, 0x8F, 0x90, 0xC5, 0xC8, 0xE1, 0x65, 0xCE, 0x8B, 0x82, 0x07, 0xF8, 0xBF, 0xBC, 0x7A, + 0x38, 0x97, 0x7C, 0xD1, 0xFC, 0xA1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, + 0x74, 0x65, 0x3A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x32, 0x30, 0x2D, 0x30, + 0x33, 0x2D, 0x31, 0x39, 0x54, 0x31, 0x30, 0x3A, 0x35, 0x30, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x30, + 0x3A, 0x30, 0x30, 0x62, 0x40, 0x28, 0xF1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, + 0x61, 0x74, 0x65, 0x3A, 0x6D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x39, 0x2D, + 0x30, 0x31, 0x2D, 0x30, 0x38, 0x54, 0x31, 0x35, 0x3A, 0x35, 0x34, 0x3A, 0x32, 0x33, 0x2B, 0x30, + 0x30, 0x3A, 0x30, 0x30, 0x8A, 0xEF, 0xF9, 0x19, 0x00, 0x00, 0x00, 0x20, 0x74, 0x45, 0x58, 0x74, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, + 0x2F, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x6D, 0x61, 0x67, 0x69, 0x63, 0x6B, 0x2E, 0x6F, 0x72, 0x67, + 0xBC, 0xCF, 0x1D, 0x9D, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3A, 0x3A, 0x50, 0x61, 0x67, + 0x65, 0x73, 0x00, 0x31, 0xA7, 0xFF, 0xBB, 0x2F, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, + 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3A, 0x3A, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x00, 0x31, 0x32, 0x38, 0x43, 0x7C, 0x41, 0x80, 0x00, 0x00, 0x00, 0x17, + 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, + 0x3A, 0x3A, 0x57, 0x69, 0x64, 0x74, 0x68, 0x00, 0x31, 0x32, 0x38, 0xD0, 0x8D, 0x11, 0xDD, 0x00, + 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x4D, 0x69, + 0x6D, 0x65, 0x74, 0x79, 0x70, 0x65, 0x00, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, + 0x3F, 0xB2, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x4D, 0x54, 0x69, 0x6D, 0x65, 0x00, 0x31, 0x35, 0x34, 0x36, 0x39, 0x36, 0x32, + 0x38, 0x36, 0x33, 0x1F, 0x1E, 0xB3, 0x01, 0x00, 0x00, 0x00, 0x12, 0x74, 0x45, 0x58, 0x74, 0x54, + 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x31, 0x39, 0x32, 0x37, 0x34, + 0x42, 0x0A, 0x19, 0xAB, 0x42, 0x00, 0x00, 0x00, 0x56, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, + 0x6D, 0x62, 0x3A, 0x3A, 0x55, 0x52, 0x49, 0x00, 0x66, 0x69, 0x6C, 0x65, 0x3A, 0x2F, 0x2F, 0x2F, + 0x64, 0x61, 0x74, 0x61, 0x2F, 0x77, 0x77, 0x77, 0x72, 0x6F, 0x6F, 0x74, 0x2F, 0x77, 0x77, 0x77, + 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x6E, 0x65, 0x74, 0x2F, 0x63, 0x64, + 0x6E, 0x2D, 0x69, 0x6D, 0x67, 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x63, + 0x6E, 0x2F, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x2F, 0x32, 0x2F, 0x32, 0x39, 0x31, 0x36, 0x35, 0x2E, + 0x70, 0x6E, 0x67, 0xBF, 0x98, 0x5F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, + 0x42, 0x60, 0x82 +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c index e7329d8a..31131578 100644 --- a/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c +++ b/LinuxGUI/Ventoy2Disk/Web/ventoy_http.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -40,9 +41,13 @@ #include #include "fat_filelib.h" +static char *g_pub_out_buf = NULL; +static int g_pub_out_max = 0; + static pthread_mutex_t g_api_mutex; static char g_cur_language[128]; static int g_cur_part_style = 0; +static int g_cur_show_all = 0; static char g_cur_server_token[64]; static struct mg_context *g_ventoy_http_ctx = NULL; @@ -52,8 +57,8 @@ static uint8_t *g_grub_stg1_raw_img = NULL; static char g_cur_process_diskname[64]; static char g_cur_process_type[64]; -static int g_cur_process_result = 0; -static PROGRESS_POINT g_current_progress = PT_FINISH; +static volatile int g_cur_process_result = 0; +static volatile PROGRESS_POINT g_current_progress = PT_FINISH; static int ventoy_load_mbr_template(void) { @@ -156,13 +161,15 @@ static int ventoy_http_save_cfg(void) { FILE *fp; - fp = fopen("./Ventoy2Disk.ini", "w"); + fp = fopen(g_ini_file, "w"); if (!fp) { + vlog("Failed to open %s code:%d\n", g_ini_file, errno); return 0; } - fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\n", g_cur_language, g_cur_part_style); + fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\nShowAllDevice=%d\n", + g_cur_language, g_cur_part_style, g_cur_show_all); fclose(fp); return 0; @@ -175,7 +182,7 @@ static int ventoy_http_load_cfg(void) char line[256]; FILE *fp; - fp = fopen("./Ventoy2Disk.ini", "r"); + fp = fopen(g_ini_file, "r"); if (!fp) { return 0; @@ -205,6 +212,10 @@ static int ventoy_http_load_cfg(void) { g_cur_part_style = (int)strtol(line + strlen("PartStyle="), NULL, 10); } + else if (strncmp(line, "ShowAllDevice=", strlen("ShowAllDevice=")) == 0) + { + g_cur_show_all = (int)strtol(line + strlen("ShowAllDevice="), NULL, 10); + } } fclose(fp); @@ -214,23 +225,47 @@ static int ventoy_http_load_cfg(void) static int ventoy_json_result(struct mg_connection *conn, const char *err) { - mg_printf(conn, - "HTTP/1.1 200 OK \r\n" - "Content-Type: application/json\r\n" - "Content-Length: %d\r\n" - "\r\n%s", - (int)strlen(err), err); + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + (int)strlen(err), err); + } + else + { + memcpy(g_pub_out_buf, err, (int)strlen(err) + 1); + } + return 0; } static int ventoy_json_buffer(struct mg_connection *conn, const char *json_buf, int json_len) { - mg_printf(conn, - "HTTP/1.1 200 OK \r\n" - "Content-Type: application/json\r\n" - "Content-Length: %d\r\n" - "\r\n%s", - json_len, json_buf); + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + json_len, json_buf); + } + else + { + if (json_len >= g_pub_out_max) + { + vlog("json buffer overflow\n"); + } + else + { + memcpy(g_pub_out_buf, json_buf, json_len); + g_pub_out_buf[json_len] = 0; + } + } + return 0; } @@ -1369,6 +1404,41 @@ static int ventoy_json_handler(struct mg_connection *conn, VTOY_JSON *json) return 0; } +int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen) +{ + int i; + const char *method = NULL; + VTOY_JSON *json = NULL; + + g_pub_out_buf = jsonbuf; + g_pub_out_max = buflen; + + json = vtoy_json_create(); + if (JSON_SUCCESS == vtoy_json_parse(json, jsonstr)) + { + pthread_mutex_lock(&g_api_mutex); + + method = vtoy_json_get_string_ex(json->pstChild, "method"); + for (i = 0; i < (int)(sizeof(g_ventoy_json_cb) / sizeof(g_ventoy_json_cb[0])); i++) + { + if (method && strcmp(method, g_ventoy_json_cb[i].method) == 0) + { + g_ventoy_json_cb[i].callback(NULL, json->pstChild); + break; + } + } + + pthread_mutex_unlock(&g_api_mutex); + } + else + { + ventoy_json_result(NULL, VTOY_JSON_INVALID_RET); + } + + vtoy_json_destroy(json); + return 0; +} + static int ventoy_request_handler(struct mg_connection *conn) { int post_data_len; @@ -1431,7 +1501,7 @@ int ventoy_http_start(const char *ip, const char *port) { "listening_ports", "24680", "document_root", "WebUI", - "error_log_file", VTOY_LOG_FILE, + "error_log_file", g_log_file, "request_timeout_ms", "10000", NULL }; @@ -1481,3 +1551,77 @@ void ventoy_http_exit(void) g_efi_part_raw_img = NULL; } + +const char * ventoy_code_get_cur_language(void) +{ + return g_cur_language; +} + +int ventoy_code_get_cur_part_style(void) +{ + return g_cur_part_style; +} + +void ventoy_code_set_cur_part_style(int style) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_part_style = style; + ventoy_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +int ventoy_code_get_cur_show_all(void) +{ + return g_cur_show_all; +} + +void ventoy_code_set_cur_show_all(int show_all) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_show_all = show_all; + ventoy_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void ventoy_code_set_cur_language(const char *lang) +{ + pthread_mutex_lock(&g_api_mutex); + + scnprintf(g_cur_language, "%s", lang); + ventoy_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void ventoy_code_refresh_device(void) +{ + if (g_current_progress == PT_FINISH) + { + g_disk_num = 0; + ventoy_disk_enumerate_all(); + } +} + +int ventoy_code_is_busy(void) +{ + return (g_current_progress == PT_FINISH) ? 0 : 1; +} + +int ventoy_code_get_percent(void) +{ + return g_current_progress * 100 / PT_FINISH; +} + +int ventoy_code_get_result(void) +{ + return g_cur_process_result; +} + +void ventoy_code_save_cfg(void) +{ + ventoy_http_save_cfg(); +} diff --git a/LinuxGUI/Ventoy2Disk/main_gtk.c b/LinuxGUI/Ventoy2Disk/main_gtk.c new file mode 100644 index 00000000..a2b96aa5 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/main_gtk.c @@ -0,0 +1,230 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ventoy_gtk.h" + +static int g_kiosk_mode = 0; +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + +static int set_image_from_pixbuf(GtkBuilder *pBuilder, const char *id, const void *pData, int len) +{ + GtkImage *pImage = NULL; + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pImage = (GtkImage *)gtk_builder_get_object(pBuilder, id); + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + gtk_image_set_from_pixbuf(pImage, pPixbuf); + + return 0; +} + +static int set_window_icon_from_pixbuf(GtkWindow *window, const void *pData, int len) +{ + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + + gtk_window_set_icon(window, pPixbuf); + return 0; +} + +int early_msgbox(GtkMessageType type, GtkButtonsType buttons, const char *str) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox= gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, str); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + +static int adjust_cur_dir(char *argv0) +{ + int ret = 2; + char c; + char *pos = NULL; + char *end = NULL; + + if (argv0[0] == '.') + { + return 1; + } + + for (pos = argv0; pos && *pos; pos++) + { + if (*pos == '/') + { + end = pos; + } + } + + if (end) + { + c = *end; + *end = 0; + + pos = strstr(argv0, "/tool/"); + if (pos) + { + *pos = 0; + } + + ret = chdir(argv0); + + *end = c; + if (pos) + { + *pos = '/'; + } + } + + return ret; +} + +int main(int argc, char *argv[]) +{ + int i; + int len; + const void *pData = NULL; + GtkWidget *pWidget = NULL; + GtkBuilder *pBuilder = NULL; + GError *error = NULL; + struct stat logstat; + + gtk_init(&argc, &argv); + + if (geteuid() != 0) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "Ventoy2Disk permission denied!\r\nPlease run with root privileges."); + return EACCES; + } + + if (access("./boot/boot.img", F_OK) == -1) + { + adjust_cur_dir(argv[0]); + } + + if (access("./boot/boot.img", F_OK) == -1) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please run under the correct directory."); + return 1; + } + + for (i = 0; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--kiosk") == 0) + { + g_kiosk_mode = 1; + break; + } + } + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Ventoy2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + memset(&logstat, 0, sizeof(logstat)); + if (0 == stat(g_log_file, &logstat)) + { + if (logstat.st_size >= 4 * SIZE_1MB) + { + remove(g_log_file); + } + } + + ventoy_log_init(); + + vlog("================================================\n"); + vlog("===== Ventoy2Disk %s powered by GTK%d.x =====\n", ventoy_get_local_version(), GTK_MAJOR_VERSION); + vlog("================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)logstat.st_size); + vlog("ini file is <%s>\n", g_ini_file); + + ventoy_disk_init(); + + ventoy_http_init(); + + pBuilder = gtk_builder_new(); + if (!pBuilder) + { + vlog("failed to create builder\n"); + return 1; + } + + if (!gtk_builder_add_from_file(pBuilder, "./tool/VentoyGTK.glade", &error)) + { + vlog("gtk_builder_add_from_file failed:%s\n", error->message); + g_clear_error(&error); + return 1; + } + + if (g_kiosk_mode) + { + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_refresh"), "/ventoy/refresh.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_local"), "/ventoy/secure.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_dev"), "/ventoy/secure.png"); + } + else + { + pData = get_refresh_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_refresh", pData, len); + pData = get_secure_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_secure_local", pData, len); + set_image_from_pixbuf(pBuilder, "image_secure_dev", pData, len); + } + + pWidget = GTK_WIDGET(gtk_builder_get_object(pBuilder, "window")); + gtk_widget_show_all(pWidget); + + pData = get_window_icon_raw_data(&len); + set_window_icon_from_pixbuf(GTK_WINDOW(pWidget), pData, len); + + on_init_window(pBuilder); + g_signal_connect(G_OBJECT(pWidget), "delete_event", G_CALLBACK(on_exit_window), NULL); + g_signal_connect(G_OBJECT(pWidget), "destroy", G_CALLBACK(gtk_main_quit), NULL); + + gtk_main(); + + ventoy_disk_exit(); + ventoy_http_exit(); + + g_object_unref (G_OBJECT(pBuilder)); + + vlog("######## Ventoy2Disk GTK %s exit ########\n", ventoy_get_local_version()); + + /* log exit must at the end */ + ventoy_log_exit(); + return 0; +} + diff --git a/LinuxGUI/Ventoy2Disk/main.c b/LinuxGUI/Ventoy2Disk/main_webui.c similarity index 72% rename from LinuxGUI/Ventoy2Disk/main.c rename to LinuxGUI/Ventoy2Disk/main_webui.c index e12208ef..2b782cc5 100644 --- a/LinuxGUI/Ventoy2Disk/main.c +++ b/LinuxGUI/Ventoy2Disk/main_webui.c @@ -7,12 +7,17 @@ #include #include #include +#include +#include #include #include #include #include #include +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + int ventoy_log_init(void); void ventoy_log_exit(void); @@ -30,6 +35,7 @@ void ventoy_signal_stop(int sig) int main(int argc, char **argv) { + int i; int rc; const char *ip = "127.0.0.1"; const char *port = "24680"; @@ -50,6 +56,20 @@ int main(int argc, char **argv) port = argv[2]; } + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Ventoy2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + ventoy_log_init(); vlog("===============================================\n"); diff --git a/LinuxGUI/Ventoy2Disk/ventoy_gui.c b/LinuxGUI/Ventoy2Disk/ventoy_gui.c new file mode 100644 index 00000000..2616f5e0 --- /dev/null +++ b/LinuxGUI/Ventoy2Disk/ventoy_gui.c @@ -0,0 +1,1285 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ventoy_json.h" + +#define LIB_FLAG_GTK2 (1 << 0) +#define LIB_FLAG_GTK3 (1 << 1) +#define LIB_FLAG_GTK4 (1 << 2) +#define LIB_FLAG_QT4 (1 << 3) +#define LIB_FLAG_QT5 (1 << 4) +#define LIB_FLAG_QT6 (1 << 5) +#define LIB_FLAG_GLADE2 (1 << 30) + +#define LIB_FLAG_GTK (LIB_FLAG_GTK2 | LIB_FLAG_GTK3 | LIB_FLAG_GTK4) +#define LIB_FLAG_QT (LIB_FLAG_QT4 | LIB_FLAG_QT5 | LIB_FLAG_QT6) + +#define MAX_PARAS 64 +#define MAX_LOG_BUF (1024 * 1024) +#define VTOY_GUI_PATH "_vtoy_gui_path_=" +#define VTOY_ENV_STR "_vtoy_env_str_=" +#define LD_CACHE_FILE "/etc/ld.so.cache" +#define INT2STR_YN(a) ((a) == 0 ? "NO" : "YES") + +static int g_xdg_log = 0; +static int g_xdg_ini = 0; +static char g_log_file[PATH_MAX]; +static char g_ini_file[PATH_MAX]; +static char *g_log_buf = NULL; +extern char ** environ; + +#define CACHEMAGIC "ld.so-1.7.0" + +struct file_entry +{ + int flags; /* This is 1 for an ELF library. */ + unsigned int key, value; /* String table indices. */ +}; + +struct cache_file +{ + char magic[sizeof CACHEMAGIC - 1]; + unsigned int nlibs; + struct file_entry libs[0]; +}; + +#define CACHEMAGIC_NEW "glibc-ld.so.cache" +#define CACHE_VERSION "1.1" +#define CACHEMAGIC_VERSION_NEW CACHEMAGIC_NEW CACHE_VERSION + +struct file_entry_new +{ + int32_t flags; /* This is 1 for an ELF library. */ + uint32_t key, value; /* String table indices. */ + uint32_t osversion; /* Required OS version. */ + uint64_t hwcap; /* Hwcap entry. */ +}; + +struct cache_file_new +{ + char magic[sizeof CACHEMAGIC_NEW - 1]; + char version[sizeof CACHE_VERSION - 1]; + uint32_t nlibs; /* Number of entries. */ + uint32_t len_strings; /* Size of string table. */ + uint32_t unused[5]; /* Leave space for future extensions + and align to 8 byte boundary. */ + struct file_entry_new libs[0]; /* Entries describing libraries. */ + /* After this the string table of size len_strings is found. */ +}; + +/* Used to align cache_file_new. */ +#define ALIGN_CACHE(addr) \ +(((addr) + __alignof__ (struct cache_file_new) -1) \ + & (~(__alignof__ (struct cache_file_new) - 1))) + +#define vlog(fmt, args...) ventoy_syslog(0, fmt, ##args) + +void ventoy_syslog(int level, const char *Fmt, ...) +{ + int buflen; + char *buf = NULL; + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + (void)level; + + time(&stamp); + localtime_r(&stamp, &ttm); + + if (g_log_buf) + { + buf = g_log_buf; + buflen = MAX_LOG_BUF; + } + else + { + buf = log; + buflen = sizeof(log); + } + + va_start(arg, Fmt); + vsnprintf(buf, buflen, Fmt, arg); + va_end(arg); + + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + fclose(fp); + } + + #if 0 + printf("[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + #endif +} + +static int is_gtk_env(void) +{ + const char *env = NULL; + + env = getenv("GNOME_SETUP_DISPLAY"); + if (env && env[0] == ':') + { + vlog("GNOME_SETUP_DISPLAY=%s\n", env); + return 1; + } + + env = getenv("DESKTOP_SESSION"); + if (env && strcasecmp(env, "xfce") == 0) + { + vlog("DESKTOP_SESSION=%s\n", env); + return 1; + } + + return 0; +} + +static int is_qt_env(void) +{ + return 0; +} + +static int detect_gtk_version(int libflag) +{ + int gtk2; + int gtk3; + int gtk4; + int glade2; + + gtk2 = libflag & LIB_FLAG_GTK2; + gtk3 = libflag & LIB_FLAG_GTK3; + gtk4 = libflag & LIB_FLAG_GTK4; + glade2 = libflag & LIB_FLAG_GLADE2; + + if (gtk2 > 0 && glade2 > 0 && (gtk3 == 0 && gtk4 == 0)) + { + return 2; + } + + if (gtk3 > 0 && (gtk2 == 0 && gtk4 == 0)) + { + return 3; + } + + if (gtk4 > 0 && (gtk2 == 0 && gtk3 == 0)) + { + return 4; + } + + if (gtk3 > 0) + { + return 3; + } + + if (gtk4 > 0) + { + return 4; + } + + if (gtk2 > 0 && glade2 > 0) + { + return 2; + } + + return 0; +} + +static int detect_qt_version(int libflag) +{ + int qt4; + int qt5; + int qt6; + + qt4 = libflag & LIB_FLAG_QT4; + qt5 = libflag & LIB_FLAG_QT5; + qt6 = libflag & LIB_FLAG_QT6; + + if (qt4 > 0 && (qt5 == 0 && qt6 == 0)) + { + return 4; + } + + if (qt5 > 0 && (qt4 == 0 && qt6 == 0)) + { + return 5; + } + + if (qt6 > 0 && (qt4 == 0 && qt5 == 0)) + { + return 6; + } + + if (qt5 > 0) + { + return 5; + } + + if (qt6 > 0) + { + return 6; + } + + if (qt4 > 0) + { + return 4; + } + + return 0; +} + +int bit_from_machine(const char *machine) +{ + if (strstr(machine, "64")) + { + return 64; + } + else + { + return 32; + } +} + +int get_os_bit(int *bit) +{ + int ret; + struct utsname unameData; + + memset(&unameData, 0, sizeof(unameData)); + ret = uname(&unameData); + if (ret != 0) + { + vlog("uname error, code: %d\n", errno); + return 1; + } + + *bit = strstr(unameData.machine, "64") ? 64 : 32; + vlog("uname -m <%s> %dbit\n", unameData.machine, *bit); + + return 0; +} + +int read_file_1st_line(const char *file, char *buffer, int buflen) +{ + FILE *fp = NULL; + + fp = fopen(file, "r"); + if (fp == NULL) + { + vlog("Failed to open file %s code:%d", file, errno); + return 1; + } + + fgets(buffer, buflen, fp); + fclose(fp); + return 0; +} + +static int read_pid_cmdline(long pid, char *Buffer, int BufLen) +{ + char path[256]; + + snprintf(path, sizeof(path), "/proc/%ld/cmdline", pid); + return read_file_1st_line(path, Buffer, BufLen); +} + +static int find_exe_path(const char *exe, char *pathbuf, int buflen) +{ + int i; + char path[PATH_MAX]; + char *tmpptr = NULL; + char *saveptr = NULL; + char *newenv = NULL; + const char *env = getenv("PATH"); + + if (NULL == env) + { + return 0; + } + + newenv = strdup(env); + if (!newenv) + { + return 0; + } + + tmpptr = newenv; + while (NULL != (tmpptr = strtok_r(tmpptr, ":", &saveptr))) + { + snprintf(path, sizeof(path), "%s/%s", tmpptr, exe); + if (access(path, F_OK) != -1) + { + snprintf(pathbuf, buflen, "%s", path); + free(newenv); + return 1; + } + tmpptr = NULL; + } + + free(newenv); + return 0; +} + +void dump_args(const char *prefix, char **argv) +{ + int i = 0; + + vlog("=========%s ARGS BEGIN===========\n", prefix); + while (argv[i]) + { + vlog("argv[%d]=<%s>\n", i, argv[i]); + i++; + } + vlog("=========%s ARGS END===========\n", prefix); +} + +int pre_check(void) +{ + int ret; + int bit; + int buildbit; + const char *env = NULL; + + env = getenv("DISPLAY"); + if (NULL == env || env[0] != ':') + { + vlog("DISPLAY not exist(%p). Not in X environment.\n", env); + return 1; + } + + ret = get_os_bit(&bit); + if (ret) + { + vlog("Failed to get os bit.\n"); + return 1; + } + + buildbit = strstr(VTOY_GUI_ARCH, "64") ? 64 : 32; + vlog("Build bit is %d (%s)\n", buildbit, VTOY_GUI_ARCH); + + if (bit != buildbit) + { + vlog("Current system is %d bit (%s). Please run the correct VentoyGUI.\n", bit, VTOY_GUI_ARCH); + return 1; + } + + return 0; +} + +static char * find_argv(int argc, char **argv, char *key) +{ + int i; + int len; + + len = (int)strlen(key); + for (i = 0; i < argc; i++) + { + if (strncmp(argv[i], key, len) == 0) + { + return argv[i]; + } + } + + return NULL; +} + +static int adjust_cur_dir(char *argv0) +{ + int ret = 2; + char c; + char *pos = NULL; + char *end = NULL; + + if (argv0[0] == '.') + { + return 1; + } + + for (pos = argv0; pos && *pos; pos++) + { + if (*pos == '/') + { + end = pos; + } + } + + if (end) + { + c = *end; + *end = 0; + ret = chdir(argv0); + *end = c; + } + + return ret; +} + + + +static char **recover_environ_param(char *env) +{ + int i = 0; + int j = 0; + int k = 0; + int cnt = 0; + char **newenvs = NULL; + + for (i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + cnt++; + } + } + + newenvs = malloc(sizeof(char *) * (cnt + 1)); + if (!newenvs) + { + vlog("malloc new envs fail %d\n", cnt + 1); + return NULL; + } + memset(newenvs, 0, sizeof(char *) * (cnt + 1)); + + for (j = i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + env[i] = 0; + newenvs[k++] = env + j; + j = i + 1; + } + } + + vlog("recover environ %d %d\n", cnt, k); + return newenvs; +} + +static int restart_main(int argc, char **argv, char *guiexe) +{ + int i = 0; + int j = 0; + char *para = NULL; + char **envs = NULL; + char *newargv[MAX_PARAS + 1] = { NULL }; + + para = find_argv(argc, argv, VTOY_ENV_STR); + if (!para) + { + vlog("failed to find %s\n", VTOY_ENV_STR); + return 1; + } + + newargv[j++] = guiexe; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strncmp(argv[i], "_vtoy_", 6) != 0) + { + newargv[j++] = argv[i]; + } + } + + envs = recover_environ_param(para + strlen(VTOY_ENV_STR)); + if (envs) + { + vlog("recover success, argc=%d evecve <%s>\n", j, guiexe); + dump_args("EXECVE", newargv); + execve(guiexe, newargv, envs); + } + else + { + vlog("recover failed, argc=%d evecv <%s>\n", j, guiexe); + execv(guiexe, newargv); + } + + return 1; +} + +static char *create_environ_param(const char *prefix, char **envs) +{ + int i = 0; + int cnt = 0; + int envlen = 0; + int prelen = 0; + char *cur = NULL; + char *para = NULL; + + prelen = strlen(prefix); + for (i = 0; envs[i]; i++) + { + cnt++; + envlen += strlen(envs[i]) + 1; + } + + para = malloc(prelen + envlen); + if (!para) + { + vlog("failed to malloc env str %d\n", prelen + envlen); + return NULL; + } + + cur = para; + memcpy(cur, prefix, prelen); + cur += prelen; + + for (i = 0; envs[i]; i++) + { + envlen = strlen(envs[i]); + memcpy(cur, envs[i], envlen); + + cur[envlen] = '\n'; + cur += envlen + 1; + } + + vlog("create environment param %d\n", cnt); + return para; +} + +static int restart_by_pkexec(int argc, char **argv, const char *curpath, const char *exe) +{ + int i = 0; + int j = 0; + char envcount[64]; + char path[PATH_MAX]; + char pkexec[PATH_MAX]; + char exepara[PATH_MAX]; + char *newargv[MAX_PARAS + 1] = { NULL }; + + vlog("try restart self by pkexec ...\n"); + + if (find_exe_path("pkexec", pkexec, sizeof(pkexec))) + { + vlog("Find pkexec at <%s>\n", pkexec); + } + else + { + vlog("pkexec not found\n"); + return 1; + } + + if (argv[0][0] != '/') + { + snprintf(path, sizeof(path), "%s/%s", curpath, argv[0]); + } + else + { + snprintf(path, sizeof(path), "%s", argv[0]); + } + snprintf(exepara, sizeof(exepara), "%s%s", VTOY_GUI_PATH, exe); + + newargv[j++] = pkexec; + newargv[j++] = path; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strcmp(argv[i], "--xdg") == 0) + { + continue; + } + newargv[j++] = argv[i]; + } + + if (j < MAX_PARAS) + { + newargv[j++] = create_environ_param(VTOY_ENV_STR, environ); + } + + if (j < MAX_PARAS) + { + newargv[j++] = exepara; + } + + if (g_xdg_log && j + 1 < MAX_PARAS) + { + newargv[j++] = "-l"; + newargv[j++] = g_log_file; + } + + if (g_xdg_ini && j + 1 < MAX_PARAS) + { + newargv[j++] = "-i"; + newargv[j++] = g_ini_file; + } + + dump_args("PKEXEC", newargv); + execv(pkexec, newargv); + + return 1; +} + +static int ld_cache_lib_check(const char *lib, int *flag) +{ + if (((*flag) & LIB_FLAG_GTK3) == 0) + { + if (strncmp(lib, "libgtk-3.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK3; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK2) == 0) + { + if (strncmp(lib, "libgtk-x11-2.0.so", 17) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK2; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK4) == 0) + { + if (strncmp(lib, "libgtk-4.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT4) == 0) + { + if (strncmp(lib, "libQt4", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT5) == 0) + { + if (strncmp(lib, "libQt5", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT5; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT6) == 0) + { + if (strncmp(lib, "libQt6", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT6; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GLADE2) == 0) + { + if (strncmp(lib, "libglade-2", 10) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GLADE2; + return 0; + } + } + + return 0; +} + +static int parse_ld_cache(int *flag) +{ + int fd; + int format; + unsigned int i; + struct stat st; + size_t offset = 0; + size_t cache_size = 0; + const char *cache_data = NULL; + struct cache_file *cache = NULL; + struct cache_file_new *cache_new = NULL; + + *flag = 0; + + fd = open(LD_CACHE_FILE, O_RDONLY); + if (fd < 0) + { + vlog("failed to open %s err:%d\n", LD_CACHE_FILE, errno); + return 1; + } + + if (fstat(fd, &st) < 0 || st.st_size == 0) + { + close(fd); + return 1; + } + + cache = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (cache == MAP_FAILED) + { + close(fd); + return 1; + } + + cache_size = st.st_size; + if (cache_size < sizeof (struct cache_file)) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + if (memcmp(cache->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1)) + { + /* This can only be the new format without the old one. */ + cache_new = (struct cache_file_new *) cache; + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) || + memcmp (cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1)) + { + munmap (cache, cache_size); + close(fd); + return 1; + } + + format = 1; + /* This is where the strings start. */ + cache_data = (const char *) cache_new; + } + else + { + /* Check for corruption, avoiding overflow. */ + if ((cache_size - sizeof (struct cache_file)) / sizeof (struct file_entry) < cache->nlibs) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + offset = ALIGN_CACHE(sizeof (struct cache_file) + (cache->nlibs * sizeof (struct file_entry))); + + /* This is where the strings start. */ + cache_data = (const char *) &cache->libs[cache->nlibs]; + + /* Check for a new cache embedded in the old format. */ + if (cache_size > (offset + sizeof (struct cache_file_new))) + { + cache_new = (struct cache_file_new *) ((void *)cache + offset); + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) == 0 && + memcmp(cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1) == 0) + { + cache_data = (const char *) cache_new; + format = 1; + } + } + } + + if (format == 0) + { + vlog("%d libs found in cache format 0\n", cache->nlibs); + for (i = 0; i < cache->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache->libs[i].key, flag); + } + } + else if (format == 1) + { + vlog("%d libs found in cache format 1\n", cache_new->nlibs); + + for (i = 0; i < cache_new->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache_new->libs[i].key, flag); + } + } + + vlog("ldconfig lib flags 0x%x\n", *flag); + vlog("lib flags GLADE2:[%s] GTK2:[%s] GTK3:[%s] GTK4:[%s] QT4:[%s] QT5:[%s] QT6:[%s]\n", + INT2STR_YN((*flag) & LIB_FLAG_GLADE2), INT2STR_YN((*flag) & LIB_FLAG_GTK2), + INT2STR_YN((*flag) & LIB_FLAG_GTK3), INT2STR_YN((*flag) & LIB_FLAG_GTK4), + INT2STR_YN((*flag) & LIB_FLAG_QT4), INT2STR_YN((*flag) & LIB_FLAG_QT5), + INT2STR_YN((*flag) & LIB_FLAG_QT6)); + + munmap (cache, cache_size); + close (fd); + return 0; +} + +static int gui_type_check(VTOY_JSON *pstNode) +{ + FILE *fp = NULL; + const char *env = NULL; + const char *arch = NULL; + const char *srctype = NULL; + const char *srcname = NULL; + const char *condition = NULL; + const char *expression = NULL; + char line[1024]; + + arch = vtoy_json_get_string_ex(pstNode, "arch"); + srctype = vtoy_json_get_string_ex(pstNode, "type"); + srcname = vtoy_json_get_string_ex(pstNode, "name"); + condition = vtoy_json_get_string_ex(pstNode, "condition"); + expression = vtoy_json_get_string_ex(pstNode, "expression"); + + if (srctype == NULL || srcname == NULL || condition == NULL) + { + return 0; + } + + if (arch && NULL == strstr(arch, VTOY_GUI_ARCH)) + { + return 0; + } + + vlog("check <%s> <%s> <%s>\n", srctype, srcname, condition); + + if (strcmp(srctype, "file") == 0) + { + if (access(srcname, F_OK) == -1) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("File %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "contains") == 0) + { + fp = fopen(srcname, "r"); + if (fp == NULL) + { + return 0; + } + + while (fgets(line, sizeof(line), fp)) + { + if (strstr(line, expression)) + { + vlog("File %s contains %s\n", srcname, expression); + fclose(fp); + return 1; + } + } + + fclose(fp); + return 0; + } + } + else if (strcmp(srctype, "env") == 0) + { + env = getenv(srcname); + if (env == NULL) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("env %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "equal") == 0) + { + if (strcmp(expression, env) == 0) + { + vlog("env %s is %s\n", srcname, env); + return 1; + } + return 0; + } + else if (strcmp(condition, "contains") == 0) + { + if (strstr(env, expression)) + { + vlog("env %s is %s contains %s\n", srcname, env, expression); + return 1; + } + return 0; + } + } + + return 0; +} + +static int read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +static int distro_check_gui_env(char *type, int len, int *pver) +{ + int size; + int length; + char *pBuf = NULL; + VTOY_JSON *pstNode = NULL; + VTOY_JSON *pstJson = NULL; + + vlog("distro_check_gui_env ...\n"); + + if (access("./tool/distro_gui_type.json", F_OK) == -1) + { + vlog("distro_gui_type.json file not exist\n"); + return 0; + } + + read_file_to_buf("./tool/distro_gui_type.json", 1, (void **)&pBuf, &size); + pBuf[size] = 0; + + pstJson = vtoy_json_create(); + vtoy_json_parse(pstJson, pBuf); + + for (pstNode = pstJson->pstChild; pstNode; pstNode = pstNode->pstNext) + { + if (gui_type_check(pstNode->pstChild)) + { + length = (int)snprintf(type, len, "%s", vtoy_json_get_string_ex(pstNode->pstChild, "gui")); + *pver = type[length - 1] - '0'; + type[length - 1] = 0; + break; + } + } + + vtoy_json_destroy(pstJson); + return pstNode ? 1 : 0; +} + +static int detect_gui_exe_path(int argc, char **argv, const char *curpath, char *pathbuf, int buflen) +{ + int i; + int ret; + int ver; + int libflag = 0; + const char *guitype = NULL; + char line[256]; + mode_t mode; + struct stat filestat; + + for (i = 1; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--gtk2") == 0) + { + guitype = "gtk"; + ver = 2; + } + else if (argv[i] && strcmp(argv[i], "--gtk3") == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (argv[i] && strcmp(argv[i], "--gtk4") == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt4") == 0) + { + guitype = "qt"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt5") == 0) + { + guitype = "qt"; + ver = 5; + } + else if (argv[i] && strcmp(argv[i], "--qt6") == 0) + { + guitype = "qt"; + ver = 6; + } + } + + if (guitype) + { + vlog("Get GUI type from param <%s%d>.\n", guitype, ver); + } + else if (access("./ventoy_gui_type", F_OK) != -1) + { + vlog("Get GUI type from ventoy_gui_type file.\n"); + + line[0] = 0; + read_file_1st_line("./ventoy_gui_type", line, sizeof(line)); + if (strncmp(line, "gtk2", 4) == 0) + { + guitype = "gtk"; + ver = 2; + + parse_ld_cache(&libflag); + if ((libflag & LIB_FLAG_GLADE2) == 0) + { + vlog("libglade2 is necessary for GTK2, but not found.\n"); + return 1; + } + } + else if (strncmp(line, "gtk3", 4) == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (strncmp(line, "gtk4", 4) == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (strncmp(line, "qt4", 3) == 0) + { + guitype = "qt"; + ver = 4; + } + else if (strncmp(line, "qt5", 3) == 0) + { + guitype = "qt"; + ver = 5; + } + else if (strncmp(line, "qt6", 3) == 0) + { + guitype = "qt"; + ver = 6; + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + else + { + vlog("Now detect the GUI type ...\n"); + + parse_ld_cache(&libflag); + + if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) == 0) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) == 0 && (LIB_FLAG_QT & libflag) > 0) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) > 0) + { + if (distro_check_gui_env(line, sizeof(line), &ver)) + { + guitype = line; + vlog("distro_check_gui <%s%d> ...\n", line, ver); + } + else if (is_gtk_env()) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if (is_qt_env()) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else + { + vlog("Can not distinguish GTK and QT, default use GTK.\n"); + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + + snprintf(pathbuf, buflen, "%s/tool/%s/Ventoy2Disk.%s%d", curpath, VTOY_GUI_ARCH, guitype, ver); + + vlog("This is %s%d X environment.\n", guitype, ver); + vlog("exe = %s\n", pathbuf); + + if (access(pathbuf, F_OK) == -1) + { + vlog("%s is not exist.\n", pathbuf); + return 1; + } + + if (access(pathbuf, X_OK) == -1) + { + vlog("execute permission check fail, try chmod.\n", pathbuf); + if (stat(pathbuf, &filestat) == 0) + { + mode = filestat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH; + ret = chmod(pathbuf, mode); + vlog("old mode=%o new mode=%o ret=%d\n", filestat.st_mode, mode, ret); + } + } + else + { + vlog("execute permission check success.\n"); + } + + return 0; +} + +int real_main(int argc, char **argv) +{ + int ret; + int euid; + char *exe = NULL; + char path[PATH_MAX]; + char curpath[PATH_MAX]; + + ret = adjust_cur_dir(argv[0]); + + vlog("\n"); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("=============== VentoyGui %s ===============\n", VTOY_GUI_ARCH); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("log file is <%s>\n", g_log_file); + + euid = geteuid(); + getcwd(curpath, sizeof(curpath)); + + vlog("pid:%ld ppid:%ld uid:%d euid:%d\n", (long)getpid(), (long)getppid(), getuid(), euid); + vlog("adjust dir:%d current path:%s\n", ret, curpath); + dump_args("RAW", argv); + + if (access("./boot/boot.img", F_OK) == -1) + { + vlog("Please run under the correct directory!\n"); + return 1; + } + + exe = find_argv(argc, argv, VTOY_GUI_PATH); + if (exe) + { + if (euid != 0) + { + vlog("Invalid euid %d when restart.\n", euid); + return 1; + } + + return restart_main(argc, argv, exe + strlen(VTOY_GUI_PATH)); + } + else + { + if (pre_check()) + { + return 1; + } + + if (detect_gui_exe_path(argc, argv, curpath, path, sizeof(path))) + { + return 1; + } + + if (euid == 0) + { + vlog("We have root privileges, just exec %s\n", path); + argv[0] = path; + execv(argv[0], argv); + } + else + { + vlog("EUID check failed.\n"); + + /* try pkexec */ + restart_by_pkexec(argc, argv, curpath, path); + + vlog("### Please run with root privileges. ###\n"); + return 1; + } + } + + return 1; +} + +int main(int argc, char **argv) +{ + int i; + int ret; + const char *env = NULL; + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + break; + } + else if (argv[i] && strcmp(argv[i], "--xdg") == 0) + { + env = getenv("XDG_CACHE_HOME"); + if (env) + { + g_xdg_log = 1; + snprintf(g_log_file, sizeof(g_log_file), "%s/ventoy.log", env); + } + + env = getenv("XDG_CONFIG_HOME"); + if (env) + { + g_xdg_ini = 1; + snprintf(g_ini_file, sizeof(g_ini_file), "%s/Ventoy2Disk.ini", env); + } + } + } + + g_log_buf = malloc(MAX_LOG_BUF); + if (!g_log_buf) + { + vlog("Failed to malloc log buffer %d\n", MAX_LOG_BUF); + return 1; + } + + ret = real_main(argc, argv); + free(g_log_buf); + return ret; +} + diff --git a/LinuxGUI/build.sh b/LinuxGUI/build.sh index f8709928..f568a2db 100644 --- a/LinuxGUI/build.sh +++ b/LinuxGUI/build.sh @@ -32,7 +32,7 @@ build_func() { -I ./Ventoy2Disk/Lib/fat_io_lib \ \ -L ./Ventoy2Disk/Lib/fat_io_lib/lib \ - Ventoy2Disk/*.c \ + Ventoy2Disk/main_webui.c \ Ventoy2Disk/Core/*.c \ Ventoy2Disk/Web/*.c \ Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ diff --git a/LinuxGUI/build_gtk.sh b/LinuxGUI/build_gtk.sh new file mode 100644 index 00000000..6e7aa518 --- /dev/null +++ b/LinuxGUI/build_gtk.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +build_func() { + libsuffix=$2 + toolDir=$3 + gtkver=$4 + + if [ "$libsuffix" = "aa64" ]; then + EXD=./EXLIB/aarch64 + GTKFLAG="-pthread -I$EXD/usr/include/gtk-3.0 -I$EXD/usr/include/atk-1.0 -I$EXD/usr/include/at-spi2-atk/2.0 -I$EXD/usr/include/pango-1.0 -I$EXD/usr/include/gio-unix-2.0/ -I$EXD/usr/include/cairo -I$EXD/usr/include/gdk-pixbuf-2.0 -I$EXD/usr/include/glib-2.0 -I$EXD/usr/lib64/glib-2.0/include -I$EXD/usr/include/at-spi-2.0 -I$EXD/usr/include/dbus-1.0 -I$EXD/usr/lib64/dbus-1.0/include -I$EXD/usr/include/harfbuzz -I$EXD/usr/include/freetype2 -I$EXD/usr/include/pixman-1 -I$EXD/usr/include/libpng15 -I$EXD/usr/include/libdrm" + XXLIB="-Wl,-rpath-link $EXD/usr/lib64 -Wl,-rpath-link $EXD/lib64 -Wno-deprecated-declarations -L$EXD/usr/lib64 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 " + elif [ "$libsuffix" = "m64e" ]; then + EXDI=./EXLIB/mips64el + EXDL=./EXLIB/mips64el/usr/lib/mips64el-linux-gnuabi64 + EXDL2=./EXLIB/mips64el/lib/mips64el-linux-gnuabi64 + GTKFLAG="-pthread -I$EXDI/usr/include/gtk-3.0 -I$EXDI/usr/include/at-spi2-atk/2.0 -I$EXDI/usr/include/at-spi-2.0 -I$EXDI/usr/include/dbus-1.0 -I./EXLIB/mips64el/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I$EXDI/usr/include/gtk-3.0 -I$EXDI/usr/include/gio-unix-2.0 -I$EXDI/usr/include/cairo -I$EXDI/usr/include/pango-1.0 -I$EXDI/usr/include/harfbuzz -I$EXDI/usr/include/pango-1.0 -I$EXDI/usr/include/fribidi -I$EXDI/usr/include/harfbuzz -I$EXDI/usr/include/atk-1.0 -I$EXDI/usr/include/cairo -I$EXDI/usr/include/pixman-1 -I$EXDI/usr/include/uuid -I$EXDI/usr/include/freetype2 -I$EXDI/usr/include/libpng16 -I$EXDI/usr/include/gdk-pixbuf-2.0 -I$EXDI/usr/include/libmount -I$EXDI/usr/include/blkid -I$EXDI/usr/include/glib-2.0 -I$EXDL/glib-2.0/include" + XXLIB="-Wl,-rpath-link $EXDL -Wl,-rpath-link $EXDL2 -Wno-deprecated-declarations -L$EXDL -L$EXDL2 -lm -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lpcre " + else + if [ "$gtkver" = "gtk3" ]; then + GTKFLAG=$(pkg-config --cflags --libs gtk+-3.0) + GLADE="" + else + GTKFLAG=$(pkg-config --cflags --libs gtk+-2.0) + GLADE=$(pkg-config --cflags --libs libglade-2.0) + fi + XXLIB="" + fi + + XXFLAG="-std=gnu99 -D_FILE_OFFSET_BITS=64 $GTKFLAG $GLADE -Wall" + + + echo "CC=$1 libsuffix=$libsuffix toolDir=$toolDir $gtkver" + + $1 $XXFLAG -c -Wall -Wextra -Wshadow -Wformat-security -Winit-self \ + -Wmissing-prototypes -O2 -DLINUX \ + -I./Ventoy2Disk/Lib/libhttp/include \ + -DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED \ + -DUSE_STACK_SIZE=102400 -DNDEBUG -fPIC \ + ./Ventoy2Disk/Lib/libhttp/include/civetweb.c \ + -o ./civetweb.o + + $1 -O2 -Wall -Wno-unused-function -DSTATIC=static -DINIT= \ + -I./Ventoy2Disk \ + -I./Ventoy2Disk/Core \ + -I./Ventoy2Disk/Web \ + -I./Ventoy2Disk/GTK \ + -I./Ventoy2Disk/Include \ + -I./Ventoy2Disk/Lib/libhttp/include \ + -I./Ventoy2Disk/Lib/fat_io_lib/include \ + -I./Ventoy2Disk/Lib/xz-embedded/linux/include \ + -I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux \ + -I./Ventoy2Disk/Lib/xz-embedded/userspace \ + -I ./Ventoy2Disk/Lib/exfat/src/libexfat \ + -I ./Ventoy2Disk/Lib/exfat/src/mkfs \ + -I ./Ventoy2Disk/Lib/fat_io_lib \ + \ + -L ./Ventoy2Disk/Lib/fat_io_lib/lib \ + Ventoy2Disk/main_gtk.c \ + Ventoy2Disk/Core/*.c \ + Ventoy2Disk/Web/*.c \ + Ventoy2Disk/GTK/*.c \ + Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \ + Ventoy2Disk/Lib/exfat/src/libexfat/*.c \ + Ventoy2Disk/Lib/exfat/src/mkfs/*.c \ + Ventoy2Disk/Lib/fat_io_lib/*.c \ + $XXLIB \ + -l pthread \ + ./civetweb.o \ + -o Ventoy2Disk.${gtkver}_$libsuffix $XXFLAG + + rm -f *.o + + if [ "$libsuffix" = "aa64" ]; then + aarch64-linux-gnu-strip Ventoy2Disk.${gtkver}_$libsuffix + elif [ "$libsuffix" = "m64e" ]; then + mips-linux-gnu-strip Ventoy2Disk.${gtkver}_$libsuffix + else + strip Ventoy2Disk.${gtkver}_$libsuffix + fi + + rm -f ../INSTALL/tool/$toolDir/Ventoy2Disk.${gtkver}_$libsuffix + cp -a Ventoy2Disk.${gtkver}_$libsuffix ../INSTALL/tool/$toolDir/Ventoy2Disk.${gtkver} + + $1 -O2 -D_FILE_OFFSET_BITS=64 Ventoy2Disk/ventoy_gui.c Ventoy2Disk/Core/ventoy_json.c -I Ventoy2Disk/Core -DVTOY_GUI_ARCH="\"$toolDir\"" -o VentoyGUI.$toolDir + cp -a VentoyGUI.$toolDir ../INSTALL/ +} + + +build_func "gcc" '64' 'x86_64' 'gtk2' +build_func "gcc" '64' 'x86_64' 'gtk3' + +build_func "gcc -m32" '32' 'i386' 'gtk2' +build_func "gcc -m32" '32' 'i386' 'gtk3' + +build_func "aarch64-linux-gnu-gcc" 'aa64' 'aarch64' 'gtk3' + +export PATH=/opt/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/:$PATH +build_func "mips-linux-gnu-gcc -mips64r2 -mabi=64" 'm64e' 'mips64el' 'gtk3' + diff --git a/LinuxGUI/build_qt.sh b/LinuxGUI/build_qt.sh new file mode 100644 index 00000000..df5fab57 --- /dev/null +++ b/LinuxGUI/build_qt.sh @@ -0,0 +1,170 @@ +#!/bin/bash + +force_copy() { + [ -e "$2" ] && rm -f "$2" + cp -a "$1" "$2" +} + +compile_file() { + name=$(basename $2) + obj=${name%.*} + + echo "$1 ${obj}.o ..." + $1 -O2 -Wall -std=gnu99 -Wno-unused-function -Wno-format-truncation -Wno-address-of-packed-member -DSTATIC=static -DINIT= -D_FILE_OFFSET_BITS=64 \ + -I./Ventoy2Disk \ + -I./Ventoy2Disk/Core \ + -I./Ventoy2Disk/Web \ + -I./Ventoy2Disk/QT \ + -I./Ventoy2Disk/Include \ + -I./Ventoy2Disk/Lib/libhttp/include \ + -I./Ventoy2Disk/Lib/fat_io_lib/include \ + -I./Ventoy2Disk/Lib/xz-embedded/linux/include \ + -I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux \ + -I./Ventoy2Disk/Lib/xz-embedded/userspace \ + -I ./Ventoy2Disk/Lib/exfat/src/libexfat \ + -I ./Ventoy2Disk/Lib/exfat/src/mkfs \ + -I ./Ventoy2Disk/Lib/fat_io_lib \ + -c $2 -o ${obj}.o +} + +compile_dir() { + dir=$1 + for i in $(ls $dir/*.c); do + compile_file "$2" "$i" + done +} + +compile_lib() { + compile_dir ./Ventoy2Disk/Core "$1" + compile_dir ./Ventoy2Disk/Web "$1" + compile_dir ./Ventoy2Disk/QT "$1" + compile_dir ./Ventoy2Disk/Lib/exfat/src/libexfat "$1" + compile_dir ./Ventoy2Disk/Lib/exfat/src/mkfs "$1" + compile_dir ./Ventoy2Disk/Lib/fat_io_lib "$1" + compile_file "$1" Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c + + rm -f libVentoyQT_$3.a + $2 -rcs libVentoyQT_$3.a *.o + rm -f *.o +} + +build_qt() { + echo "$1 main.o ..." + $1 -c $2 $3 -o main.o ./Ventoy2Disk/QT/main.cpp + + echo "$1 partcfgdialog.o ..." + $1 -c $2 $3 -o partcfgdialog.o ./Ventoy2Disk/QT/partcfgdialog.cpp + + echo "$1 ventoy2diskwindow.o ..." + $1 -c $2 $3 -o ventoy2diskwindow.o ./Ventoy2Disk/QT/ventoy2diskwindow.cpp + + echo "$1 moc_partcfgdialog.o ..." + $1 -c $2 $3 -o moc_partcfgdialog.o ./Ventoy2Disk/QT/build/moc_partcfgdialog.cpp + + echo "$1 moc_ventoy2diskwindow.o ..." + $1 -c $2 $3 -o moc_ventoy2diskwindow.o ./Ventoy2Disk/QT/build/moc_ventoy2diskwindow.cpp + + echo "$1 Ventoy2Disk.qt5_${6} ..." + $1 $4 -o Ventoy2Disk.qt5_${6} *.o $5 + rm -f *.o +} + +build_qt_app() { + + DEFINES="-DQT_CHECK_EUID -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB" + CXXFLAGS="-pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $DEFINES -Wno-deprecated-declarations -Wno-deprecated-copy" + INCPATH=" -I./Ventoy2Disk -I. -I./Ventoy2Disk/Core -I./Ventoy2Disk/Web -I./Ventoy2Disk/QT -I./Ventoy2Disk/QT/build -I./Ventoy2Disk/Include -I./Ventoy2Disk/Lib/libhttp/include -I./Ventoy2Disk/Lib/fat_io_lib/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I./Ventoy2Disk/Lib/xz-embedded/userspace -I./Ventoy2Disk/Lib/exfat/src/libexfat -I./Ventoy2Disk/Lib/fat_io_lib -I$QT_INC_PATH -I$QT_INC_PATH/QtWidgets -I$QT_INC_PATH/QtGui -I$QT_INC_PATH/QtCore -I. -I." + + SUBLIBS="./libVentoyQT_${2}.a" + LIBS="$SUBLIBS $QT_LIB_PATH/libQt5Widgets.so $QT_LIB_PATH/libQt5Gui.so $QT_LIB_PATH/libQt5Core.so -lpthread" + + build_qt "$1" "$CXXFLAGS" "$INCPATH" "$LFLAGS" "$LIBS" "$3" +} + +# build QT5 for i386 +build_qt_i386() { + QT_INC_PATH="./EXLIB/i386/usr/include/i386-linux-gnu/qt5" + QT_LIB_PATH="./EXLIB/i386/usr/lib/i386-linux-gnu" + DEFINES="-DQT_CHECK_EUID -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB" + CXXFLAGS="-pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $DEFINES -Wno-deprecated-declarations" + INCPATH=" -I./Ventoy2Disk -I. -I./Ventoy2Disk/Core -I./Ventoy2Disk/Web -I./Ventoy2Disk/QT -I./Ventoy2Disk/QT/build -I./Ventoy2Disk/Include -I./Ventoy2Disk/Lib/libhttp/include -I./Ventoy2Disk/Lib/fat_io_lib/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I./Ventoy2Disk/Lib/xz-embedded/userspace -I./Ventoy2Disk/Lib/exfat/src/libexfat -I./Ventoy2Disk/Lib/fat_io_lib -I$QT_INC_PATH -I$QT_INC_PATH/QtWidgets -I$QT_INC_PATH/QtGui -I$QT_INC_PATH/QtCore -I." + LFLAGS="-Wl,-O1 -Wl,-rpath-link,$QT_LIB_PATH -L$QT_LIB_PATH -Wl,-rpath-link,./EXLIB/i386/lib/i386-linux-gnu -L./EXLIB/i386/lib/i386-linux-gnu" + SUBLIBS="./libVentoyQT_i386.a" + LIBS="$SUBLIBS $QT_LIB_PATH/libQt5Widgets.so $QT_LIB_PATH/libQt5Gui.so $QT_LIB_PATH/libQt5Core.so -lpthread" + + compile_lib "gcc -m32" "ar" "i386" + build_qt "g++ -m32" "$CXXFLAGS" "$INCPATH" "$LFLAGS" "$LIBS" "32" +} + + +#build QT5 for x86_64 +build_qt_x86_64() { + compile_lib "gcc" "ar" "x86_64" + QT_INC_PATH="/opt/Qt5.9.0/5.9/gcc_64/include" + QT_LIB_PATH="/opt/Qt5.9.0/5.9/gcc_64/lib" + LFLAGS="-Wl,-O1 -Wl,-rpath-link,$QT_LIB_PATH -L$QT_LIB_PATH" + build_qt_app "g++" "x86_64" "64" + + force_copy Ventoy2Disk.qt5_64 ../INSTALL/tool/x86_64/Ventoy2Disk.qt5 + rm -f ./libVentoyQT_x86_64.a +} + + +# build QT5 for arm64 +build_qt_aarch64() { + compile_lib "aarch64-linux-gnu-gcc" "aarch64-linux-gnu-ar" "aarch64" + QT_INC_PATH="./EXLIB/aarch64/usr/include/qt5" + QT_LIB_PATH="./EXLIB/aarch64/usr/lib64" + LFLAGS="-Wl,-O1 -Wl,-rpath-link,$QT_LIB_PATH -L$QT_LIB_PATH -Wl,-rpath-link,./EXLIB/aarch64/lib64 -L./EXLIB/aarch64/lib64" + build_qt_app "aarch64-linux-gnu-g++" "aarch64" "aa64" + + force_copy Ventoy2Disk.qt5_aa64 ../INSTALL/tool/aarch64/Ventoy2Disk.qt5 + rm -f ./libVentoyQT_aarch64.a +} + +# build QT5 for mips64 +build_qt_mips64el() { + QT_INC_PATH="./EXLIB/mips64el/usr/include/mips64el-linux-gnuabi64/qt5" + QT_LIB_PATH="./EXLIB/mips64el/usr/lib/mips64el-linux-gnuabi64" + DEFINES="-DQT_CHECK_EUID -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB" + CXXFLAGS="-pipe -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $DEFINES -Wno-deprecated-declarations" + INCPATH=" -I./Ventoy2Disk -I. -I./Ventoy2Disk/Core -I./Ventoy2Disk/Web -I./Ventoy2Disk/QT -I./Ventoy2Disk/QT/build -I./Ventoy2Disk/Include -I./Ventoy2Disk/Lib/libhttp/include -I./Ventoy2Disk/Lib/fat_io_lib/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include -I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux -I./Ventoy2Disk/Lib/xz-embedded/userspace -I./Ventoy2Disk/Lib/exfat/src/libexfat -I./Ventoy2Disk/Lib/fat_io_lib -I$QT_INC_PATH -I$QT_INC_PATH/QtWidgets -I$QT_INC_PATH/QtGui -I$QT_INC_PATH/QtCore -I." + LFLAGS="-Wl,-O1 -Wl,-rpath-link,$QT_LIB_PATH -L$QT_LIB_PATH -Wl,-rpath-link,./EXLIB/mips64el/lib/mips64el-linux-gnuabi64 -L./EXLIB/mips64el/lib/mips64el-linux-gnuabi64" + SUBLIBS="./libVentoyQT_mips64el.a" + LIBS="$SUBLIBS $QT_LIB_PATH/libQt5Widgets.so $QT_LIB_PATH/libQt5Gui.so $QT_LIB_PATH/libQt5Core.so -lpthread" + + export PATH=/opt/mips-loongson-gcc8-linux-gnu-2021-02-08/bin/:$PATH + compile_lib "mips-linux-gnu-gcc -mips64r2 -mabi=64" "mips-linux-gnu-ar" "mips64el" + build_qt "mips-linux-gnu-g++ -mips64r2 -mabi=64" "$CXXFLAGS" "$INCPATH" "$LFLAGS" "$LIBS" "m64e" + + force_copy Ventoy2Disk.qt5_m64e ../INSTALL/tool/mips64el/Ventoy2Disk.qt5 + rm -f ./libVentoyQT_mips64el.a +} + + +#################################################################### +#################################################################### +#################################################################### +#################################################################### + +sed "s#../Ventoy2Disk#..#g" -i ./Ventoy2Disk/QT/build/moc_partcfgdialog.cpp +sed "s#../Ventoy2Disk#..#g" -i ./Ventoy2Disk/QT/build/moc_ventoy2diskwindow.cpp + +#build qt5 i386 in centos 8 environment +if [ "$1" = "VENTOY_I386_QT_BUILD" ]; then + echo "build i386 qt ..." + build_qt_i386 + exit 0 +fi + +if [ ! -f /opt/CentOS8/LinuxGUI/build.sh ]; then + mount --bind /home/share/Ventoy/LinuxGUI /opt/CentOS8/LinuxGUI +fi + +chroot /opt/CentOS8 sh /buildqt.sh +force_copy ./Ventoy2Disk.qt5_32 ../INSTALL/tool/i386/Ventoy2Disk.qt5 +rm -f ./libVentoyQT_i386.a + +build_qt_x86_64 +build_qt_aarch64 +build_qt_mips64el diff --git a/LiveCDGUI/EXT/README.txt b/LiveCDGUI/EXT/README.txt new file mode 100644 index 00000000..a60aff2f --- /dev/null +++ b/LiveCDGUI/EXT/README.txt @@ -0,0 +1,22 @@ + +Files bellow are from Porteus-Kiosk-5.2.0-x86_64.iso (https://porteus-kiosk.org/public/5.2/) + +MD5SUM: +42857b439725a0e1adb0c396849f57c9 EXT/000-kernel.xzm +9b699227f44178dfd323d7503510c868 EXT/001-core.xzm +aafb2191accb37bd6725c84522c92e51 EXT/003-settings.xzm +0cd503757d9829847a01b9403f60fee2 EXT/004-wifi.xzm +501b6096122dcf0da75cdbba1868cd31 EXT/06-fonts.xzm +ce677b50b223ce76df070d23af016338 EXT/initrd.xz +9e96e4550de38f8e22733a0afe56dab3 EXT/vmlinuz + + +Files in ntfs-3g.tar.gz are from ntfs-3g_2021.8.22-2_amd64.deb and libntfs-3g89_2021.8.22-2_amd64.deb +http://ftp.debian.org/debian/pool/main/n/ntfs-3g/ntfs-3g_2021.8.22-2_amd64.deb +http://ftp.debian.org/debian/pool/main/n/ntfs-3g/libntfs-3g89_2021.8.22-2_amd64.deb + + +busybox-x86_64 is from https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64 +MD5SUM +ea7e2353af0067a926d3e021e504290e EXT/busybox-x86_64 + diff --git a/LiveCDGUI/EXT/busybox-x86_64 b/LiveCDGUI/EXT/busybox-x86_64 new file mode 100644 index 00000000..6206a941 Binary files /dev/null and b/LiveCDGUI/EXT/busybox-x86_64 differ diff --git a/LiveCDGUI/EXT/ntfs-3g.tar.gz b/LiveCDGUI/EXT/ntfs-3g.tar.gz new file mode 100644 index 00000000..befdf3a2 Binary files /dev/null and b/LiveCDGUI/EXT/ntfs-3g.tar.gz differ diff --git a/LiveCDGUI/GRUB/boot_hybrid.img b/LiveCDGUI/GRUB/boot_hybrid.img new file mode 100644 index 00000000..721cbf06 Binary files /dev/null and b/LiveCDGUI/GRUB/boot_hybrid.img differ diff --git a/LiveCDGUI/GRUB/bootx64.efi b/LiveCDGUI/GRUB/bootx64.efi new file mode 100644 index 00000000..8377d6dd Binary files /dev/null and b/LiveCDGUI/GRUB/bootx64.efi differ diff --git a/LiveCDGUI/GRUB/cdrom.img b/LiveCDGUI/GRUB/cdrom.img new file mode 100644 index 00000000..2df6491a Binary files /dev/null and b/LiveCDGUI/GRUB/cdrom.img differ diff --git a/LiveCDGUI/GRUB/embed.cfg b/LiveCDGUI/GRUB/embed.cfg new file mode 100644 index 00000000..e88752a7 --- /dev/null +++ b/LiveCDGUI/GRUB/embed.cfg @@ -0,0 +1,5 @@ + +search -f /EFI/VentoyLiveCD -s root +configfile ($root)/EFI/boot/grub.cfg + + diff --git a/LiveCDGUI/ISO/EFI/VentoyLiveCD b/LiveCDGUI/ISO/EFI/VentoyLiveCD new file mode 100644 index 00000000..3f7afb88 --- /dev/null +++ b/LiveCDGUI/ISO/EFI/VentoyLiveCD @@ -0,0 +1,3 @@ +VentoyLiveCD + +https://www.ventoy.net diff --git a/LiveCDGUI/ISO/EFI/boot/grub.cfg b/LiveCDGUI/ISO/EFI/boot/grub.cfg new file mode 100644 index 00000000..0dc48287 --- /dev/null +++ b/LiveCDGUI/ISO/EFI/boot/grub.cfg @@ -0,0 +1,27 @@ + +set timeout=3 +set default=LiveCD + +clear + +menuentry 'Ventoy xxx LiveCD GUI' --id=LiveCD { + echo downloading kernel ... + linux /EFI/boot/vmlinuz quiet first_run rdinit=/VTOY/init + + echo downloading initrd ... + initrd /EFI/boot/initrd + + echo booting LiveCD ... + boot +} + +menuentry 'Ventoy xxx LiveCD GUI (Debug Mode)' { + echo downloading kernel ... + linux /EFI/boot/vmlinuz debug loglevel=7 first_run rdinit=/VTOY/init + + echo downloading initrd ... + initrd /EFI/boot/initrd + + echo booting LiveCD ... + boot +} diff --git a/LiveCDGUI/VTOY/autostart b/LiveCDGUI/VTOY/autostart new file mode 100644 index 00000000..f52bc8c4 --- /dev/null +++ b/LiveCDGUI/VTOY/autostart @@ -0,0 +1,29 @@ +#!/bin/sh + +hsetroot -fill /usr/share/wallpapers/wallpaper.png + +INIFILE=/ventoy/Ventoy2Disk.ini + +echo "[Ventoy]" >> $INIFILE +echo "Language=Chinese Simplified (简体中文)" >> $INIFILE +echo "PartStyle=0" >> $INIFILE +echo "ShowAllDevice=0" >> $INIFILE + + +VTOOLDIR=/ventoy/tool/x86_64 + +ls -1 $VTOOLDIR/ | grep '\.xz$' | while read line; do + $VTOOLDIR/xzcat $VTOOLDIR/$line > $VTOOLDIR/${line%.xz} + rm -f $VTOOLDIR/$line + chmod +x $VTOOLDIR/${line%.xz} +done + +cp -a $VTOOLDIR/mount.exfat-fuse /bin/mount.exfat +cp -a $VTOOLDIR/mkexfatfs /bin/mkfs.exfat + +/usr/local/sbin/busybox --install /usr/local/sbin/ +tar xf /usr/local/sbin/ntfs-3g.tar.gz -C / + +/ventoy/tool/x86_64/Ventoy2Disk.gtk3 --kiosk + +reboot -f diff --git a/LiveCDGUI/VTOY/background.png b/LiveCDGUI/VTOY/background.png new file mode 100644 index 00000000..d9cc57c0 Binary files /dev/null and b/LiveCDGUI/VTOY/background.png differ diff --git a/LiveCDGUI/VTOY/init b/LiveCDGUI/VTOY/init new file mode 100644 index 00000000..afd457a9 --- /dev/null +++ b/LiveCDGUI/VTOY/init @@ -0,0 +1,111 @@ +#!/bin/sh +# +# Porteus Kiosk initialization script. +# Author: T.Jokiel +# +# 2021 longpanda admin@ventoy.net +# + + +/bin/busybox --install -s +mount -nt proc proc /proc +grep -q -w debug /proc/cmdline || { echo 0 >/proc/sys/kernel/printk 2>/dev/null; clear; } +mount -nt sysfs sysfs /sys +mount -nt devtmpfs none /dev +mkdir -p /dev/shm; chmod 1777 /dev/shm + +grep -q -w debug /proc/cmdline && touch /tmp/lspci || quiet=yes + +# Use memory as aufs +mount -nt tmpfs -o size=75% tmpfs /memory +mkdir -p /memory/xino /memory/changes /memory/images /memory/copy2ram + +# Setup aufs +mount -nt aufs -o nowarn_perm,xino=/memory/xino/.aufs.xino,br:/memory/changes=rw aufs /union + + +#Draw background +if [ -z "$quiet" ]; then + echo "##################################################" + echo "Starting Ventoy Live GUI " + echo "##################################################" +else + mkdir -p /lib /opt/000 /opt/001; lspci >/tmp/lspci + mount -o loop /000-kernel.xzm /opt/000 + mount -o loop /001-core.xzm /opt/001 + [ `uname -m` = x86_64 ] && prefix="-x86-64" + ln -sf /opt/000/lib/firmware /lib/firmware + ln -sf /opt/000/lib/modules /lib/modules + ln -sf /opt/001/lib64/libc.so.6 /lib/libc.so.6 + ln -sf /opt/001/lib64/ld-linux"$prefix".so.2 /lib/ld-linux"$prefix".so.2 + ln -s /opt/001/bin/kmod /bin/modprobe + + vga=`lspci | grep 0300: | head -n1 | cut -d: -f3-4 | sed s/:/d0000/g`; [ "$vga" ] && driver="$(grep -i $vga /lib/modules/`uname -r`/modules.alias 2>/dev/null | head -n1 | rev | cut -d" " -f1 | rev)" + + # Nvidia quirk: + [ "$driver" ] || { lspci | grep 0300: | head -n1 | cut -d: -f3 | grep -q "10de" && driver=nouveau; } + + # VirtualBox quirk: + [ "$driver" = vboxvideo ] || modprobe $driver 2>/dev/null + test -e /dev/fb0 || { cp /opt/001/sbin/v86d /sbin; modprobe uvesafb mode_option=1024x768-32; } + if test -e /dev/fb0; then + rm -r /lib; ln -sf /opt/001/lib64 /lib; ln -sf /opt/001/usr/lib64 /usr/lib + /opt/001/usr/bin/fbv -a -c -u -i -k -e -r /VTOY/background.png 2>/dev/null & + fi +fi + + +cp -a /*.xzm /memory/copy2ram/ + +# Populate aufs with modules: +for x in `ls -1 /memory/copy2ram/ | grep \\.xzm$`; do + mkdir -p /memory/images/$x + mount -nt squashfs -o loop /memory/copy2ram/$x /memory/images/$x 2>/dev/null + if [ $? -eq 0 ]; then + mount -no remount,add:1:/memory/images/$x=rr aufs /union + fi +done + + + + +#clean +if [ -n "$quiet" ]; then + while [ "`pidof fbv`" ]; do + usleep 500000 + done + umount /opt/000 /opt/001 2>/dev/null + rm -r /lib +fi + + + +mkdir -p /union/opt/scripts/ +echo 123 > /union/opt/scripts/extras + +echo "c2::respawn:/sbin/agetty --autologin root 38400 tty2 linux" >> /union/etc/inittab +echo "c3::respawn:/sbin/agetty --autologin root 38400 tty3 linux" >> /union/etc/inittab +echo "c4::respawn:/sbin/agetty --autologin root 38400 tty4 linux" >> /union/etc/inittab + + +sed "s/root:[^:]*:/root::/g" -i /union/etc/shadow +rm -f /union/etc/X11/xorg.conf.d/10-xorg.conf +rm -f /union/lib64/udev/rules.d/10-kiosk-auto_mount.rules +cp -a /VTOY/autostart /union/etc/xdg/openbox/autostart +cp -a /VTOY/*.png /union/ventoy/ + +mkdir -p /union/usr/local/sbin +mv /VTOY/ntfs-3g.tar.gz /union/usr/local/sbin/ +mv /VTOY/busybox /union/usr/local/sbin/ + + +cp -a /bin/busybox /union/bin; ln -sf /union/lib /lib +cp -a /VTOY/wallpaper.png /union/usr/share/wallpapers/ 2>/dev/null + +#to suppress error message +mkdir -p /mnt/fake/docs +echo 11 > /mnt/fake/docs/kiosk.sgn + +# swith_root +exec /sbin/switch_root /union /sbin/init + diff --git a/LiveCDGUI/VTOY/refresh.png b/LiveCDGUI/VTOY/refresh.png new file mode 100644 index 00000000..ce8f917d Binary files /dev/null and b/LiveCDGUI/VTOY/refresh.png differ diff --git a/LiveCDGUI/VTOY/secure.png b/LiveCDGUI/VTOY/secure.png new file mode 100644 index 00000000..0416f384 Binary files /dev/null and b/LiveCDGUI/VTOY/secure.png differ diff --git a/LiveCDGUI/VTOY/wallpaper.png b/LiveCDGUI/VTOY/wallpaper.png new file mode 100644 index 00000000..d1131a42 Binary files /dev/null and b/LiveCDGUI/VTOY/wallpaper.png differ diff --git a/LiveCDGUI/download_ext.sh b/LiveCDGUI/download_ext.sh new file mode 100644 index 00000000..ba4a2dfb --- /dev/null +++ b/LiveCDGUI/download_ext.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +date +"%Y/%m/%d %H:%M:%S" +echo downloading EXT files ... + +wget -q -P ./EXT/ https://github.com/ventoy/KioskFiles/releases/download/v1.0/Porteus-Kiosk-5.2.0-x86_64.iso +wget -q -P ./EXT/ https://github.com/ventoy/KioskFiles/releases/download/v1.0/06-fonts.xzm + +[ -d ./__tmp__ ] && rm -rf ./__tmp__ +mkdir __tmp__ + +mount ./EXT/Porteus-Kiosk-5.2.0-x86_64.iso ./__tmp__ +cp -a ./__tmp__/boot/vmlinuz ./EXT/ +cp -a ./__tmp__/boot/initrd.xz ./EXT/ +cp -a ./__tmp__/xzm/* ./EXT/ + +umount ./__tmp__ +rm -rf ./__tmp__ +rm -f ./EXT/Porteus-Kiosk-5.2.0-x86_64.iso + +date +"%Y/%m/%d %H:%M:%S" +echo downloading EXT files finish ... + diff --git a/LiveCDGUI/initrd.sh b/LiveCDGUI/initrd.sh new file mode 100644 index 00000000..5cb23e23 --- /dev/null +++ b/LiveCDGUI/initrd.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +VENTOY_PATH=$PWD/../ + +if ! [ -f $VENTOY_PATH/INSTALL/grub/grub.cfg ]; then + echo "no grub.cfg detected" + exit 1 +fi + +version=$(grep 'set.*VENTOY_VERSION=' $VENTOY_PATH/INSTALL/grub/grub.cfg | awk -F'"' '{print $2}') + +if ! [ -e $VENTOY_PATH/INSTALL/ventoy-${version}-linux.tar.gz ]; then + echo "no ventoy-${version}-linux.tar.gz detected" + exit 1 +fi + +echo "Ventoy LiveCD GUI $version" + +[ -d _INITRD_ ] && rm -rf _INITRD_ +mkdir _INITRD_ +cd _INITRD_ + +xzcat ../EXT/initrd.xz | cpio -idmu --quiet >/dev/null 2>&1 +cp -a ../EXT/*.xzm ./ +cp -a ../VTOY ./ +cp -a ../EXT/ntfs-3g.tar.gz ./VTOY/ +cp -a ../EXT/busybox-x86_64 ./VTOY/busybox + +chown -R 0:0 ./VTOY +chmod -R 777 ./VTOY + + +mkdir ventoy +tar -xf $VENTOY_PATH/INSTALL/ventoy-${version}-linux.tar.gz -C . +mv ./ventoy-${version} ./ventoy/ventoy +chmod -R 777 ./ventoy +mksquashfs ventoy ventoy.xzm -comp xz +rm -rf ./ventoy + + +rm -f ../initrd.img +find . | cpio --quiet -o -H newc > ../initrd.img + +cd .. +rm -rf _INITRD_ + diff --git a/LiveCDGUI/livecd.sh b/LiveCDGUI/livecd.sh new file mode 100644 index 00000000..326839dd --- /dev/null +++ b/LiveCDGUI/livecd.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +if [ "$1" = "CI" ]; then + OPT='-dR' +else + OPT='-a' +fi + +VENTOY_PATH=$PWD/../ + +if ! [ -f $VENTOY_PATH/INSTALL/grub/grub.cfg ]; then + echo "no grub.cfg detected" + exit 1 +fi + +version=$(grep 'set.*VENTOY_VERSION=' $VENTOY_PATH/INSTALL/grub/grub.cfg | awk -F'"' '{print $2}') + +if ! [ -e $VENTOY_PATH/INSTALL/ventoy-${version}-linux.tar.gz ]; then + echo "no ventoy-${version}-linux.tar.gz detected" + exit 1 +fi + +if [ "$1" = "CI" ]; then + sh ./download_ext.sh +fi + +if [ ! -f ./EXT/vmlinuz ]; then + echo "Please download EXT files firstly!" + exit 1 +fi + +sh ./initrd.sh + + +rm -rf ISO_TMP +cp -a ISO ISO_TMP + +if ! [ -d ISO_TMP ]; then + echo "Copy ISO_TMP failed" + exit 1 +fi + +cp -a ./EXT/vmlinuz ISO_TMP/EFI/boot/ +mv ./initrd.img ISO_TMP/EFI/boot/initrd + +cp -a GRUB/cdrom.img ISO_TMP/EFI/boot/ +cp -a GRUB/bootx64.efi ISO_TMP/EFI/boot/ + + +rm -rf efimnt +rm -f efi.img +mkdir -p efimnt + +dd if=/dev/zero of=efi.img bs=1M count=2 +mkfs.vfat efi.img +mount efi.img efimnt +mkdir -p efimnt/EFI/boot +cp $OPT GRUB/bootx64.efi efimnt/EFI/boot/ +umount efimnt + +sync +cp -a efi.img ISO_TMP/EFI/boot/ + +rm -rf efimnt +rm -f efi.img + + +cd ISO_TMP + +sed "s/xxx/$version/g" -i EFI/boot/grub.cfg + +rm -f ../ventoy-${version}-livecd.iso + +xorriso -as mkisofs -allow-lowercase --sort-weight 0 / --sort-weight 1 /EFI -v -R -J -V 'VentoyLiveCD' -P 'VENTOY COMPATIBLE' -p 'https://www.ventoy.net' -sysid 'Ventoy' -A 'VentoyLiveCD' -b EFI/boot/cdrom.img --grub2-boot-info --grub2-mbr ../GRUB/boot_hybrid.img -c EFI/boot/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e EFI/boot/efi.img -no-emul-boot -append_partition 2 0xEF EFI/boot/efi.img -o ../ventoy-${version}-livecd.iso . + +cd ../ +rm -rf ISO_TMP + +echo "" +if [ -f ventoy-${version}-livecd.iso ]; then + echo "========== SUCCESS =============" +else + echo "========== FAILED =============" +fi +echo "" + + diff --git a/Plugson/build.sh b/Plugson/build.sh new file mode 100644 index 00000000..095d0709 --- /dev/null +++ b/Plugson/build.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +if [ "$1" = "sim" ]; then + exopt="-DVENTOY_SIM" +fi + +build_func() { + libsuffix=$2 + toolDir=$3 + + XXFLAG='-std=gnu99 -D_FILE_OFFSET_BITS=64' + XXLIB="" + + echo "CC=$1 libsuffix=$libsuffix toolDir=$toolDir" + + echo "CC civetweb.o" + $1 $XXFLAG -c -Wall -Wextra -Wshadow -Wformat-security -Winit-self \ + -Wmissing-prototypes -O2 -DLINUX \ + -I./src/Lib/libhttp/include \ + -DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED \ + -DUSE_STACK_SIZE=102400 -DNDEBUG -fPIC \ + ./src/Lib/libhttp/include/civetweb.c \ + -o ./civetweb.o + + echo "CC plugson.o" + $1 $XXFLAG -O2 $exopt -Wall -Wno-unused-function -DSTATIC=static -DINIT= \ + -I./src \ + -I./src/Core \ + -I./src/Web \ + -I./src/Include \ + -I./src/Lib/libhttp/include \ + -I./src/Lib/fat_io_lib/include \ + -I./src/Lib/xz-embedded/linux/include \ + -I./src/Lib/xz-embedded/linux/include/linux \ + -I./src/Lib/xz-embedded/userspace \ + -I ./src/Lib/exfat/src/libexfat \ + -I ./src/Lib/exfat/src/mkfs \ + -I ./src/Lib/fat_io_lib \ + \ + -L ./src/Lib/fat_io_lib/lib \ + src/main_linux.c \ + src/Core/ventoy_crc32.c \ + src/Core/ventoy_disk.c \ + src/Core/ventoy_disk_linux.c \ + src/Core/ventoy_json.c \ + src/Core/ventoy_log.c \ + src/Core/ventoy_md5.c \ + src/Core/ventoy_util.c \ + src/Core/ventoy_util_linux.c \ + src/Web/*.c \ + src/Lib/xz-embedded/linux/lib/decompress_unxz.c \ + src/Lib/fat_io_lib/*.c \ + $XXLIB \ + -l pthread \ + ./civetweb.o \ + -o Plugson$libsuffix + + rm -f *.o + + if [ "$libsuffix" = "aa64" ]; then + aarch64-linux-gnu-strip Plugson$libsuffix + elif [ "$libsuffix" = "m64e" ]; then + mips-linux-gnu-strip Plugson$libsuffix + else + strip Plugson$libsuffix + fi + + rm -f ../INSTALL/tool/$toolDir/Plugson + cp -a Plugson$libsuffix ../INSTALL/tool/$toolDir/Plugson + +} + +build_func "gcc" '64' 'x86_64' + +build_func "gcc -m32" '32' 'i386' +build_func "aarch64-linux-gnu-gcc" 'aa64' 'aarch64' +build_func "mips-linux-gnu-gcc -mips64r2 -mabi=64" 'm64e' 'mips64el' + diff --git a/Plugson/pack.sh b/Plugson/pack.sh new file mode 100644 index 00000000..46fbf032 --- /dev/null +++ b/Plugson/pack.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +if [ -n "$PKG_DATE" ]; then + plugson_verion=$PKG_DATE +else + plugson_verion=$(date '+%Y%m%d %H:%M:%S') +fi + +sed "s#.*plugson_build_date.*# $plugson_verion#" -i ./www/index.html + +if [ ! -f ./vs/VentoyPlugson/Release/VentoyPlugson.exe ]; then + echo "NO VentoyPlugson.exe found" + exit 1 +fi + +if [ -f ./www.tar.xz ]; then + rm -f ./www.tar.xz +fi + +[ -f ./www/helplist ] && rm -f ./www/helplist +ls -1 ../INSTALL/grub/help/ | while read line; do + echo -n ${line:0:5} >> ./www/helplist +done +echo -n "$plugson_verion" > ./www/buildtime + +tar cf www.tar www +xz --check=crc32 www.tar + +rm -f ../INSTALL/VentoyPlugson.exe +cp -a ./vs/VentoyPlugson/Release/VentoyPlugson.exe ../INSTALL/VentoyPlugson.exe + +rm -f ../INSTALL/tool/plugson.tar.xz +mv ./www.tar.xz ../INSTALL/tool/plugson.tar.xz + +echo "" +echo "========= SUCCESS ===========" +echo "" + + diff --git a/Plugson/src/Core/ventoy_crc32.c b/Plugson/src/Core/ventoy_crc32.c new file mode 100644 index 00000000..a281ea6a --- /dev/null +++ b/Plugson/src/Core/ventoy_crc32.c @@ -0,0 +1,304 @@ +/****************************************************************************** + * crc32.c ---- ventoy crc32 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#if defined(_MSC_VER) || defined(WIN32) +#include +#define uint32_t UINT32 +#else +#include +#endif + +static uint32_t g_crc_table[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +uint32_t ventoy_crc32(void *Buffer, uint32_t Length) +{ + uint32_t i; + uint8_t *Ptr = Buffer; + uint32_t Crc = 0xFFFFFFFF; + + for (i = 0; i < Length; i++, Ptr++) + { + Crc = (Crc >> 8) ^ g_crc_table[(uint8_t) Crc ^ *Ptr]; + } + + return Crc ^ 0xffffffff; +} + diff --git a/Plugson/src/Core/ventoy_define.h b/Plugson/src/Core/ventoy_define.h new file mode 100644 index 00000000..8163f889 --- /dev/null +++ b/Plugson/src/Core/ventoy_define.h @@ -0,0 +1,207 @@ +/****************************************************************************** + * ventoy_define.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_DEFINE_H__ +#define __VENTOY_DEFINE_H__ + +#if defined(_MSC_VER) || defined(WIN32) +#include +#include +#else +#include +#include +#include +#include +#include +#include +#include +#include +#endif + +#define LOG_FILE "VentoyPlugson.log" + +#define SIZE_1MB 1048576 +#define SIZE_1GB 1073741824 +#define JSON_BUF_MAX (8 * SIZE_1MB) +#define TAR_BUF_MAX (8 * SIZE_1MB) + +#define VTOYIMG_PART_START_BYTES (1024 * 1024) +#define VTOYIMG_PART_START_SECTOR 2048 + +#define VTOYEFI_PART_BYTES (32 * 1024 * 1024) +#define VTOYEFI_PART_SECTORS 65536 + + +#pragma pack(1) + +typedef struct vtoy_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}vtoy_guid; + +typedef struct PART_TABLE +{ + uint8_t Active; // 0x00 0x80 + + uint8_t StartHead; + uint16_t StartSector : 6; + uint16_t StartCylinder : 10; + + uint8_t FsFlag; + + uint8_t EndHead; + uint16_t EndSector : 6; + uint16_t EndCylinder : 10; + + uint32_t StartSectorId; + uint32_t SectorCount; +}PART_TABLE; + +typedef struct MBR_HEAD +{ + uint8_t BootCode[446]; + PART_TABLE PartTbl[4]; + uint8_t Byte55; + uint8_t ByteAA; +}MBR_HEAD; + +typedef struct VTOY_GPT_HDR +{ + char Signature[8]; /* EFI PART */ + uint8_t Version[4]; + uint32_t Length; + uint32_t Crc; + uint8_t Reserved1[4]; + uint64_t EfiStartLBA; + uint64_t EfiBackupLBA; + uint64_t PartAreaStartLBA; + uint64_t PartAreaEndLBA; + vtoy_guid DiskGuid; + uint64_t PartTblStartLBA; + uint32_t PartTblTotNum; + uint32_t PartTblEntryLen; + uint32_t PartTblCrc; + uint8_t Reserved2[420]; +}VTOY_GPT_HDR; + +typedef struct VTOY_GPT_PART_TBL +{ + vtoy_guid PartType; + vtoy_guid PartGuid; + uint64_t StartLBA; + uint64_t LastLBA; + uint64_t Attr; + uint16_t Name[36]; +}VTOY_GPT_PART_TBL; + +typedef struct VTOY_GPT_INFO +{ + MBR_HEAD MBR; + VTOY_GPT_HDR Head; + VTOY_GPT_PART_TBL PartTbl[128]; +}VTOY_GPT_INFO; +#pragma pack() + + +#define MBR_PART_STYLE 0 +#define GPT_PART_STYLE 1 + +#pragma pack(1) +typedef struct ventoy_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}ventoy_guid; +#pragma pack() + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define VLOG_LOG 1 +#define VLOG_DEBUG 2 + +#define ulong unsigned long +#define _ll long long +#define _ull unsigned long long + +#if defined(_MSC_VER) || defined(WIN32) +#define strlcpy(dst, src) strcpy_s(dst, sizeof(dst), src) +#define scnprintf(dst, len, fmt, ...) sprintf_s(dst, len, fmt, ##__VA_ARGS__) + +#define vlog(fmt, ...) ventoy_syslog(VLOG_LOG, fmt, ##__VA_ARGS__) +#define vdebug(fmt, ...) ventoy_syslog(VLOG_DEBUG, fmt, ##__VA_ARGS__) + +#define localtime_r(a,b) localtime_s(b,a) + +#define LASTERR GetLastError() + +#define CHECK_CLOSE_HANDLE(Handle) \ +{\ + if (Handle != INVALID_HANDLE_VALUE) \ + {\ + CloseHandle(Handle); \ + Handle = INVALID_HANDLE_VALUE; \ + }\ +} + +#else +#define strlcpy(dst, src) strncpy(dst, src, sizeof(dst) - 1) +#define scnprintf(dst, len, fmt, args...) snprintf(dst, len, fmt, ##args) + +#define vlog(fmt, args...) ventoy_syslog(VLOG_LOG, fmt, ##args) +#define vdebug(fmt, args...) ventoy_syslog(VLOG_DEBUG, fmt, ##args) + +#define MAX_PATH PATH_MAX + +#endif + +#define CHECK_FREE(p) \ +{\ + if (p)\ + {\ + free(p); \ + (p) = NULL; \ + }\ +} + +void ventoy_syslog(int level, const char *Fmt, ...); +void ventoy_set_loglevel(int level); +uint32_t ventoy_crc32(void *Buffer, uint32_t Length); + + +#if defined(_MSC_VER) || defined(WIN32) +static __inline void * zalloc(size_t n) +#else +static inline void * zalloc(size_t n) +#endif +{ + void *p = malloc(n); + if (p) memset(p, 0, n); + return p; +} + + +#endif /* __VENTOY_DEFINE_H__ */ + diff --git a/Plugson/src/Core/ventoy_disk.c b/Plugson/src/Core/ventoy_disk.c new file mode 100644 index 00000000..2b81d019 --- /dev/null +++ b/Plugson/src/Core/ventoy_disk.c @@ -0,0 +1,24 @@ +/****************************************************************************** + * ventoy_disk.c ---- ventoy disk + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include + + diff --git a/Plugson/src/Core/ventoy_disk.h b/Plugson/src/Core/ventoy_disk.h new file mode 100644 index 00000000..e3c449a2 --- /dev/null +++ b/Plugson/src/Core/ventoy_disk.h @@ -0,0 +1,166 @@ +/****************************************************************************** + * ventoy_disk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_DISK_H__ +#define __VENTOY_DISK_H__ + +#define MAX_DISK 256 +typedef struct ventoy_disk +{ + char devname[64]; + + int pathcase; + char cur_fsname[64]; + char cur_capacity[64]; + char cur_model[256]; + char cur_ventoy_ver[64]; + int cur_secureboot; + int cur_part_style; + +}ventoy_disk; + +#if defined(_MSC_VER) || defined(WIN32) + + + +#else + +typedef enum +{ + VTOY_DEVICE_UNKNOWN = 0, + VTOY_DEVICE_SCSI, + VTOY_DEVICE_USB, + VTOY_DEVICE_IDE, + VTOY_DEVICE_DAC960, + VTOY_DEVICE_CPQARRAY, + VTOY_DEVICE_FILE, + VTOY_DEVICE_ATARAID, + VTOY_DEVICE_I2O, + VTOY_DEVICE_UBD, + VTOY_DEVICE_DASD, + VTOY_DEVICE_VIODASD, + VTOY_DEVICE_SX8, + VTOY_DEVICE_DM, + VTOY_DEVICE_XVD, + VTOY_DEVICE_SDMMC, + VTOY_DEVICE_VIRTBLK, + VTOY_DEVICE_AOE, + VTOY_DEVICE_MD, + VTOY_DEVICE_LOOP, + VTOY_DEVICE_NVME, + VTOY_DEVICE_RAM, + VTOY_DEVICE_PMEM, + + VTOY_DEVICE_END +}ventoy_dev_type; + +/* from */ +#define IDE0_MAJOR 3 +#define IDE1_MAJOR 22 +#define IDE2_MAJOR 33 +#define IDE3_MAJOR 34 +#define IDE4_MAJOR 56 +#define IDE5_MAJOR 57 +#define SCSI_CDROM_MAJOR 11 +#define SCSI_DISK0_MAJOR 8 +#define SCSI_DISK1_MAJOR 65 +#define SCSI_DISK2_MAJOR 66 +#define SCSI_DISK3_MAJOR 67 +#define SCSI_DISK4_MAJOR 68 +#define SCSI_DISK5_MAJOR 69 +#define SCSI_DISK6_MAJOR 70 +#define SCSI_DISK7_MAJOR 71 +#define SCSI_DISK8_MAJOR 128 +#define SCSI_DISK9_MAJOR 129 +#define SCSI_DISK10_MAJOR 130 +#define SCSI_DISK11_MAJOR 131 +#define SCSI_DISK12_MAJOR 132 +#define SCSI_DISK13_MAJOR 133 +#define SCSI_DISK14_MAJOR 134 +#define SCSI_DISK15_MAJOR 135 +#define COMPAQ_SMART2_MAJOR 72 +#define COMPAQ_SMART2_MAJOR1 73 +#define COMPAQ_SMART2_MAJOR2 74 +#define COMPAQ_SMART2_MAJOR3 75 +#define COMPAQ_SMART2_MAJOR4 76 +#define COMPAQ_SMART2_MAJOR5 77 +#define COMPAQ_SMART2_MAJOR6 78 +#define COMPAQ_SMART2_MAJOR7 79 +#define COMPAQ_SMART_MAJOR 104 +#define COMPAQ_SMART_MAJOR1 105 +#define COMPAQ_SMART_MAJOR2 106 +#define COMPAQ_SMART_MAJOR3 107 +#define COMPAQ_SMART_MAJOR4 108 +#define COMPAQ_SMART_MAJOR5 109 +#define COMPAQ_SMART_MAJOR6 110 +#define COMPAQ_SMART_MAJOR7 111 +#define DAC960_MAJOR 48 +#define ATARAID_MAJOR 114 +#define I2O_MAJOR1 80 +#define I2O_MAJOR2 81 +#define I2O_MAJOR3 82 +#define I2O_MAJOR4 83 +#define I2O_MAJOR5 84 +#define I2O_MAJOR6 85 +#define I2O_MAJOR7 86 +#define I2O_MAJOR8 87 +#define UBD_MAJOR 98 +#define DASD_MAJOR 94 +#define VIODASD_MAJOR 112 +#define AOE_MAJOR 152 +#define SX8_MAJOR1 160 +#define SX8_MAJOR2 161 +#define XVD_MAJOR 202 +#define SDMMC_MAJOR 179 +#define LOOP_MAJOR 7 +#define MD_MAJOR 9 +#define BLKEXT_MAJOR 259 +#define RAM_MAJOR 1 + +#define SCSI_BLK_MAJOR(M) ( \ + (M) == SCSI_DISK0_MAJOR \ + || (M) == SCSI_CDROM_MAJOR \ + || ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR) \ + || ((M) >= SCSI_DISK8_MAJOR && (M) <= SCSI_DISK15_MAJOR)) + +#define IDE_BLK_MAJOR(M) \ + ((M) == IDE0_MAJOR || \ + (M) == IDE1_MAJOR || \ + (M) == IDE2_MAJOR || \ + (M) == IDE3_MAJOR || \ + (M) == IDE4_MAJOR || \ + (M) == IDE5_MAJOR) + +#define SX8_BLK_MAJOR(M) ((M) >= SX8_MAJOR1 && (M) <= SX8_MAJOR2) +#define I2O_BLK_MAJOR(M) ((M) >= I2O_MAJOR1 && (M) <= I2O_MAJOR8) +#define CPQARRAY_BLK_MAJOR(M) \ + (((M) >= COMPAQ_SMART2_MAJOR && (M) <= COMPAQ_SMART2_MAJOR7) || \ + (COMPAQ_SMART_MAJOR <= (M) && (M) <= COMPAQ_SMART_MAJOR7)) + +#endif + +int ventoy_disk_init(void); +void ventoy_disk_exit(void); +int ventoy_get_disk_info(char **argv); +const ventoy_disk * ventoy_get_disk_list(int *num); +const ventoy_disk * ventoy_get_disk_node(int id); +int CheckRuntimeEnvironment(char Letter, ventoy_disk *disk); + +#endif /* __VENTOY_DISK_H__ */ + diff --git a/Plugson/src/Core/ventoy_disk_linux.c b/Plugson/src/Core/ventoy_disk_linux.c new file mode 100644 index 00000000..1a081592 --- /dev/null +++ b/Plugson/src/Core/ventoy_disk_linux.c @@ -0,0 +1,607 @@ +/****************************************************************************** + * ventoy_disk.c ---- ventoy disk + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int g_fatlib_media_fd = 0; +static uint64_t g_fatlib_media_offset = 0; + +static const char *g_ventoy_dev_type_str[VTOY_DEVICE_END] = +{ + "unknown", "scsi", "USB", "ide", "dac960", + "cpqarray", "file", "ataraid", "i2o", + "ubd", "dasd", "viodasd", "sx8", "dm", + "xvd", "sd/mmc", "virtblk", "aoe", + "md", "loopback", "nvme", "brd", "pmem" +}; + +static const char * ventoy_get_dev_type_name(ventoy_dev_type type) +{ + return (type < VTOY_DEVICE_END) ? g_ventoy_dev_type_str[type] : "unknown"; +} + +static int ventoy_check_blk_major(int major, const char *type) +{ + int flag = 0; + int valid = 0; + int devnum = 0; + int len = 0; + char line[64]; + char *pos = NULL; + FILE *fp = NULL; + + fp = fopen("/proc/devices", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(type); + while (fgets(line, sizeof(line), fp)) + { + if (flag) + { + pos = strchr(line, ' '); + if (pos) + { + devnum = (int)strtol(line, NULL, 10); + if (devnum == major) + { + if (strncmp(pos + 1, type, len) == 0) + { + valid = 1; + } + break; + } + } + } + else if (strncmp(line, "Block devices:", 14) == 0) + { + flag = 1; + } + } + + fclose(fp); + return valid; +} + +static int ventoy_get_disk_devnum(const char *name, int *major, int* minor) +{ + int rc; + char *pos; + char devnum[16] = {0}; + + rc = ventoy_get_sys_file_line(devnum, sizeof(devnum), "/sys/block/%s/dev", name); + if (rc) + { + return 1; + } + + pos = strstr(devnum, ":"); + if (!pos) + { + return 1; + } + + *major = (int)strtol(devnum, NULL, 10); + *minor = (int)strtol(pos + 1, NULL, 10); + + return 0; +} + +static ventoy_dev_type ventoy_get_dev_type(const char *name, int major, int minor) +{ + int rc; + char syspath[128]; + char dstpath[256]; + + memset(syspath, 0, sizeof(syspath)); + memset(dstpath, 0, sizeof(dstpath)); + + scnprintf(syspath, sizeof(syspath), "/sys/block/%s", name); + rc = readlink(syspath, dstpath, sizeof(dstpath) - 1); + if (rc > 0 && strstr(dstpath, "/usb")) + { + return VTOY_DEVICE_USB; + } + + if (SCSI_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_SCSI; + } + else if (IDE_BLK_MAJOR(major) && (minor % 0x40 == 0)) + { + return VTOY_DEVICE_IDE; + } + else if (major == DAC960_MAJOR && (minor % 0x8 == 0)) + { + return VTOY_DEVICE_DAC960; + } + else if (major == ATARAID_MAJOR && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_ATARAID; + } + else if (major == AOE_MAJOR && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_AOE; + } + else if (major == DASD_MAJOR && (minor % 0x4 == 0)) + { + return VTOY_DEVICE_DASD; + } + else if (major == VIODASD_MAJOR && (minor % 0x8 == 0)) + { + return VTOY_DEVICE_VIODASD; + } + else if (SX8_BLK_MAJOR(major) && (minor % 0x20 == 0)) + { + return VTOY_DEVICE_SX8; + } + else if (I2O_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_I2O; + } + else if (CPQARRAY_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_CPQARRAY; + } + else if (UBD_MAJOR == major && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_UBD; + } + else if (XVD_MAJOR == major && (minor % 0x10 == 0)) + { + return VTOY_DEVICE_XVD; + } + else if (SDMMC_MAJOR == major && (minor % 0x8 == 0)) + { + return VTOY_DEVICE_SDMMC; + } + else if (ventoy_check_blk_major(major, "virtblk")) + { + return VTOY_DEVICE_VIRTBLK; + } + else if (major == LOOP_MAJOR) + { + return VTOY_DEVICE_LOOP; + } + else if (major == MD_MAJOR) + { + return VTOY_DEVICE_MD; + } + else if (major == RAM_MAJOR) + { + return VTOY_DEVICE_RAM; + } + else if (strstr(name, "nvme") && ventoy_check_blk_major(major, "blkext")) + { + return VTOY_DEVICE_NVME; + } + else if (strstr(name, "pmem") && ventoy_check_blk_major(major, "blkext")) + { + return VTOY_DEVICE_PMEM; + } + + return VTOY_DEVICE_END; +} + +static int ventoy_is_possible_blkdev(const char *name) +{ + if (name[0] == '.') + { + return 0; + } + + /* /dev/ramX */ + if (name[0] == 'r' && name[1] == 'a' && name[2] == 'm') + { + return 0; + } + + /* /dev/zramX */ + if (name[0] == 'z' && name[1] == 'r' && name[2] == 'a' && name[3] == 'm') + { + return 0; + } + + /* /dev/loopX */ + if (name[0] == 'l' && name[1] == 'o' && name[2] == 'o' && name[3] == 'p') + { + return 0; + } + + /* /dev/dm-X */ + if (name[0] == 'd' && name[1] == 'm' && name[2] == '-' && isdigit(name[3])) + { + return 0; + } + + /* /dev/srX */ + if (name[0] == 's' && name[1] == 'r' && isdigit(name[2])) + { + return 0; + } + + return 1; +} + +uint64_t ventoy_get_disk_size_in_byte(const char *disk) +{ + int fd; + int rc; + unsigned long long size = 0; + char diskpath[256] = {0}; + char sizebuf[64] = {0}; + + // Try 1: get size from sysfs + scnprintf(diskpath, sizeof(diskpath) - 1, "/sys/block/%s/size", disk); + if (access(diskpath, F_OK) >= 0) + { + vdebug("get disk size from sysfs for %s\n", disk); + + fd = open(diskpath, O_RDONLY | O_BINARY); + if (fd >= 0) + { + read(fd, sizebuf, sizeof(sizebuf)); + size = strtoull(sizebuf, NULL, 10); + close(fd); + return (uint64_t)(size * 512); + } + } + else + { + vdebug("%s not exist \n", diskpath); + } + + // Try 2: get size from ioctl + scnprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk); + fd = open(diskpath, O_RDONLY); + if (fd >= 0) + { + vdebug("get disk size from ioctl for %s\n", disk); + rc = ioctl(fd, BLKGETSIZE64, &size); + if (rc == -1) + { + size = 0; + vdebug("failed to ioctl %d\n", rc); + } + close(fd); + } + else + { + vdebug("failed to open %s %d\n", diskpath, errno); + } + + vdebug("disk %s size %llu bytes\n", disk, size); + return size; +} + +int ventoy_get_disk_vendor(const char *name, char *vendorbuf, int bufsize) +{ + return ventoy_get_sys_file_line(vendorbuf, bufsize, "/sys/block/%s/device/vendor", name); +} + +int ventoy_get_disk_model(const char *name, char *modelbuf, int bufsize) +{ + return ventoy_get_sys_file_line(modelbuf, bufsize, "/sys/block/%s/device/model", name); +} + +static int fatlib_media_sector_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + lseek(g_fatlib_media_fd, (sector + g_fatlib_media_offset) * 512ULL, SEEK_SET); + read(g_fatlib_media_fd, buffer, sector_count * 512); + + return 1; +} + +static int fatlib_is_secure_boot_enable(void) +{ + void *flfile = NULL; + + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + vlog("/EFI/BOOT/grubx64_real.efi find, secure boot in enabled\n"); + fl_fclose(flfile); + return 1; + } + else + { + vlog("/EFI/BOOT/grubx64_real.efi not exist\n"); + } + + return 0; +} + +static int fatlib_get_ventoy_version(char *verbuf, int bufsize) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + char *pos = NULL; + char *end = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + pos = strstr(buf, "VENTOY_VERSION="); + if (pos) + { + pos += strlen("VENTOY_VERSION="); + if (*pos == '"') + { + pos++; + } + + end = pos; + while (*end != 0 && *end != '"' && *end != '\r' && *end != '\n') + { + end++; + } + + *end = 0; + + scnprintf(verbuf, bufsize - 1, "%s", pos); + rc = 0; + } + free(buf); + } + + fl_fclose(flfile); + } + else + { + vdebug("No grub.cfg found\n"); + } + + return rc; +} + +/* : Deleted by longpanda, 20211028 PN:XX LABEL:XX */ +#if 0 +int ventoy_get_vtoy_data(ventoy_disk *info, int *ppartstyle) +{ + int i; + int fd; + int len; + int rc = 1; + int ret = 1; + int part_style; + uint64_t part1_start_sector; + uint64_t part1_sector_count; + uint64_t part2_start_sector; + uint64_t part2_sector_count; + uint64_t preserved_space; + char name[64] = {0}; + disk_ventoy_data *vtoy = NULL; + VTOY_GPT_INFO *gpt = NULL; + + vtoy = &(info->vtoydata); + gpt = &(vtoy->gptinfo); + memset(vtoy, 0, sizeof(disk_ventoy_data)); + + vdebug("ventoy_get_vtoy_data %s\n", info->disk_path); + + if (info->size_in_byte < (2 * VTOYEFI_PART_BYTES)) + { + vdebug("disk %s is too small %llu\n", info->disk_path, (_ull)info->size_in_byte); + return 1; + } + + fd = open(info->disk_path, O_RDONLY | O_BINARY); + if (fd < 0) + { + vdebug("failed to open %s %d\n", info->disk_path, errno); + return 1; + } + + len = (int)read(fd, &(vtoy->gptinfo), sizeof(VTOY_GPT_INFO)); + if (len != sizeof(VTOY_GPT_INFO)) + { + vdebug("failed to read %s %d\n", info->disk_path, errno); + goto end; + } + + if (gpt->MBR.Byte55 != 0x55 || gpt->MBR.ByteAA != 0xAA) + { + vdebug("Invalid mbr magic 0x%x 0x%x\n", gpt->MBR.Byte55, gpt->MBR.ByteAA); + goto end; + } + + if (gpt->MBR.PartTbl[0].FsFlag == 0xEE && strncmp(gpt->Head.Signature, "EFI PART", 8) == 0) + { + part_style = GPT_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + if (gpt->PartTbl[0].StartLBA == 0 || gpt->PartTbl[1].StartLBA == 0) + { + vdebug("NO ventoy efi part layout <%llu %llu>\n", + (_ull)gpt->PartTbl[0].StartLBA, + (_ull)gpt->PartTbl[1].StartLBA); + goto end; + } + + for (i = 0; i < 36; i++) + { + name[i] = (char)(gpt->PartTbl[1].Name[i]); + } + if (strcmp(name, "VTOYEFI")) + { + vdebug("Invalid efi part2 name <%s>\n", name); + goto end; + } + + part1_start_sector = gpt->PartTbl[0].StartLBA; + part1_sector_count = gpt->PartTbl[0].LastLBA - part1_start_sector + 1; + part2_start_sector = gpt->PartTbl[1].StartLBA; + part2_sector_count = gpt->PartTbl[1].LastLBA - part2_start_sector + 1; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count + 33) * 512; + } + else + { + part_style = MBR_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + part1_start_sector = gpt->MBR.PartTbl[0].StartSectorId; + part1_sector_count = gpt->MBR.PartTbl[0].SectorCount; + part2_start_sector = gpt->MBR.PartTbl[1].StartSectorId; + part2_sector_count = gpt->MBR.PartTbl[1].SectorCount; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count) * 512; + } + + if (part1_start_sector != VTOYIMG_PART_START_SECTOR || + part2_sector_count != VTOYEFI_PART_SECTORS || + (part1_start_sector + part1_sector_count) != part2_start_sector) + { + vdebug("Not valid ventoy partition layout [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + goto end; + } + + vdebug("ventoy partition layout check OK: [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + + vtoy->ventoy_valid = 1; + + vdebug("now check secure boot for %s ...\n", info->disk_path); + + g_fatlib_media_fd = fd; + g_fatlib_media_offset = part2_start_sector; + fl_init(); + + if (0 == fl_attach_media(fatlib_media_sector_read, NULL)) + { + ret = fatlib_get_ventoy_version(vtoy->ventoy_ver, sizeof(vtoy->ventoy_ver)); + if (ret == 0 && vtoy->ventoy_ver[0]) + { + vtoy->secure_boot_flag = fatlib_is_secure_boot_enable(); + } + else + { + vdebug("fatlib_get_ventoy_version failed %d\n", ret); + } + } + else + { + vdebug("fl_attach_media failed\n"); + } + + fl_shutdown(); + g_fatlib_media_fd = -1; + g_fatlib_media_offset = 0; + + if (vtoy->ventoy_ver[0] == 0) + { + vtoy->ventoy_ver[0] = '?'; + } + + if (0 == vtoy->ventoy_valid) + { + goto end; + } + + lseek(fd, 2040 * 512, SEEK_SET); + read(fd, vtoy->rsvdata, sizeof(vtoy->rsvdata)); + + vtoy->preserved_space = preserved_space; + vtoy->partition_style = part_style; + vtoy->part2_start_sector = part2_start_sector; + + rc = 0; +end: + vtoy_safe_close_fd(fd); + return rc; +} +#endif /* #if 0 */ +/* : Deleted by longpanda, 20211028 PN:XX LABEL:XX */ + + +int ventoy_get_disk_info(char **argv) +{ + uint64_t size; + char vendor[128]; + char model[128]; + char *disk = argv[4]; + + if (strncmp(argv[4], "/dev/", 4) == 0) + { + disk += 4; + } + ventoy_get_disk_vendor(disk, vendor, sizeof(vendor)); + ventoy_get_disk_model(disk, model, sizeof(model)); + + scnprintf(g_sysinfo.cur_model, sizeof(g_sysinfo.cur_model), "%s %s [%s]", vendor, model, argv[4]); + strlcpy(g_sysinfo.cur_ventoy_ver, argv[5]); + strlcpy(g_sysinfo.cur_fsname, argv[6]); + g_sysinfo.cur_part_style = (int)strtol(argv[7], NULL, 10); + g_sysinfo.cur_secureboot = (int)strtol(argv[8], NULL, 10); + + size = ventoy_get_disk_size_in_byte(disk); + scnprintf(g_sysinfo.cur_capacity, sizeof(g_sysinfo.cur_capacity), "%dGB", (int)ventoy_get_human_readable_gb(size)); + + return 0; +} + +int ventoy_disk_init(void) +{ + return 0; +} + +void ventoy_disk_exit(void) +{ +} + + diff --git a/Plugson/src/Core/ventoy_disk_windows.c b/Plugson/src/Core/ventoy_disk_windows.c new file mode 100644 index 00000000..02c157a0 --- /dev/null +++ b/Plugson/src/Core/ventoy_disk_windows.c @@ -0,0 +1,88 @@ +/****************************************************************************** + * ventoy_disk.c ---- ventoy disk + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +static int g_disk_num = 0; +ventoy_disk *g_disk_list = NULL; + +int ventoy_disk_init(void) +{ + char Letter = 'A'; + DWORD Drives = GetLogicalDrives(); + + vlog("ventoy disk init ...\n"); + + g_disk_list = zalloc(sizeof(ventoy_disk) * MAX_DISK); + + while (Drives) + { + if (Drives & 0x01) + { + if (CheckRuntimeEnvironment(Letter, g_disk_list + g_disk_num) == 0) + { + g_disk_list[g_disk_num].devname[0] = Letter; + g_disk_num++; + vlog("%C: is ventoy disk\n", Letter); + } + else + { + memset(g_disk_list + g_disk_num, 0, sizeof(ventoy_disk)); + vlog("%C: is NOT ventoy disk\n", Letter); + } + } + + Letter++; + Drives >>= 1; + } + + return 0; +} + +void ventoy_disk_exit(void) +{ + vlog("ventoy disk exit ...\n"); + + check_free(g_disk_list); + g_disk_list = NULL; + g_disk_num = 0; +} + +const ventoy_disk * ventoy_get_disk_list(int *num) +{ + *num = g_disk_num; + return g_disk_list; +} + +const ventoy_disk * ventoy_get_disk_node(int id) +{ + if (id >= 0 && id < g_disk_num) + { + return g_disk_list + id; + } + + return NULL; +} + diff --git a/Plugson/src/Core/ventoy_json.c b/Plugson/src/Core/ventoy_json.c new file mode 100644 index 00000000..2403e652 --- /dev/null +++ b/Plugson/src/Core/ventoy_json.c @@ -0,0 +1,803 @@ +/****************************************************************************** + * ventoy_json.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#if defined(_MSC_VER) || defined(WIN32) +#else +#include +#include +#include +#endif +#include +#include +#include + +static void vtoy_json_free(VTOY_JSON *pstJsonHead) +{ + VTOY_JSON *pstNext = NULL; + + while (NULL != pstJsonHead) + { + pstNext = pstJsonHead->pstNext; + if ((pstJsonHead->enDataType < JSON_TYPE_BUTT) && (NULL != pstJsonHead->pstChild)) + { + vtoy_json_free(pstJsonHead->pstChild); + } + + free(pstJsonHead); + pstJsonHead = pstNext; + } + + return; +} + +static char *vtoy_json_skip(const char *pcData) +{ + while ((NULL != pcData) && ('\0' != *pcData) && (*pcData <= 32)) + { + pcData++; + } + + return (char *)pcData; +} + +VTOY_JSON *vtoy_json_find_item +( + VTOY_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +) +{ + while (NULL != pstJson) + { + if ((enDataType == pstJson->enDataType) && + (0 == strcmp(szKey, pstJson->pcName))) + { + return pstJson; + } + pstJson = pstJson->pstNext; + } + + return NULL; +} + +static int vtoy_json_parse_number +( + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + unsigned long Value; + + Value = strtoul(pcData, (char **)ppcEnd, 10); + if (*ppcEnd == pcData) + { + vdebug("Failed to parse json number %s.\n", pcData); + return JSON_FAILED; + } + + pstJson->enDataType = JSON_TYPE_NUMBER; + pstJson->unData.lValue = Value; + + return JSON_SUCCESS; +} + +static int vtoy_json_parse_string +( + char *pcNewStart, + char *pcRawStart, + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + uint32_t uiLen = 0; + const char *pcPos = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + + if ('\"' != *pcData) + { + return JSON_FAILED; + } + + pcPos = strchr(pcTmp, '\"'); + if ((NULL == pcPos) || (pcPos < pcTmp)) + { + vdebug("Invalid string %s.\n", pcData); + return JSON_FAILED; + } + + if (*(pcPos - 1) == '\\') + { + for (pcPos++; *pcPos; pcPos++) + { + if (*pcPos == '"' && *(pcPos - 1) != '\\') + { + break; + } + } + + if (*pcPos == 0 || pcPos < pcTmp) + { + vdebug("Invalid quotes string %s.", pcData); + return JSON_FAILED; + } + } + + *ppcEnd = pcPos + 1; + uiLen = (uint32_t)(unsigned long)(pcPos - pcTmp); + + pstJson->enDataType = JSON_TYPE_STRING; + pstJson->unData.pcStrVal = pcNewStart + (pcTmp - pcRawStart); + pstJson->unData.pcStrVal[uiLen] = '\0'; + + return JSON_SUCCESS; +} + +static int vtoy_json_parse_array +( + char *pcNewStart, + char *pcRawStart, + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + VTOY_JSON *pstJsonChild = NULL; + VTOY_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_ARRAY; + + if ('[' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = vtoy_json_skip(pcTmp); + + if (']' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = vtoy_json_parse_value(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pcTmp = vtoy_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = vtoy_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, vtoy_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + pcTmp = vtoy_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && (']' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +static int vtoy_json_parse_object +( + char *pcNewStart, + char *pcRawStart, + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + VTOY_JSON *pstJsonChild = NULL; + VTOY_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_OBJECT; + + if ('{' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = vtoy_json_skip(pcTmp); + if ('}' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = vtoy_json_parse_string(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + + pcTmp = vtoy_json_skip(*ppcEnd); + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = vtoy_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, vtoy_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = vtoy_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = vtoy_json_parse_string(pcNewStart, pcRawStart, pstJsonChild, vtoy_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = vtoy_json_skip(*ppcEnd); + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = vtoy_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, vtoy_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = vtoy_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && ('}' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +int vtoy_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + pcData = vtoy_json_skip(pcData); + + switch (*pcData) + { + case 'n': + { + if (0 == strncmp(pcData, "null", 4)) + { + pstJson->enDataType = JSON_TYPE_NULL; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case 'f': + { + if (0 == strncmp(pcData, "false", 5)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 0; + *ppcEnd = pcData + 5; + return JSON_SUCCESS; + } + break; + } + case 't': + { + if (0 == strncmp(pcData, "true", 4)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 1; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case '\"': + { + return vtoy_json_parse_string(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '[': + { + return vtoy_json_parse_array(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '{': + { + return vtoy_json_parse_object(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '-': + { + return vtoy_json_parse_number(pstJson, pcData, ppcEnd); + } + default : + { + if (*pcData >= '0' && *pcData <= '9') + { + return vtoy_json_parse_number(pstJson, pcData, ppcEnd); + } + } + } + + *ppcEnd = pcData; + vdebug("Invalid json data %u.\n", (uint8_t)(*pcData)); + return JSON_FAILED; +} + +VTOY_JSON * vtoy_json_create(void) +{ + VTOY_JSON *pstJson = NULL; + + pstJson = (VTOY_JSON *)zalloc(sizeof(VTOY_JSON)); + if (NULL == pstJson) + { + return NULL; + } + + return pstJson; +} + +int vtoy_json_parse(VTOY_JSON *pstJson, const char *szJsonData) +{ + uint32_t uiMemSize = 0; + int Ret = JSON_SUCCESS; + char *pcNewBuf = NULL; + const char *pcEnd = NULL; + + uiMemSize = strlen(szJsonData) + 1; + pcNewBuf = (char *)malloc(uiMemSize); + if (NULL == pcNewBuf) + { + vdebug("Failed to alloc new buf.\n"); + return JSON_FAILED; + } + memcpy(pcNewBuf, szJsonData, uiMemSize); + pcNewBuf[uiMemSize - 1] = 0; + + Ret = vtoy_json_parse_value(pcNewBuf, (char *)szJsonData, pstJson, szJsonData, &pcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse json data start=%p, end=%p.\n", szJsonData, pcEnd); + return JSON_FAILED; + } + + return JSON_SUCCESS; +} + +int vtoy_json_parse_ex(VTOY_JSON *pstJson, const char *szJsonData, int szLen) +{ + uint32_t uiMemSize = 0; + int Ret = JSON_SUCCESS; + char *pcNewBuf = NULL; + const char *pcEnd = NULL; + + uiMemSize = (uint32_t)szLen; + pcNewBuf = (char *)malloc(uiMemSize + 1); + if (NULL == pcNewBuf) + { + vdebug("Failed to alloc new buf.\n"); + return JSON_FAILED; + } + memcpy(pcNewBuf, szJsonData, szLen); + pcNewBuf[uiMemSize] = 0; + + Ret = vtoy_json_parse_value(pcNewBuf, (char *)szJsonData, pstJson, szJsonData, &pcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse json data start=%p, end=%p\n", szJsonData, pcEnd); + return JSON_FAILED; + } + + return JSON_SUCCESS; +} + +int vtoy_json_scan_parse +( + const VTOY_JSON *pstJson, + uint32_t uiParseNum, + VTOY_JSON_PARSE_S *pstJsonParse +) +{ + uint32_t i = 0; + const VTOY_JSON *pstJsonCur = NULL; + VTOY_JSON_PARSE_S *pstCurParse = NULL; + + for (pstJsonCur = pstJson; NULL != pstJsonCur; pstJsonCur = pstJsonCur->pstNext) + { + if ((JSON_TYPE_OBJECT == pstJsonCur->enDataType) || + (JSON_TYPE_ARRAY == pstJsonCur->enDataType)) + { + continue; + } + + for (i = 0, pstCurParse = NULL; i < uiParseNum; i++) + { + if (0 == strcmp(pstJsonParse[i].pcKey, pstJsonCur->pcName)) + { + pstCurParse = pstJsonParse + i; + break; + } + } + + if (NULL == pstCurParse) + { + continue; + } + + switch (pstJsonCur->enDataType) + { + case JSON_TYPE_NUMBER: + { + if (sizeof(uint32_t) == pstCurParse->uiBufSize) + { + *(uint32_t *)(pstCurParse->pDataBuf) = (uint32_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint16_t) == pstCurParse->uiBufSize) + { + *(uint16_t *)(pstCurParse->pDataBuf) = (uint16_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint8_t) == pstCurParse->uiBufSize) + { + *(uint8_t *)(pstCurParse->pDataBuf) = (uint8_t)pstJsonCur->unData.lValue; + } + else if ((pstCurParse->uiBufSize > sizeof(uint64_t))) + { + scnprintf((char *)pstCurParse->pDataBuf, pstCurParse->uiBufSize, "%llu", + (unsigned long long)(pstJsonCur->unData.lValue)); + } + else + { + vdebug("Invalid number data buf size %u.\n", pstCurParse->uiBufSize); + } + break; + } + case JSON_TYPE_STRING: + { + scnprintf((char *)pstCurParse->pDataBuf, pstCurParse->uiBufSize, "%s", pstJsonCur->unData.pcStrVal); + break; + } + case JSON_TYPE_BOOL: + { + *(uint8_t *)(pstCurParse->pDataBuf) = (pstJsonCur->unData.lValue) > 0 ? 1 : 0; + break; + } + default : + { + break; + } + } + } + + return JSON_SUCCESS; +} + +int vtoy_json_scan_array +( + VTOY_JSON *pstJson, + const char *szKey, + VTOY_JSON **ppstArrayItem +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int vtoy_json_scan_array_ex +( + VTOY_JSON *pstJson, + const char *szKey, + VTOY_JSON **ppstArrayItem +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem->pstChild; + + return JSON_SUCCESS; +} + +int vtoy_json_scan_object +( + VTOY_JSON *pstJson, + const char *szKey, + VTOY_JSON **ppstObjectItem +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_OBJECT, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstObjectItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int vtoy_json_get_int +( + VTOY_JSON *pstJson, + const char *szKey, + int *piValue +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + //vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *piValue = (int)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int vtoy_json_get_uint +( + VTOY_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *puiValue = (uint32_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int vtoy_json_get_uint64 +( + VTOY_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pui64Value = (uint64_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int vtoy_json_get_bool +( + VTOY_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_BOOL, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pbValue = pstJsonItem->unData.lValue > 0 ? 1 : 0; + + return JSON_SUCCESS; +} + +int vtoy_json_get_string +( + VTOY_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +) +{ + VTOY_JSON *pstJsonItem = NULL; + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + //vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + scnprintf(pcBuf, uiBufLen, "%s", pstJsonItem->unData.pcStrVal); + + return JSON_SUCCESS; +} + +const char * vtoy_json_get_string_ex(VTOY_JSON *pstJson, const char *szKey) +{ + VTOY_JSON *pstJsonItem = NULL; + + if ((NULL == pstJson) || (NULL == szKey)) + { + return NULL; + } + + pstJsonItem = vtoy_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + //vdebug("Key %s is not found in json data.\n", szKey); + return NULL; + } + + return pstJsonItem->unData.pcStrVal; +} + +int vtoy_json_destroy(VTOY_JSON *pstJson) +{ + if (NULL == pstJson) + { + return JSON_SUCCESS; + } + + if (NULL != pstJson->pstChild) + { + vtoy_json_free(pstJson->pstChild); + } + + if (NULL != pstJson->pstNext) + { + vtoy_json_free(pstJson->pstNext); + } + + free(pstJson); + + return JSON_SUCCESS; +} + +int vtoy_json_escape_string(char *buf, int buflen, const char *str, int newline) +{ + char last = 0; + int count = 0; + + *buf++ = '"'; + count++; + + while (*str) + { + if (*str == '"' && last != '\\') + { + *buf = '\\'; + count++; + buf++; + } + + *buf = *str; + count++; + buf++; + + last = *str; + str++; + } + + *buf++ = '"'; + count++; + + *buf++ = ','; + count++; + + if (newline) + { + *buf++ = '\n'; + count++; + } + + return count; +} diff --git a/Plugson/src/Core/ventoy_json.h b/Plugson/src/Core/ventoy_json.h new file mode 100644 index 00000000..bccd3a24 --- /dev/null +++ b/Plugson/src/Core/ventoy_json.h @@ -0,0 +1,436 @@ +/****************************************************************************** + * ventoy_json.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_JSON_H__ +#define __VENTOY_JSON_H__ + +#define JSON_NEW_ITEM(pstJson, ret) \ +{ \ + (pstJson) = (VTOY_JSON *)zalloc(sizeof(VTOY_JSON)); \ + if (NULL == (pstJson)) \ + { \ + vdebug("Failed to alloc memory for json."); \ + return (ret); \ + } \ +} + +#if defined(_MSC_VER) || defined(WIN32) +#define ssprintf(curpos, buf, len, fmt, ...) \ + curpos += scnprintf(buf + curpos, len - curpos, fmt, ##__VA_ARGS__) + +#define VTOY_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0) + +#define VTOY_JSON_PRINT_PREFIX(uiDepth, ...) \ +{ \ + uint32_t _uiLoop = 0; \ + for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \ + { \ + ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \ + } \ + ssprintf(uiCurPos, pcBuf, uiBufLen, ##__VA_ARGS__); \ +} +#else + +#define ssprintf(curpos, buf, len, fmt, args...) \ + curpos += scnprintf(buf + curpos, len - curpos, fmt, ##args) + +#define VTOY_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0) + +#define VTOY_JSON_PRINT_PREFIX(uiDepth, args...) \ +{ \ + uint32_t _uiLoop = 0; \ + for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \ + { \ + ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \ + } \ + ssprintf(uiCurPos, pcBuf, uiBufLen, ##args); \ +} +#endif + + +#define VTOY_JSON_SUCCESS_RET "{ \"result\" : \"success\" }" +#define VTOY_JSON_FAILED_RET "{ \"result\" : \"failed\" }" +#define VTOY_JSON_INVALID_RET "{ \"result\" : \"invalidfmt\" }" +#define VTOY_JSON_TOKEN_ERR_RET "{ \"result\" : \"tokenerror\" }" +#define VTOY_JSON_EXIST_RET "{ \"result\" : \"exist\" }" +#define VTOY_JSON_TIMEOUT_RET "{ \"result\" : \"timeout\" }" +#define VTOY_JSON_BUSY_RET "{ \"result\" : \"busy\" }" +#define VTOY_JSON_INUSE_RET "{ \"result\" : \"inuse\" }" +#define VTOY_JSON_NOTFOUND_RET "{ \"result\" : \"notfound\" }" +#define VTOY_JSON_NOTRUNNING_RET "{ \"result\" : \"notrunning\" }" +#define VTOY_JSON_NOT_READY_RET "{ \"result\" : \"notready\" }" +#define VTOY_JSON_NOT_SUPPORT_RET "{ \"result\" : \"notsupport\" }" +#define VTOY_JSON_MBR_2TB_RET "{ \"result\" : \"mbr2tb\" }" +#define VTOY_JSON_INVALID_RSV_RET "{ \"result\" : \"reserve_invalid\" }" +#define VTOY_JSON_FILE_NOT_FOUND_RET "{ \"result\" : \"file_not_found\" }" + +typedef enum tagJSON_TYPE +{ + JSON_TYPE_NUMBER = 0, + JSON_TYPE_STRING, + JSON_TYPE_BOOL, + JSON_TYPE_ARRAY, + JSON_TYPE_OBJECT, + JSON_TYPE_NULL, + JSON_TYPE_BUTT +}JSON_TYPE; + +typedef struct tagVTOY_JSON +{ + struct tagVTOY_JSON *pstPrev; + struct tagVTOY_JSON *pstNext; + struct tagVTOY_JSON *pstChild; + + JSON_TYPE enDataType; + union + { + char *pcStrVal; + int iNumVal; + uint64_t lValue; + }unData; + + char *pcName; +}VTOY_JSON; + +#define VTOY_JSON_FMT_BEGIN(uiCurPos, pcBuf, uiBufLen) \ +{\ + uint32_t __uiCurPos = (uiCurPos);\ + uint32_t __uiBufLen = (uiBufLen);\ + char *__pcBuf = (pcBuf); + +#define VTOY_JSON_FMT_END(uiCurPos) \ + (uiCurPos) = __uiCurPos;\ +} + +#define VTOY_JSON_FMT_OBJ_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{") +#define VTOY_JSON_FMT_OBJ_BEGIN_L(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{", P) +#define VTOY_JSON_FMT_OBJ_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{\n") +#define VTOY_JSON_FMT_OBJ_BEGIN_LN(P) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{\n", P) + +#define VTOY_JSON_FMT_OBJ_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define VTOY_JSON_FMT_OBJ_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "},");\ +} + + + +#define VTOY_JSON_FMT_KEY(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":", (Key)) +#define VTOY_JSON_FMT_KEY_L(P, Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\":", P, (Key)) + + +#define VTOY_JSON_FMT_ITEM(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\",", (Item)) +#define VTOY_JSON_FMT_ITEM_L(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",", P, (Item)) +#define VTOY_JSON_FMT_ITEM_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, (Item)) +#define VTOY_JSON_FMT_ITEM_PATH_LN(P, Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\",\n", P, ventoy_real_path(Item)) + +#define VTOY_JSON_FMT_COMA() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",") +#define VTOY_JSON_FMT_COMA_N(cnt) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n") +#define VTOY_JSON_FMT_COMA_N_CNT(cnt) if ((cnt) > 0) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",\n") + + +#define VTOY_JSON_FMT_APPEND_BEGIN() \ +{ \ + if ('}' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",");\ +} + +#define VTOY_JSON_FMT_APPEND_END() \ +{ \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define VTOY_JSON_FMT_ARY_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[") +#define VTOY_JSON_FMT_ARY_BEGIN_N() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[\n") + +#define VTOY_JSON_FMT_ARY_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "]");\ +} +#define VTOY_JSON_FMT_ARY_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "],");\ +} + + + +#define VTOY_JSON_FMT_OBJ_END_L(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}%s", P);\ +} +#define VTOY_JSON_FMT_OBJ_ENDEX_L(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},%s", P);\ +} + +#define VTOY_JSON_FMT_OBJ_END_LN(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s}\n", P);\ +} +#define VTOY_JSON_FMT_OBJ_ENDEX_LN(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s},\n", P);\ +} + + + + +#define VTOY_JSON_FMT_ARY_END_L(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]", P);\ +} + +#define VTOY_JSON_FMT_ARY_END_LN(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s]\n", P);\ +} + +#define VTOY_JSON_FMT_ARY_ENDEX_L(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],", P);\ +} + + +#define VTOY_JSON_FMT_ARY_ENDEX_LN(P) \ +{\ + if ('\n' == *(__pcBuf + (__uiCurPos - 1)) && ',' == *(__pcBuf + (__uiCurPos - 2)))\ + {\ + *(__pcBuf + (__uiCurPos - 2)) = '\n';\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s],\n", P);\ +} + + + + +#define VTOY_JSON_FMT_UINT64(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %llu,", Key, (_ull)Val) + +#define VTOY_JSON_FMT_ULONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %lu,", Key, Val) +#define VTOY_JSON_FMT_LONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %ld,", Key, Val) + +#define VTOY_JSON_FMT_UINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,", Key, Val) +#define VTOY_JSON_FMT_UINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %u,\n", Key, Val) +#define VTOY_JSON_FMT_UINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,", P, Key, Val) +#define VTOY_JSON_FMT_UINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %u,\n", P, Key, Val) + + +#define VTOY_JSON_FMT_STRUINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",", Key, Val) +#define VTOY_JSON_FMT_STRUINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%u\",\n", Key, Val) +#define VTOY_JSON_FMT_STRUINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",", P, Key, Val) +#define VTOY_JSON_FMT_STRUINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%u\",\n", P, Key, Val) + +#define VTOY_JSON_FMT_STRSINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",", Key, Val) +#define VTOY_JSON_FMT_STRSINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%d\",\n", Key, Val) +#define VTOY_JSON_FMT_STRSINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",", P, Key, Val) +#define VTOY_JSON_FMT_STRSINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%d\",\n", P, Key, Val) + +#define VTOY_JSON_FMT_CTRL_INT(Prefix, Key, Field) \ + if (def->Field != data->Field) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%d\" },\n", Prefix, Key, data->Field) + +#define VTOY_JSON_FMT_CTRL_STRN(P, Key, Field) \ + if (strcmp(def->Field, data->Field)) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, data->Field) + +#define VTOY_JSON_FMT_CTRL_STRN_STR(P, Key, ptr) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, ptr) + +#define VTOY_JSON_FMT_CTRL_PUB_STRN(P, Key, Field) \ + if (strcmp(def->Field, g_pub_path)) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s{ \"%s\": \"%s\" },\n", P, Key, g_pub_path) + + +#define VTOY_JSON_FMT_DIFF_STRN(P, Key, Field) \ + if (strcmp(def->Field, data->Field)) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, data->Field) + + +#define VTOY_JSON_FMT_STRINT64(Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%llu\",", Key, Val) + +#define VTOY_JSON_FMT_SINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,", Key, Val) +#define VTOY_JSON_FMT_SINT_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %d,\n", Key, Val) +#define VTOY_JSON_FMT_SINT_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,", P, Key, Val) +#define VTOY_JSON_FMT_SINT_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": %d,\n", P, Key, Val) + +#define VTOY_JSON_FMT_DUBL(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %.1lf,", Key, Val) +#define VTOY_JSON_FMT_DUBL2(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": %10.02lf,", Key, Val) + +#define VTOY_JSON_FMT_STRN(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",", Key, Val) +#define VTOY_JSON_FMT_STRN_N(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": \"%s\",\n", Key, Val) +#define VTOY_JSON_FMT_STRN_L(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",", P, Key, Val) +#define VTOY_JSON_FMT_STRN_LN(P, Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, Val) +#define VTOY_JSON_FMT_STRN_PATH_LN(P, Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": \"%s\",\n", P, Key, ventoy_real_path(Val)) + +int vtoy_json_escape_string(char *buf, int buflen, const char *str, int newline); + +#define VTOY_JSON_FMT_STRN_EX_LN(P, Key, Val) \ +{\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "%s\"%s\": ", P, Key);\ + __uiCurPos += vtoy_json_escape_string(__pcBuf + __uiCurPos, __uiBufLen - __uiCurPos, Val, 1);\ +} + + +#define VTOY_JSON_FMT_NULL(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": null,", Key) + +#define VTOY_JSON_FMT_TRUE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key)) +#define VTOY_JSON_FMT_FALSE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key)) + +#define VTOY_JSON_FMT_BOOL(Key, Val) \ +{\ + if (0 == (Val))\ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": false,", (Key));\ + }\ + else \ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\": true,", (Key));\ + }\ +} + +typedef struct tagVTOY_JSON_PARSE +{ + char *pcKey; + void *pDataBuf; + uint32_t uiBufSize; +}VTOY_JSON_PARSE_S; + +#define JSON_SUCCESS 0 +#define JSON_FAILED 1 +#define JSON_NOT_FOUND 2 + +int vtoy_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + VTOY_JSON *pstJson, + const char *pcData, + const char **ppcEnd +); +VTOY_JSON * vtoy_json_create(void); +int vtoy_json_parse(VTOY_JSON *pstJson, const char *szJsonData); +int vtoy_json_parse_ex(VTOY_JSON *pstJson, const char *szJsonData, int szLen); +int vtoy_json_destroy(VTOY_JSON *pstJson); +VTOY_JSON *vtoy_json_find_item +( + VTOY_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +); +int vtoy_json_scan_parse +( + const VTOY_JSON *pstJson, + uint32_t uiParseNum, + VTOY_JSON_PARSE_S *pstJsonParse +); +int vtoy_json_get_int +( + VTOY_JSON *pstJson, + const char *szKey, + int *piValue +); +int vtoy_json_get_uint +( + VTOY_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +); +int vtoy_json_get_uint64 +( + VTOY_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +); +int vtoy_json_get_bool +( + VTOY_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +); +int vtoy_json_get_string +( + VTOY_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +); +const char * vtoy_json_get_string_ex(VTOY_JSON *pstJson, const char *szKey); + +#endif /* __VENTOY_JSON_H__ */ + diff --git a/Plugson/src/Core/ventoy_log.c b/Plugson/src/Core/ventoy_log.c new file mode 100644 index 00000000..68bd50c0 --- /dev/null +++ b/Plugson/src/Core/ventoy_log.c @@ -0,0 +1,151 @@ +/****************************************************************************** + * ventoy_log.c ---- ventoy log + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include + +extern char g_log_file[MAX_PATH]; +static int g_ventoy_log_level = VLOG_DEBUG; +static pthread_mutex_t g_log_mutex; + +int ventoy_log_init(void) +{ + if (ventoy_get_file_size(g_log_file) >= SIZE_1MB) + { + #if defined(_MSC_VER) || defined(WIN32) + DeleteFileA(g_log_file); + #else + remove(g_log_file); + #endif + } + + pthread_mutex_init(&g_log_mutex, NULL); + return 0; +} + +void ventoy_log_exit(void) +{ + pthread_mutex_destroy(&g_log_mutex); +} + +void ventoy_set_loglevel(int level) +{ + g_ventoy_log_level = level; +} + + + +void ventoy_syslog_printf(const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); +#if defined(_MSC_VER) || defined(WIN32) + vsnprintf_s(log, 512, _TRUNCATE, Fmt, arg); +#else + vsnprintf(log, 512, Fmt, arg); +#endif + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + +#if defined(_MSC_VER) || defined(WIN32) + fopen_s(&fp, g_log_file, "a+"); +#else + fp = fopen(g_log_file, "a+"); +#endif + + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon + 1, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + + #ifdef VENTOY_SIM + printf("[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon + 1, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + #endif + } + pthread_mutex_unlock(&g_log_mutex); +} + +void ventoy_syslog(int level, const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + if (level > g_ventoy_log_level) + { + return; + } + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); +#if defined(_MSC_VER) || defined(WIN32) + vsnprintf_s(log, 512, _TRUNCATE, Fmt, arg); +#else + vsnprintf(log, 512, Fmt, arg); +#endif + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); +#if defined(_MSC_VER) || defined(WIN32) + fopen_s(&fp, g_log_file, "a+"); +#else + fp = fopen(g_log_file, "a+"); +#endif + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + + #ifdef VENTOY_SIM + printf("[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + #endif + } + pthread_mutex_unlock(&g_log_mutex); +} + diff --git a/Plugson/src/Core/ventoy_md5.c b/Plugson/src/Core/ventoy_md5.c new file mode 100644 index 00000000..f6b8e400 --- /dev/null +++ b/Plugson/src/Core/ventoy_md5.c @@ -0,0 +1,166 @@ +/****************************************************************************** + * ventoy_md5.c ---- ventoy md5 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include + +const static uint32_t k[64] = +{ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +}; + +const static uint32_t r[] = +{ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 +}; + +#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c)))) +#define to_bytes(val, bytes) *((uint32_t *)(bytes)) = (val) + +#define ROTATE_CALC() \ +{\ + temp = d; \ + d = c; \ + c = b; \ + b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]); \ + a = temp; \ +} + +void ventoy_md5(const void *data, uint32_t len, uint8_t *md5) +{ + uint32_t h0, h1, h2, h3; + uint32_t w[16]; + uint32_t a, b, c, d, i, f, g, temp; + uint32_t offset, mod, delta; + uint8_t postbuf[128] = {0}; + + // Initialize variables - simple count in nibbles: + h0 = 0x67452301; + h1 = 0xefcdab89; + h2 = 0x98badcfe; + h3 = 0x10325476; + + //Pre-processing: + //append "1" bit to message + //append "0" bits until message length in bits ¡Ô 448 (mod 512) + //append length mod (2^64) to message + + mod = len % 64; + if (mod) + { + memcpy(postbuf, (const uint8_t *)data + len - mod, mod); + } + + postbuf[mod] = 0x80; + if (mod < 56) + { + to_bytes(len * 8, postbuf + 56); + to_bytes(len >> 29, postbuf + 60); + delta = 64; + } + else + { + to_bytes(len * 8, postbuf + 120); + to_bytes(len >> 29, postbuf + 124); + delta = 128; + } + + len -= mod; + + for (offset = 0; offset < len + delta; offset += 64) + { + if (offset < len) + { + memcpy(w, (const uint8_t *)data + offset, 64); + } + else + { + memcpy(w, postbuf + offset - len, 64); + } + + // Initialize hash value for this chunk: + a = h0; + b = h1; + c = h2; + d = h3; + + // Main loop: + for (i = 0; i < 16; i++) + { + f = (b & c) | ((~b) & d); + g = i; + ROTATE_CALC(); + } + + for (i = 16; i < 32; i++) + { + f = (d & b) | ((~d) & c); + g = (5 * i + 1) % 16; + ROTATE_CALC(); + } + + for (i = 32; i < 48; i++) + { + f = b ^ c ^ d; + g = (3 * i + 5) % 16; + ROTATE_CALC(); + } + + for (i = 48; i < 64; i++) + { + f = c ^ (b | (~d)); + g = (7 * i) % 16; + ROTATE_CALC(); + } + + // Add this chunk's hash to result so far: + h0 += a; + h1 += b; + h2 += c; + h3 += d; + } + + //var char md5[16] := h0 append h1 append h2 append h3 //(Output is in little-endian) + to_bytes(h0, md5); + to_bytes(h1, md5 + 4); + to_bytes(h2, md5 + 8); + to_bytes(h3, md5 + 12); +} + diff --git a/Plugson/src/Core/ventoy_util.c b/Plugson/src/Core/ventoy_util.c new file mode 100644 index 00000000..2a004339 --- /dev/null +++ b/Plugson/src/Core/ventoy_util.c @@ -0,0 +1,260 @@ +/****************************************************************************** + * ventoy_util.c ---- ventoy util + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include + + +static int g_tar_filenum = 0; +static char *g_tar_buffer = NULL; +static ventoy_file *g_tar_filelist = NULL; + +SYSINFO g_sysinfo; + +unsigned char *g_unxz_buffer = NULL; +int g_unxz_len = 0; + +void unxz_error(char *x) +{ + vlog("%s\n", x); +} + +int unxz_flush(void *src, unsigned int size) +{ + memcpy(g_unxz_buffer + g_unxz_len, src, size); + g_unxz_len += (int)size; + + return (int)size; +} + + +uint64_t ventoy_get_human_readable_gb(uint64_t SizeBytes) +{ + int i; + int Pow2 = 1; + double Delta; + double GB = SizeBytes * 1.0 / 1000 / 1000 / 1000; + + if ((SizeBytes % SIZE_1GB) == 0) + { + return (uint64_t)(SizeBytes / SIZE_1GB); + } + + for (i = 0; i < 12; i++) + { + if (Pow2 > GB) + { + Delta = (Pow2 - GB) / Pow2; + } + else + { + Delta = (GB - Pow2) / Pow2; + } + + if (Delta < 0.05) + { + return Pow2; + } + + Pow2 <<= 1; + } + + return (uint64_t)GB; +} + +ventoy_file * ventoy_tar_find_file(const char *path) +{ + int i; + int len; + ventoy_file *node = g_tar_filelist; + + len = (int)strlen(path); + + for (i = 0; i < g_tar_filenum; i++, node++) + { + if (node->pathlen == len && memcmp(node->path, path, len) == 0) + { + return node; + } + + if (node->pathlen > len) + { + break; + } + } + + return NULL; +} + + +int ventoy_decompress_tar(char *tarbuf, int buflen, int *tarsize) +{ + int rc = 1; + int inused = 0; + int BufLen = 0; + unsigned char *buffer = NULL; + char tarxz[MAX_PATH]; + +#if defined(_MSC_VER) || defined(WIN32) + scnprintf(tarxz, sizeof(tarxz), "%s\\ventoy\\%s", g_ventoy_dir, PLUGSON_TXZ); +#else + scnprintf(tarxz, sizeof(tarxz), "%s/tool/%s", g_ventoy_dir, PLUGSON_TXZ); +#endif + + if (ventoy_read_file_to_buf(tarxz, 0, (void **)&buffer, &BufLen)) + { + vlog("Failed to read file <%s>\n", tarxz); + return 1; + } + + g_unxz_buffer = (unsigned char *)tarbuf; + g_unxz_len = 0; + + unxz(buffer, BufLen, NULL, unxz_flush, NULL, &inused, unxz_error); + vlog("xzlen:%u rawdata size:%d\n", BufLen, g_unxz_len); + + if (inused != BufLen) + { + vlog("Failed to unxz data %d %d\n", inused, BufLen); + rc = 1; + } + else + { + *tarsize = g_unxz_len; + rc = 0; + } + + free(buffer); + + return rc; +} + +int ventoy_www_init(void) +{ + int i = 0; + int j = 0; + int size = 0; + int tarsize = 0; + int offset = 0; + ventoy_file *node = NULL; + ventoy_file *node2 = NULL; + VENTOY_TAR_HEAD *pHead = NULL; + ventoy_file tmpnode; + + if (!g_tar_filelist) + { + g_tar_filelist = malloc(VENTOY_FILE_MAX * sizeof(ventoy_file)); + g_tar_buffer = malloc(TAR_BUF_MAX); + g_tar_filenum = 0; + } + + if ((!g_tar_filelist) || (!g_tar_buffer)) + { + return 1; + } + + if (ventoy_decompress_tar(g_tar_buffer, TAR_BUF_MAX, &tarsize)) + { + vlog("Failed to decompress tar\n"); + return 1; + } + + pHead = (VENTOY_TAR_HEAD *)g_tar_buffer; + node = g_tar_filelist; + + while (g_tar_filenum < VENTOY_FILE_MAX && size < tarsize && memcmp(pHead->magic, TMAGIC, 5) == 0) + { + if (pHead->typeflag == REGTYPE) + { + node->size = (int)strtol(pHead->size, NULL, 8); + node->pathlen = (int)scnprintf(node->path, MAX_PATH, "%s", pHead->name); + node->addr = pHead + 1; + + if (node->pathlen == 13 && strcmp(pHead->name, "www/buildtime") == 0) + { + scnprintf(g_sysinfo.buildtime, sizeof(g_sysinfo.buildtime), "%s", (char *)node->addr); + vlog("Plugson buildtime %s\n", g_sysinfo.buildtime); + } + + offset = 512 + VENTOY_UP_ALIGN(node->size, 512); + + node++; + g_tar_filenum++; + } + else + { + offset = 512; + } + + pHead = (VENTOY_TAR_HEAD *)((char *)pHead + offset); + size += offset; + } + + + //sort + for (i = 0; i < g_tar_filenum; i++) + for (j = i + 1; j < g_tar_filenum; j++) + { + node = g_tar_filelist + i; + node2 = g_tar_filelist + j; + + if (node->pathlen > node2->pathlen) + { + memcpy(&tmpnode, node, sizeof(ventoy_file)); + memcpy(node, node2, sizeof(ventoy_file)); + memcpy(node2, &tmpnode, sizeof(ventoy_file)); + } + } + + vlog("Total extract %d files from tar file.\n", g_tar_filenum); + + return 0; +} + +void ventoy_www_exit(void) +{ + check_free(g_tar_filelist); + check_free(g_tar_buffer); + g_tar_filelist = NULL; + g_tar_buffer = NULL; + g_tar_filenum = 0; +} + + +void ventoy_get_json_path(char *path, char *backup) +{ +#if defined(_MSC_VER) || defined(WIN32) + scnprintf(path, 64, "%C:\\ventoy\\ventoy.json", g_cur_dir[0]); +if (backup) +{ + scnprintf(backup, 64, "%C:\\ventoy\\ventoy_backup.json", g_cur_dir[0]); +} +#else + scnprintf(path, 64, "%s/ventoy/ventoy.json", g_cur_dir); +if (backup) +{ + scnprintf(backup, 64, "%s/ventoy/ventoy_backup.json", g_cur_dir); +} + +#endif +} + + diff --git a/Plugson/src/Core/ventoy_util.h b/Plugson/src/Core/ventoy_util.h new file mode 100644 index 00000000..5866c0b8 --- /dev/null +++ b/Plugson/src/Core/ventoy_util.h @@ -0,0 +1,202 @@ +/****************************************************************************** + * ventoy_util.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __VENTOY_UTIL_H__ +#define __VENTOY_UTIL_H__ + +#define PLUGSON_TXZ "plugson.tar.xz" + +#define check_free(p) if (p) free(p) +#define vtoy_safe_close_fd(fd) \ +{\ + if ((fd) >= 0) \ + { \ + close(fd); \ + (fd) = -1; \ + }\ +} + +extern char g_cur_dir[MAX_PATH]; +extern char g_ventoy_dir[MAX_PATH]; + +#if defined(_MSC_VER) || defined(WIN32) + +typedef HANDLE pthread_mutex_t; + +static __inline int pthread_mutex_init(pthread_mutex_t *mutex, void *unused) +{ + (void)unused; + *mutex = CreateMutex(NULL, FALSE, NULL); + return *mutex == NULL ? -1 : 0; +} + +static __inline int pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + return CloseHandle(*mutex) == 0 ? -1 : 0; +} + +static __inline int pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + return ReleaseMutex(*mutex) == 0 ? -1 : 0; +} + +static __inline int pthread_mutex_lock(pthread_mutex_t *mutex) +{ + return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +} + +int ventoy_path_case(char *path, int slash); + +#else +int ventoy_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...); + +#define UINT8 uint8_t +#define UINT16 uint16_t +#define UINT32 uint32_t +#define UINT64 uint64_t + +static inline int ventoy_path_case(char *path, int slash) +{ + (void)path; + (void)slash; + return 0; +} +#endif + + +#define LANGUAGE_EN 0 +#define LANGUAGE_CN 1 + +typedef struct SYSINFO +{ + char buildtime[128]; + int syntax_error; + + int language; + int pathcase; + char cur_fsname[64]; + char cur_capacity[64]; + char cur_model[256]; + char cur_ventoy_ver[64]; + int cur_secureboot; + int cur_part_style; + + char ip[32]; + char port[16]; +}SYSINFO; + +extern SYSINFO g_sysinfo; + + + + +#define TMAGIC "ustar" + +#define REGTYPE '0' +#define AREGTYPE '\0' +#define LNKTYPE '1' +#define CHRTYPE '3' +#define BLKTYPE '4' +#define DIRTYPE '5' +#define FIFOTYPE '6' +#define CONTTYPE '7' + +#pragma pack(1) + +typedef struct tag_tar_head +{ + char name[100]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char chksum[8]; + char typeflag; + char linkname[100]; + char magic[6]; + char version[2]; + char uname[32]; + char gname[32]; + char devmajor[8]; + char devminor[8]; + char prefix[155]; + char padding[12]; +}VENTOY_TAR_HEAD; + + +#pragma pack() + +#define VENTOY_UP_ALIGN(N, align) (((N) + ((align) - 1)) / (align) * (align)) +#define VENTOY_FILE_MAX 2048 + + +#if defined(_MSC_VER) || defined(WIN32) +#define million_sleep(a) Sleep(a) +#else +#define million_sleep(a) usleep((a) * 1000) +#endif + + +typedef struct ventoy_file +{ + int size; + char path[MAX_PATH]; + int pathlen; + void *addr; +}ventoy_file; + + + +int ventoy_is_file_exist(const char *fmt, ...); +int ventoy_is_directory_exist(const char *fmt, ...); +void ventoy_gen_preudo_uuid(void *uuid); +uint64_t ventoy_get_human_readable_gb(uint64_t SizeBytes); +void ventoy_md5(const void *data, uint32_t len, uint8_t *md5); +int ventoy_is_disk_mounted(const char *devpath); +int unxz(unsigned char *in, int in_size, + int (*fill)(void *dest, unsigned int size), + int (*flush)(void *src, unsigned int size), + unsigned char *out, int *in_used, + void (*error)(char *x)); +int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen); +int ventoy_write_buf_to_file(const char *FileName, void *Bufer, int BufLen); +const char * ventoy_get_os_language(void); +int ventoy_get_file_size(const char *file); +int ventoy_www_init(void); +void ventoy_www_exit(void); +int ventoy_decompress_tar(char *tarbuf, int buflen, int *tarsize); +ventoy_file * ventoy_tar_find_file(const char *path); +void ventoy_get_json_path(char *path, char *backup); +int ventoy_copy_file(const char *a, const char *b); + +typedef int (*ventoy_http_writeback_pf)(void); + +int ventoy_start_writeback_thread(ventoy_http_writeback_pf callback); +void ventoy_stop_writeback_thread(void); +void ventoy_set_writeback_event(void); + + +extern unsigned char *g_unxz_buffer; +extern int g_unxz_len; +void unxz_error(char *x); +int unxz_flush(void *src, unsigned int size); + +#endif /* __VENTOY_UTIL_H__ */ + diff --git a/Plugson/src/Core/ventoy_util_linux.c b/Plugson/src/Core/ventoy_util_linux.c new file mode 100644 index 00000000..c432f084 --- /dev/null +++ b/Plugson/src/Core/ventoy_util_linux.c @@ -0,0 +1,343 @@ +/****************************************************************************** + * ventoy_util_linux.c ---- ventoy util + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void ventoy_gen_preudo_uuid(void *uuid) +{ + int i; + int fd; + + fd = open("/dev/urandom", O_RDONLY | O_BINARY); + if (fd < 0) + { + srand(time(NULL)); + for (i = 0; i < 8; i++) + { + *((uint16_t *)uuid + i) = (uint16_t)(rand() & 0xFFFF); + } + } + else + { + read(fd, uuid, 16); + close(fd); + } +} + +int ventoy_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...) +{ + int len; + char c; + char path[256]; + va_list arg; + + va_start(arg, fmt); + vsnprintf(path, 256, fmt, arg); + va_end(arg); + + if (access(path, F_OK) >= 0) + { + FILE *fp = fopen(path, "r"); + memset(buffer, 0, buflen); + len = (int)fread(buffer, 1, buflen - 1, fp); + fclose(fp); + + while (len > 0) + { + c = buffer[len - 1]; + if (c == '\r' || c == '\n' || c == ' ' || c == '\t') + { + buffer[len - 1] = 0; + len--; + } + else + { + break; + } + } + + return 0; + } + else + { + vdebug("%s not exist \n", path); + return 1; + } +} + +int ventoy_is_disk_mounted(const char *devpath) +{ + int len; + int mount = 0; + char line[512]; + FILE *fp = NULL; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(devpath); + while (fgets(line, sizeof(line), fp)) + { + if (strncmp(line, devpath, len) == 0) + { + mount = 1; + vdebug("%s mounted <%s>\n", devpath, line); + goto end; + } + } + +end: + fclose(fp); + return mount; +} + +const char * ventoy_get_os_language(void) +{ + const char *env = getenv("LANG"); + + if (env && strncasecmp(env, "zh_CN", 5) == 0) + { + return "cn"; + } + else + { + return "en"; + } +} + +int ventoy_is_file_exist(const char *fmt, ...) +{ + va_list ap; + struct stat sb; + char fullpath[MAX_PATH]; + + va_start (ap, fmt); + vsnprintf(fullpath, MAX_PATH, fmt, ap); + va_end (ap); + + if (stat(fullpath, &sb)) + { + return 0; + } + + if (S_ISREG(sb.st_mode)) + { + return 1; + } + + return 0; +} + +int ventoy_is_directory_exist(const char *fmt, ...) +{ + va_list ap; + struct stat sb; + char fullpath[MAX_PATH]; + + va_start (ap, fmt); + vsnprintf(fullpath, MAX_PATH, fmt, ap); + va_end (ap); + + if (stat(fullpath, &sb)) + { + return 0; + } + + if (S_ISDIR(sb.st_mode)) + { + return 1; + } + + return 0; +} + +int ventoy_get_file_size(const char *file) +{ + int Size = -1; + struct stat stStat; + + if (stat(file, &stStat) >= 0) + { + Size = (int)(stStat.st_size); + } + + return Size; +} + + +int ventoy_write_buf_to_file(const char *FileName, void *Bufer, int BufLen) +{ + int fd; + int rc; + ssize_t size; + + fd = open(FileName, O_CREAT | O_RDWR | O_TRUNC, 0755); + if (fd < 0) + { + vlog("Failed to open file %s %d\n", FileName, errno); + return 1; + } + + rc = fchmod(fd, 0755); + if (rc) + { + vlog("Failed to chmod <%s> %d\n", FileName, errno); + } + + size = write(fd, Bufer, BufLen); + if ((int)size != BufLen) + { + close(fd); + vlog("write file %s failed %d err:%d\n", FileName, (int)size, errno); + return 1; + } + + fsync(fd); + close(fd); + + return 0; +} + + +static volatile int g_thread_stop = 0; +static pthread_t g_writeback_thread; +static pthread_mutex_t g_writeback_mutex; +static pthread_cond_t g_writeback_cond; +static void * ventoy_local_thread_run(void* data) +{ + ventoy_http_writeback_pf callback = (ventoy_http_writeback_pf)data; + + while (1) + { + pthread_mutex_lock(&g_writeback_mutex); + pthread_cond_wait(&g_writeback_cond, &g_writeback_mutex); + + if (g_thread_stop) + { + pthread_mutex_unlock(&g_writeback_mutex); + break; + } + else + { + callback(); + pthread_mutex_unlock(&g_writeback_mutex); + } + } + + return NULL; +} + +void ventoy_set_writeback_event(void) +{ + pthread_cond_signal(&g_writeback_cond); +} + +int ventoy_start_writeback_thread(ventoy_http_writeback_pf callback) +{ + g_thread_stop = 0; + pthread_mutex_init(&g_writeback_mutex, NULL); + pthread_cond_init(&g_writeback_cond, NULL); + + pthread_create(&g_writeback_thread, NULL, ventoy_local_thread_run, callback); + + return 0; +} + +void ventoy_stop_writeback_thread(void) +{ + g_thread_stop = 1; + pthread_cond_signal(&g_writeback_cond); + + pthread_join(g_writeback_thread, NULL); + + + pthread_cond_destroy(&g_writeback_cond); + pthread_mutex_destroy(&g_writeback_mutex); +} + + + +int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +int ventoy_copy_file(const char *a, const char *b) +{ + int len = 0; + char *buf = NULL; + + if (0 == ventoy_read_file_to_buf(a, 0, (void **)&buf, &len)) + { + ventoy_write_buf_to_file(b, buf, len); + free(buf); + } + + return 0; +} + diff --git a/Plugson/src/Core/ventoy_util_windows.c b/Plugson/src/Core/ventoy_util_windows.c new file mode 100644 index 00000000..1d8d97fc --- /dev/null +++ b/Plugson/src/Core/ventoy_util_windows.c @@ -0,0 +1,796 @@ +/****************************************************************************** + * ventoy_util.c ---- ventoy util + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include "fat_filelib.h" + +static void TrimString(CHAR *String) +{ + CHAR *Pos1 = String; + CHAR *Pos2 = String; + size_t Len = strlen(String); + + while (Len > 0) + { + if (String[Len - 1] != ' ' && String[Len - 1] != '\t') + { + break; + } + String[Len - 1] = 0; + Len--; + } + + while (*Pos1 == ' ' || *Pos1 == '\t') + { + Pos1++; + } + + while (*Pos1) + { + *Pos2++ = *Pos1++; + } + *Pos2++ = 0; + + return; +} + +void ventoy_gen_preudo_uuid(void *uuid) +{ + CoCreateGuid((GUID *)uuid); +} + +static int IsUTF8Encode(const char *src) +{ + int i; + const UCHAR *Byte = (const UCHAR *)src; + + for (i = 0; i < MAX_PATH && Byte[i]; i++) + { + if (Byte[i] > 127) + { + return 1; + } + } + + return 0; +} + +static int Utf8ToUtf16(const char* src, WCHAR * dst) +{ + return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, MAX_PATH * sizeof(WCHAR)); +} + +static int Utf16ToUtf8(const WCHAR* src, CHAR * dst) +{ + int size = WideCharToMultiByte(CP_UTF8, 0, src, -1, dst, MAX_PATH, NULL, 0); + dst[size] = 0; + return size; +} + + +int ventoy_path_case(char *path, int slash) +{ + int i; + int j = 0; + int count = 0; + int isUTF8 = 0; + BOOL bRet; + HANDLE handle = INVALID_HANDLE_VALUE; + WCHAR Buffer[MAX_PATH + 16]; + WCHAR FilePathW[MAX_PATH]; + CHAR FilePathA[MAX_PATH]; + FILE_NAME_INFO *pInfo = NULL; + + if (g_sysinfo.pathcase == 0) + { + return 0; + } + + if (path == NULL || path[0] == '/' || path[0] == '\\') + { + return 0; + } + + isUTF8 = IsUTF8Encode(path); + if (isUTF8) + { + Utf8ToUtf16(path, FilePathW); + handle = CreateFileW(FilePathW, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + } + else + { + handle = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + } + + if (handle != INVALID_HANDLE_VALUE) + { + bRet = GetFileInformationByHandleEx(handle, FileNameInfo, Buffer, sizeof(Buffer)); + if (bRet) + { + pInfo = (FILE_NAME_INFO *)Buffer; + + if (slash) + { + for (i = 0; i < (int)(pInfo->FileNameLength / sizeof(WCHAR)); i++) + { + if (pInfo->FileName[i] == L'\\') + { + pInfo->FileName[i] = L'/'; + } + } + } + + pInfo->FileName[(pInfo->FileNameLength / sizeof(WCHAR))] = 0; + + memset(FilePathA, 0, sizeof(FilePathA)); + Utf16ToUtf8(pInfo->FileName, FilePathA); + + if (FilePathA[1] == ':') + { + j = 3; + } + else + { + j = 1; + } + + for (i = 0; i < MAX_PATH && j < MAX_PATH; i++, j++) + { + if (FilePathA[j] == 0) + { + break; + } + + if (path[i] != FilePathA[j]) + { + path[i] = FilePathA[j]; + count++; + } + } + } + + CHECK_CLOSE_HANDLE(handle); + } + + return count; +} + + + +int ventoy_is_directory_exist(const char *Fmt, ...) +{ + va_list Arg; + DWORD Attr; + int UTF8 = 0; + CHAR FilePathA[MAX_PATH]; + WCHAR FilePathW[MAX_PATH]; + + va_start(Arg, Fmt); + vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg); + va_end(Arg); + + UTF8 = IsUTF8Encode(FilePathA); + + if (UTF8) + { + Utf8ToUtf16(FilePathA, FilePathW); + Attr = GetFileAttributesW(FilePathW); + } + else + { + Attr = GetFileAttributesA(FilePathA); + } + + if (Attr != INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_DIRECTORY)) + { + return TRUE; + } + + return FALSE; +} + +int ventoy_is_file_exist(const char *Fmt, ...) +{ + va_list Arg; + HANDLE hFile; + DWORD Attr; + int UTF8 = 0; + CHAR FilePathA[MAX_PATH]; + WCHAR FilePathW[MAX_PATH]; + + va_start(Arg, Fmt); + vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg); + va_end(Arg); + + UTF8 = IsUTF8Encode(FilePathA); + if (UTF8) + { + Utf8ToUtf16(FilePathA, FilePathW); + hFile = CreateFileW(FilePathW, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + Attr = GetFileAttributesW(FilePathW); + } + else + { + hFile = CreateFileA(FilePathA, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + Attr = GetFileAttributesA(FilePathA); + } + + if (INVALID_HANDLE_VALUE == hFile) + { + return 0; + } + CloseHandle(hFile); + + if (Attr & FILE_ATTRIBUTE_DIRECTORY) + { + return 0; + } + + return 1; +} + +const char * ventoy_get_os_language(void) +{ + if (GetUserDefaultUILanguage() == 0x0804) + { + return "cn"; + } + else + { + return "en"; + } +} + + +int GetPhyDriveByLogicalDrive(int DriveLetter, UINT64 *Offset) +{ + BOOL Ret; + DWORD dwSize; + HANDLE Handle; + VOLUME_DISK_EXTENTS DiskExtents; + CHAR PhyPath[128]; + + scnprintf(PhyPath, sizeof(PhyPath), "\\\\.\\%C:", (CHAR)DriveLetter); + + Handle = CreateFileA(PhyPath, 0, 0, 0, OPEN_EXISTING, 0, 0); + if (Handle == INVALID_HANDLE_VALUE) + { + vlog("CreateFileA %s failed %u\n", PhyPath, LASTERR); + return -1; + } + + Ret = DeviceIoControl(Handle, + IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, + NULL, + 0, + &DiskExtents, + (DWORD)(sizeof(DiskExtents)), + (LPDWORD)&dwSize, + NULL); + + if (!Ret || DiskExtents.NumberOfDiskExtents == 0) + { + vlog("IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTSfailed %u\n", LASTERR); + CHECK_CLOSE_HANDLE(Handle); + return -1; + } + CHECK_CLOSE_HANDLE(Handle); + + if (Offset) + { + *Offset = (UINT64)(DiskExtents.Extents[0].StartingOffset.QuadPart); + } + + return (int)DiskExtents.Extents[0].DiskNumber; +} + +int GetPhyDriveInfo(int PhyDrive, UINT64 *Size, CHAR *Vendor, CHAR *Product) +{ + int ret = 1; + BOOL bRet; + DWORD dwBytes; + CHAR Drive[64]; + HANDLE Handle = INVALID_HANDLE_VALUE; + GET_LENGTH_INFORMATION LengthInfo; + STORAGE_PROPERTY_QUERY Query; + STORAGE_DESCRIPTOR_HEADER DevDescHeader; + STORAGE_DEVICE_DESCRIPTOR *pDevDesc = NULL; + + sprintf_s(Drive, sizeof(Drive), "\\\\.\\PhysicalDrive%d", PhyDrive); + Handle = CreateFileA(Drive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (Handle == INVALID_HANDLE_VALUE) + { + vlog("CreateFileA %s failed %u\n", Drive, LASTERR); + goto out; + } + + + bRet = DeviceIoControl(Handle, + IOCTL_DISK_GET_LENGTH_INFO, NULL, + 0, + &LengthInfo, + sizeof(LengthInfo), + &dwBytes, + NULL); + if (!bRet) + { + vlog("IOCTL_DISK_GET_LENGTH_INFO failed %u\n", LASTERR); + return 1; + } + + if (Size) + { + *Size = (UINT64)LengthInfo.Length.QuadPart; + } + + Query.PropertyId = StorageDeviceProperty; + Query.QueryType = PropertyStandardQuery; + + bRet = DeviceIoControl(Handle, + IOCTL_STORAGE_QUERY_PROPERTY, + &Query, + sizeof(Query), + &DevDescHeader, + sizeof(STORAGE_DESCRIPTOR_HEADER), + &dwBytes, + NULL); + if (!bRet) + { + vlog("IOCTL_STORAGE_QUERY_PROPERTY failed %u\n", LASTERR); + goto out; + } + + if (DevDescHeader.Size < sizeof(STORAGE_DEVICE_DESCRIPTOR)) + { + vlog("DevDescHeader.size invalid %u\n", DevDescHeader.Size); + goto out; + } + + pDevDesc = (STORAGE_DEVICE_DESCRIPTOR *)malloc(DevDescHeader.Size); + if (!pDevDesc) + { + vlog("malloc failed\n"); + goto out; + } + + bRet = DeviceIoControl(Handle, + IOCTL_STORAGE_QUERY_PROPERTY, + &Query, + sizeof(Query), + pDevDesc, + DevDescHeader.Size, + &dwBytes, + NULL); + if (!bRet) + { + vlog("IOCTL_STORAGE_QUERY_PROPERTY failed %u\n", LASTERR); + goto out; + } + + if (pDevDesc->VendorIdOffset && Vendor) + { + strcpy_s(Vendor, 128, (char *)pDevDesc + pDevDesc->VendorIdOffset); + TrimString(Vendor); + } + + if (pDevDesc->ProductIdOffset && Product) + { + strcpy_s(Product, 128, (char *)pDevDesc + pDevDesc->ProductIdOffset); + TrimString(Product); + } + + ret = 0; + +out: + CHECK_FREE(pDevDesc); + CHECK_CLOSE_HANDLE(Handle); + return ret; +} + + +int ventoy_get_file_size(const char *file) +{ + int Size = -1; + HANDLE hFile; + + hFile = CreateFileA(file, 0, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hFile != INVALID_HANDLE_VALUE) + { + Size = (int)GetFileSize(hFile, NULL); + CHECK_CLOSE_HANDLE(hFile); + } + + return Size; +} + + +static HANDLE g_FatPhyDrive; +static UINT64 g_Part2StartSec; + +const CHAR* ParseVentoyVersionFromString(CHAR *Buf) +{ + CHAR *Pos = NULL; + CHAR *End = NULL; + static CHAR LocalVersion[64] = { 0 }; + + Pos = strstr(Buf, "VENTOY_VERSION="); + if (Pos) + { + Pos += strlen("VENTOY_VERSION="); + if (*Pos == '"') + { + Pos++; + } + + End = Pos; + while (*End != 0 && *End != '"' && *End != '\r' && *End != '\n') + { + End++; + } + + *End = 0; + + sprintf_s(LocalVersion, sizeof(LocalVersion), "%s", Pos); + return LocalVersion; + } + + return ""; +} +static int GetVentoyVersionFromFatFile(CHAR *VerBuf, size_t BufLen) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = (char *)malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + rc = 0; + sprintf_s(VerBuf, BufLen, "%s", ParseVentoyVersionFromString(buf)); + free(buf); + } + + fl_fclose(flfile); + } + + return rc; +} + +static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + DWORD dwSize; + BOOL bRet; + DWORD ReadSize; + LARGE_INTEGER liCurrentPosition; + + liCurrentPosition.QuadPart = Sector + g_Part2StartSec; + liCurrentPosition.QuadPart *= 512; + SetFilePointerEx(g_FatPhyDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN); + + ReadSize = (DWORD)(SectorCount * 512); + + bRet = ReadFile(g_FatPhyDrive, Buffer, ReadSize, &dwSize, NULL); + if (bRet == FALSE || dwSize != ReadSize) + { + + } + + return 1; +} + +static int GetVentoyVersion(int PhyDrive, ventoy_disk *disk) +{ + int ret = 1; + BOOL bRet; + DWORD dwBytes; + UINT64 Part2Offset; + HANDLE Handle = INVALID_HANDLE_VALUE; + VTOY_GPT_INFO *pGPT = NULL; + CHAR Drive[64]; + void *flfile = NULL; + UCHAR MbrData[] = + { + 0xEB, 0x63, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44, 0x00, 0x52, 0x64, 0x00, 0x20, 0x45, 0x72, 0x0D, + }; + + sprintf_s(Drive, sizeof(Drive), "\\\\.\\PhysicalDrive%d", PhyDrive); + Handle = CreateFileA(Drive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (Handle == INVALID_HANDLE_VALUE) + { + vlog("CreateFileA %s failed %u\n", Drive, LASTERR); + goto out; + } + + pGPT = zalloc(sizeof(VTOY_GPT_INFO)); + if (!pGPT) + { + goto out; + } + + bRet = ReadFile(Handle, pGPT, sizeof(VTOY_GPT_INFO), &dwBytes, NULL); + if (!bRet || dwBytes != sizeof(VTOY_GPT_INFO)) + { + vlog("ReadFile failed %u\n", LASTERR); + goto out; + } + + if (memcmp(pGPT->MBR.BootCode, MbrData, 0x30) || memcmp(pGPT->MBR.BootCode + 0x190, MbrData + 0x30, 0x10)) + { + vlog("Invalid MBR Code %u\n", LASTERR); + goto out; + } + + if (pGPT->MBR.PartTbl[0].FsFlag == 0xEE) + { + if (memcmp(pGPT->Head.Signature, "EFI PART", 8)) + { + vlog("Invalid GPT Signature\n"); + goto out; + } + + Part2Offset = pGPT->PartTbl[1].StartLBA; + disk->cur_part_style = 1; + } + else + { + Part2Offset = pGPT->MBR.PartTbl[1].StartSectorId; + disk->cur_part_style = 0; + } + + + g_FatPhyDrive = Handle; + g_Part2StartSec = Part2Offset; + + fl_init(); + + if (0 == fl_attach_media(VentoyFatDiskRead, NULL)) + { + ret = GetVentoyVersionFromFatFile(disk->cur_ventoy_ver, sizeof(disk->cur_ventoy_ver)); + if (ret == 0) + { + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + disk->cur_secureboot = 1; + fl_fclose(flfile); + } + } + } + + fl_shutdown(); + +out: + CHECK_FREE(pGPT); + CHECK_CLOSE_HANDLE(Handle); + return ret; +} + +int CheckRuntimeEnvironment(char Letter, ventoy_disk *disk) +{ + int PhyDrive; + UINT64 Offset = 0; + char Drive[32]; + DWORD FsFlag; + CHAR Vendor[128] = { 0 }; + CHAR Product[128] = { 0 }; + CHAR FsName[MAX_PATH]; + + PhyDrive = GetPhyDriveByLogicalDrive(Letter, &Offset); + if (PhyDrive < 0) + { + vlog("GetPhyDriveByLogicalDrive failed %d %llu\n", PhyDrive, (ULONGLONG)Offset); + return 1; + } + if (Offset != 1048576) + { + vlog("Partition offset is NOT 1MB. This is NOT ventoy image partition (%llu)\n", (ULONGLONG)Offset); + return 1; + } + + if (GetPhyDriveInfo(PhyDrive, &Offset, Vendor, Product) != 0) + { + vlog("GetPhyDriveInfo failed\n"); + return 1; + } + + sprintf_s(disk->cur_capacity, sizeof(disk->cur_capacity), "%dGB", (int)ventoy_get_human_readable_gb(Offset)); + sprintf_s(disk->cur_model, sizeof(disk->cur_model), "%s %s", Vendor, Product); + + scnprintf(Drive, sizeof(Drive), "%C:\\", Letter); + if (0 == GetVolumeInformationA(Drive, NULL, 0, NULL, NULL, &FsFlag, FsName, MAX_PATH)) + { + vlog("GetVolumeInformationA failed %u\n", LASTERR); + return 1; + } + + if (_stricmp(FsName, "NTFS") == 0) + { + disk->pathcase = 1; + } + + strlcpy(disk->cur_fsname, FsName); + + if (GetVentoyVersion(PhyDrive, disk) != 0) + { + vlog("GetVentoyVersion failed %u\n", LASTERR); + return 1; + } + + return 0; +} + + + +static volatile int g_thread_stop = 0; +static HANDLE g_writeback_thread; +static HANDLE g_writeback_event; + +DWORD WINAPI ventoy_local_thread_run(LPVOID lpParameter) +{ + ventoy_http_writeback_pf callback = (ventoy_http_writeback_pf)lpParameter; + + while (1) + { + WaitForSingleObject(g_writeback_event, INFINITE); + if (g_thread_stop) + { + break; + } + else + { + callback(); + } + } + + return 0; +} + + +void ventoy_set_writeback_event(void) +{ + SetEvent(g_writeback_event); +} + + +int ventoy_start_writeback_thread(ventoy_http_writeback_pf callback) +{ + g_thread_stop = 0; + g_writeback_event = CreateEventA(NULL, FALSE, FALSE, "VTOYWRBK"); + g_writeback_thread = CreateThread(NULL, 0, ventoy_local_thread_run, callback, 0, NULL); + + return 0; +} + + +void ventoy_stop_writeback_thread(void) +{ + g_thread_stop = 1; + ventoy_set_writeback_event(); + + WaitForSingleObject(g_writeback_thread, INFINITE); + + CHECK_CLOSE_HANDLE(g_writeback_thread); + CHECK_CLOSE_HANDLE(g_writeback_event); +} + +int ventoy_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int UTF8 = 0; + int Size = 0; + BOOL bRet; + DWORD dwBytes; + HANDLE hFile; + char *buffer = NULL; + WCHAR FilePathW[MAX_PATH]; + + UTF8 = IsUTF8Encode(FileName); + if (UTF8) + { + Utf8ToUtf16(FileName, FilePathW); + hFile = CreateFileW(FilePathW, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + } + else + { + hFile = CreateFileA(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + } + + if (hFile == INVALID_HANDLE_VALUE) + { + vlog("Failed to open %s %u\n", FileName, LASTERR); + return 1; + } + + Size = (int)GetFileSize(hFile, NULL); + buffer = malloc(Size + ExtLen); + if (!buffer) + { + vlog("Failed to alloc file buffer\n"); + CloseHandle(hFile); + return 1; + } + + bRet = ReadFile(hFile, buffer, (DWORD)Size, &dwBytes, NULL); + if ((!bRet) || ((DWORD)Size != dwBytes)) + { + vlog("Failed to read file <%s> %u err:%u", FileName, dwBytes, LASTERR); + CloseHandle(hFile); + free(buffer); + return 1; + } + + *Bufer = buffer; + *BufLen = Size; + + CloseHandle(hFile); + return 0; +} + +int ventoy_write_buf_to_file(const char *FileName, void *Bufer, int BufLen) +{ + BOOL bRet; + DWORD dwBytes; + HANDLE hFile; + + hFile = CreateFileA(FileName, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); + if (hFile == INVALID_HANDLE_VALUE) + { + vlog("CreateFile %s failed %u\n", FileName, LASTERR); + return 1; + } + + bRet = WriteFile(hFile, Bufer, (DWORD)BufLen, &dwBytes, NULL); + + if ((!bRet) || ((DWORD)BufLen != dwBytes)) + { + vlog("Failed to write file <%s> %u err:%u", FileName, dwBytes, LASTERR); + CloseHandle(hFile); + return 1; + } + + FlushFileBuffers(hFile); + CloseHandle(hFile); + + return 0; +} + +int ventoy_copy_file(const char *a, const char *b) +{ + CopyFileA(a, b, FALSE); + return 0; +} + diff --git a/Plugson/src/Lib/fat_io_lib/API.txt b/Plugson/src/Lib/fat_io_lib/API.txt new file mode 100644 index 00000000..61fc1647 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/API.txt @@ -0,0 +1,22 @@ +File IO Lib API +-=-=-=-=-=-=-=-=- + +void fl_init(void) + + Called to initialize FAT IO library. + This should be called prior to any other functions. + +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)) + + [Optional] File system thread safety locking functions. + For thread safe operation, you should provide lock() and unlock() functions. + Note that locking primitive used must support recursive locking, i.e lock() called within an already ‘locked’ region. + +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + This function is used to attach system specific disk/media access functions. + This should be done subsequent to calling fl_init() and fl_attach_locks() (if locking required). + +void fl_shutdown(void) + + Shutdown the FAT IO library. This purges any un-saved data back to disk. diff --git a/Plugson/src/Lib/fat_io_lib/COPYRIGHT.txt b/Plugson/src/Lib/fat_io_lib/COPYRIGHT.txt new file mode 100644 index 00000000..4335f7fb --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/COPYRIGHT.txt @@ -0,0 +1,345 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Plugson/src/Lib/fat_io_lib/Configuration.txt b/Plugson/src/Lib/fat_io_lib/Configuration.txt new file mode 100644 index 00000000..9ec576e4 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/Configuration.txt @@ -0,0 +1,53 @@ +File IO Lib Options +-=-=-=-=-=-=-=-=-=- + +See defines in fat_opts.h: + +FATFS_IS_LITTLE_ENDIAN [1/0] + Which endian is your system? Set to 1 for little endian, 0 for big endian. + +FATFS_MAX_LONG_FILENAME [260] + By default, 260 characters (max LFN length). Increase this to support greater path depths. + +FATFS_MAX_OPEN_FILES + The more files you wish to have concurrently open, the greater this number should be. + This increases the number of FL_FILE file structures in the library, each of these is around 1K in size (assuming 512 byte sectors). + +FAT_BUFFER_SECTORS + Minimum is 1, more increases performance. + This defines how many FAT sectors can be buffered per FAT_BUFFER entry. + +FAT_BUFFERS + Minimum is 1, more increases performance. + This defines how many FAT buffer entries are available. + Memory usage is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE + +FATFS_INC_WRITE_SUPPORT + Support file write functionality. + +FAT_SECTOR_SIZE + Sector size used by buffers. Most likely to be 512 bytes (standard for ATA/IDE). + +FAT_PRINTF + A define that allows the File IO library to print to console/stdout. + Provide your own printf function if printf not available. + +FAT_CLUSTER_CACHE_ENTRIES + Size of cluster chain cache (can be undefined if not required). + Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 + Improves access speed considerably. + +FATFS_INC_LFN_SUPPORT [1/0] + Enable/Disable support for long filenames. + +FATFS_DIR_LIST_SUPPORT [1/0] + Include support for directory listing. + +FATFS_INC_TIME_DATE_SUPPORT [1/0] + Use time/date functions provided by time.h to update creation & modification timestamps. + +FATFS_INC_FORMAT_SUPPORT + Include support for formatting disks (FAT16 only). + +FAT_PRINTF_NOINC_STDIO + Disable use of printf & inclusion of stdio.h diff --git a/Plugson/src/Lib/fat_io_lib/History.txt b/Plugson/src/Lib/fat_io_lib/History.txt new file mode 100644 index 00000000..58958f41 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/History.txt @@ -0,0 +1,24 @@ +Revision History +-=-=-=-=-=-=-=-=- +v2.6.11 - Fix compilation with GCC on 64-bit machines +v2.6.10 - Added support for FAT32 format. +V2.6.9 - Added support for time & date handling. +V2.6.8 - Fixed error with FSINFO sector write. +V2.6.7 - Added fgets(). + Fixed C warnings, removed dependancy on some string.h functions. +V2.6.6 – Massive read + write performance improvements. +V2.6.5 – Bug fixes for big endian systems. +V2.6.4 – Further bug fixes and performance improvements for write operations. +V2.6.3 – Peformance improvements, FAT16 formatting support. Various bug fixes. +V2.6 - Basic support for FAT16 added (18-04-10). +V2.5 - Code cleaned up. Many bugs fixed. Thread safety functions added. +V2.x - Write support added as well as better stdio like API. +V1.0 - Rewrite of all code to enable multiple files to be opened and provides a + better file API. + Also better string matching, and generally better C code than origonal + version. +V0.1c - Fetch_ID_Max_LBA() function added to retrieve Drive infomation and stoping + the drive reads from addressing a sector that is out of range. +V0.1b - fopen(), fgetc(), fopenDIR() using new software stack for IDE and FAT32 + access. +V0.1a - First release (27/12/03); fopen(), fgetc() unbuffered reads. diff --git a/Plugson/src/Lib/fat_io_lib/License.txt b/Plugson/src/Lib/fat_io_lib/License.txt new file mode 100644 index 00000000..c7fb0cc7 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/License.txt @@ -0,0 +1,10 @@ +FAT File IO Library License +-=-=-=-=-=-=-=-=-=-=-=-=-=- + +This versions license: GPL + +If you include GPL software in your project, you must release the source code of that project too. + +If you would like a version with a more permissive license for use in closed source commercial applications please contact me for details. + +Email: admin@ultra-embedded.com diff --git a/Plugson/src/Lib/fat_io_lib/Media Access API.txt b/Plugson/src/Lib/fat_io_lib/Media Access API.txt new file mode 100644 index 00000000..45eede0f --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/Media Access API.txt @@ -0,0 +1,40 @@ +Media Access API +-=-=-=-=-=-=-=-=- + +int media_read(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to read n sectors of data into. + Sector_count: Number of sectors to read. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media read function. + Sector number (sectors are usually 512 byte pages) to read. + +Media Write API + +int media_write(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to write n sectors of data from. + Sector_count: Number of sectors to write. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media write function. + Sector number (sectors are usually 512 byte pages) to write to. + +File IO Library Linkage + Use the following API to attach the media IO functions to the File IO library. + + int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + + diff --git a/Plugson/src/Lib/fat_io_lib/fat_access.c b/Plugson/src/Lib/fat_io_lib/fat_access.c new file mode 100644 index 00000000..c2162f24 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_access.c @@ -0,0 +1,907 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_init: Load FAT Parameters +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs) +{ + uint8 num_of_fats; + uint16 reserved_sectors; + uint32 FATSz; + uint32 root_dir_sectors; + uint32 total_sectors; + uint32 data_sectors; + uint32 count_of_clusters; + uint8 valid_partition = 0; + + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have a read function (write function is optional) + if (!fs->disk_io.read_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // MBR: Sector 0 on the disk + // NOTE: Some removeable media does not have this. + + // Load MBR (LBA 0) into the 512 byte buffer + if (!fs->disk_io.read_media(0, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make Sure 0x55 and 0xAA are at end of sector + // (this should be the case regardless of the MBR or boot sector) + if (fs->currentsector.sector[SIGNATURE_POSITION] != 0x55 || fs->currentsector.sector[SIGNATURE_POSITION+1] != 0xAA) + return FAT_INIT_INVALID_SIGNATURE; + + // Now check again using the access function to prove endian conversion function + if (GET_16BIT_WORD(fs->currentsector.sector, SIGNATURE_POSITION) != SIGNATURE_VALUE) + return FAT_INIT_ENDIAN_ERROR; + + // Verify packed structures + if (sizeof(struct fat_dir_entry) != FAT_DIR_ENTRY_SIZE) + return FAT_INIT_STRUCT_PACKING; + + // Check the partition type code + switch(fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION]) + { + case 0x0B: + case 0x06: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x05: + valid_partition = 1; + break; + case 0x00: + valid_partition = 0; + break; + default: + if (fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION] <= 0x06) + valid_partition = 1; + break; + } + + // Read LBA Begin for the file system + if (valid_partition) + fs->lba_begin = GET_32BIT_WORD(fs->currentsector.sector, PARTITION1_LBA_BEGIN_LOCATION); + // Else possibly MBR less disk + else + fs->lba_begin = 0; + + // Load Volume 1 table into sector buffer + // (We may already have this in the buffer if MBR less drive!) + if (!fs->disk_io.read_media(fs->lba_begin, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make sure there are 512 bytes per cluster + if (GET_16BIT_WORD(fs->currentsector.sector, 0x0B) != FAT_SECTOR_SIZE) + return FAT_INIT_INVALID_SECTOR_SIZE; + + // Load Parameters of FAT partition + fs->sectors_per_cluster = fs->currentsector.sector[BPB_SECPERCLUS]; + reserved_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT); + num_of_fats = fs->currentsector.sector[BPB_NUMFATS]; + fs->root_entry_count = GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + fs->fat_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + fs->fat_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + // For FAT32 (which this may be) + fs->rootdir_first_cluster = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_ROOTCLUS); + fs->fs_info_sector = GET_16BIT_WORD(fs->currentsector.sector, BPB_FAT32_FSINFO); + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = reserved_sectors + (num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (num_of_fats * fs->fat_sectors); + + if (GET_16BIT_WORD(fs->currentsector.sector, 0x1FE) != 0xAA55) // This signature should be AA55 + return FAT_INIT_INVALID_SIGNATURE; + + // Calculate the root dir sectors + root_dir_sectors = ((GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT) * 32) + (GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC) - 1)) / GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + FATSz = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + FATSz = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16) != 0) + total_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16); + else + total_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_TOTSEC32); + + data_sectors = total_sectors - (GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT) + (fs->currentsector.sector[BPB_NUMFATS] * FATSz) + root_dir_sectors); + + // Find out which version of FAT this is... + if (fs->sectors_per_cluster != 0) + { + count_of_clusters = data_sectors / fs->sectors_per_cluster; + + if(count_of_clusters < 4085) + // Volume is FAT12 + return FAT_INIT_WRONG_FILESYS_TYPE; + else if(count_of_clusters < 65525) + { + // Clear this FAT32 specific param + fs->rootdir_first_cluster = 0; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + return FAT_INIT_OK; + } + else + { + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + return FAT_INIT_OK; + } + } + else + return FAT_INIT_WRONG_FILESYS_TYPE; +} +//----------------------------------------------------------------------------- +// fatfs_lba_of_cluster: This function converts a cluster number into a sector / +// LBA number. +//----------------------------------------------------------------------------- +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number) +{ + if (fs->fat_type == FAT_TYPE_16) + return (fs->cluster_begin_lba + (fs->root_entry_count * 32 / FAT_SECTOR_SIZE) + ((Cluster_Number-2) * fs->sectors_per_cluster)); + else + return ((fs->cluster_begin_lba + ((Cluster_Number-2)*fs->sectors_per_cluster))); +} +//----------------------------------------------------------------------------- +// fatfs_sector_read: +//----------------------------------------------------------------------------- +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.read_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_write: +//----------------------------------------------------------------------------- +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.write_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_reader: From the provided startcluster and sector offset +// Returns True if success, returns False if not (including if read out of range) +//----------------------------------------------------------------------------- +int fatfs_sector_reader(struct fatfs *fs, uint32 start_cluster, uint32 offset, uint8 *target) +{ + uint32 sector_to_read = 0; + uint32 cluster_to_read = 0; + uint32 cluster_chain = 0; + uint32 i; + uint32 lba; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && start_cluster == 0) + { + if (offset < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + offset; + else + return 0; + } + // FAT16/32 Other + else + { + // Set start of cluster chain to initial value + cluster_chain = start_cluster; + + // Find parameters + cluster_to_read = offset / fs->sectors_per_cluster; + sector_to_read = offset - (cluster_to_read*fs->sectors_per_cluster); + + // Follow chain to find cluster to read + for (i=0; idisk_io.read_media(lba, target, 1); + // Else read sector if not already loaded + else if (lba != fs->currentsector.address) + { + fs->currentsector.address = lba; + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_read_sector: Read from the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16, there are a limited amount of sectors in root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate read address + fs->currentsector.address = lba; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate read address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +//----------------------------------------------------------------------------- +// fatfs_write_sector: Write to the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16 we cannot extend the root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = lba; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate write address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +#endif +//----------------------------------------------------------------------------- +// fatfs_show_details: Show the details about the filesystem +//----------------------------------------------------------------------------- +void fatfs_show_details(struct fatfs *fs) +{ + FAT_PRINTF(("FAT details:\r\n")); + FAT_PRINTF((" Type =%s", (fs->fat_type == FAT_TYPE_32) ? "FAT32": "FAT16")); + FAT_PRINTF((" Root Dir First Cluster = %x\r\n", fs->rootdir_first_cluster)); + FAT_PRINTF((" FAT Begin LBA = 0x%x\r\n",fs->fat_begin_lba)); + FAT_PRINTF((" Cluster Begin LBA = 0x%x\r\n",fs->cluster_begin_lba)); + FAT_PRINTF((" Sectors Per Cluster = %d\r\n", fs->sectors_per_cluster)); +} +//----------------------------------------------------------------------------- +// fatfs_get_root_cluster: Get the root dir cluster +//----------------------------------------------------------------------------- +uint32 fatfs_get_root_cluster(struct fatfs *fs) +{ + // NOTE: On FAT16 this will be 0 which has a special meaning... + return fs->rootdir_first_cluster; +} +//------------------------------------------------------------- +// fatfs_get_file_entry: Find the file entry for a filename +//------------------------------------------------------------- +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *name_to_find, struct fat_dir_entry *sfEntry) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + struct fat_dir_entry *directoryEntry; + + fatfs_lfn_cache_init(&lfn, 1); + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + long_filename = fatfs_lfn_cache_get(&lfn); + + // Compare names to see if they match + if (fatfs_compare_names(long_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + // Compare names to see if they match + if (fatfs_compare_names(short_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +//------------------------------------------------------------- +// fatfs_sfn_exists: Check if a short filename exists. +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + return 1; + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_update_timestamps: Update date/time details +//------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access) +{ + time_t time_now; + struct tm * time_info; + uint16 fat_time; + uint16 fat_date; + + // Get system time + time(&time_now); + + // Convert to local time + time_info = localtime(&time_now); + + // Convert time to FAT format + fat_time = fatfs_convert_to_fat_time(time_info->tm_hour, time_info->tm_min, time_info->tm_sec); + + // Convert date to FAT format + fat_date = fatfs_convert_to_fat_date(time_info->tm_mday, time_info->tm_mon + 1, time_info->tm_year + 1900); + + // Update requested fields + if (create) + { + directoryEntry->CrtTime[1] = fat_time >> 8; + directoryEntry->CrtTime[0] = fat_time >> 0; + directoryEntry->CrtDate[1] = fat_date >> 8; + directoryEntry->CrtDate[0] = fat_date >> 0; + } + + if (modify) + { + directoryEntry->WrtTime[1] = fat_time >> 8; + directoryEntry->WrtTime[0] = fat_time >> 0; + directoryEntry->WrtDate[1] = fat_date >> 8; + directoryEntry->WrtDate[0] = fat_date >> 0; + } + + if (access) + { + directoryEntry->LstAccDate[1] = fat_time >> 8; + directoryEntry->LstAccDate[0] = fat_time >> 0; + directoryEntry->LstAccDate[1] = fat_date >> 8; + directoryEntry->LstAccDate[0] = fat_date >> 0; + } + + return 1; +} +#endif +//------------------------------------------------------------- +// fatfs_update_file_length: Find a SFN entry and update it +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + { + directoryEntry->FileSize = FAT_HTONL(fileLength); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_mark_file_deleted: Find a SFN entry and mark if as deleted +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char *)directoryEntry->Name, shortname, 11)==0) + { + // Mark as deleted + directoryEntry->Name[0] = FILE_HEADER_DELETED; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_start: Initialise a directory listing procedure +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster) +{ + dirls->cluster = StartCluster; + dirls->sector = 0; + dirls->offset = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_next: Get the next entry in the directory. +// Returns: 1 = found, 0 = end of listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry) +{ + uint8 i,item; + uint16 recordoffset; + struct fat_dir_entry *directoryEntry; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + int result = 0; + + // Initialise LFN cache first + fatfs_lfn_cache_init(&lfn, 0); + + while (1) + { + // If data read OK + if (fatfs_sector_reader(fs, dirls->cluster, dirls->sector, 0)) + { + // Maximum of 16 directory entries + for (item = dirls->offset; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Increase directory offset + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if ( fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if ( fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + // Get text + long_filename = fatfs_lfn_cache_get(&lfn); + #if defined(_MSC_VER) || defined(WIN32) + strcpy_s(entry->filename, FATFS_MAX_LONG_FILENAME - 1, long_filename); + #else + strncpy(entry->filename, long_filename, FATFS_MAX_LONG_FILENAME - 1); + #endif + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + // Normal Entry, only 8.3 Text + else +#endif + if ( fatfs_entry_sfn_only(directoryEntry) ) + { + fatfs_lfn_cache_init(&lfn, 0); + + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + fatfs_get_sfn_display_name(entry->filename, short_filename); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + }// end of for + + // If reached end of the dir move onto next sector + dirls->sector++; + dirls->offset = 0; + } + else + break; + } + + return result; +} +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_access.h b/Plugson/src/Lib/fat_io_lib/fat_access.h new file mode 100644 index 00000000..17523878 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_access.h @@ -0,0 +1,133 @@ +#ifndef __FAT_ACCESS_H__ +#define __FAT_ACCESS_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define FAT_INIT_OK 0 +#define FAT_INIT_MEDIA_ACCESS_ERROR (-1) +#define FAT_INIT_INVALID_SECTOR_SIZE (-2) +#define FAT_INIT_INVALID_SIGNATURE (-3) +#define FAT_INIT_ENDIAN_ERROR (-4) +#define FAT_INIT_WRONG_FILESYS_TYPE (-5) +#define FAT_INIT_WRONG_PARTITION_TYPE (-6) +#define FAT_INIT_STRUCT_PACKING (-7) + +#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE) + +//----------------------------------------------------------------------------- +// Function Pointers +//----------------------------------------------------------------------------- +typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count); +typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count); + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct disk_if +{ + // User supplied function pointers for disk IO + fn_diskio_read read_media; + fn_diskio_write write_media; +}; + +// Forward declaration +struct fat_buffer; + +struct fat_buffer +{ + uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS]; + uint32 address; + int dirty; + uint8 * ptr; + + // Next in chain of sector buffers + struct fat_buffer *next; +}; + +typedef enum eFatType +{ + FAT_TYPE_16, + FAT_TYPE_32 +} tFatType; + +struct fatfs +{ + // Filesystem globals + uint8 sectors_per_cluster; + uint32 cluster_begin_lba; + uint32 rootdir_first_cluster; + uint32 rootdir_first_sector; + uint32 rootdir_sectors; + uint32 fat_begin_lba; + uint16 fs_info_sector; + uint32 lba_begin; + uint32 fat_sectors; + uint32 next_free_cluster; + uint16 root_entry_count; + uint16 reserved_sectors; + uint8 num_of_fats; + tFatType fat_type; + + // Disk/Media API + struct disk_if disk_io; + + // [Optional] Thread Safety + void (*fl_lock)(void); + void (*fl_unlock)(void); + + // Working buffer + struct fat_buffer currentsector; + + // FAT Buffer + struct fat_buffer *fat_buffer_head; + struct fat_buffer fat_buffers[FAT_BUFFERS]; +}; + +struct fs_dir_list_status +{ + uint32 sector; + uint32 cluster; + uint8 offset; +}; + +struct fs_dir_ent +{ + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 is_dir; + uint32 cluster; + uint32 size; + +#if FATFS_INC_TIME_DATE_SUPPORT + uint16 access_date; + uint16 write_time; + uint16 write_date; + uint16 create_date; + uint16 create_time; +#endif +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs); +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number); +int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target); +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +void fatfs_show_details(struct fatfs *fs); +uint32 fatfs_get_root_cluster(struct fatfs *fs); +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry); +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname); +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength); +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname); +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster); +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry); +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_cache.c b/Plugson/src/Lib/fat_io_lib/fat_cache.c new file mode 100644 index 00000000..de77e6a0 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_cache.c @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_cache.h" + +// Per file cluster chain caching used to improve performance. +// This does not have to be enabled for architectures with low +// memory space. + +//----------------------------------------------------------------------------- +// fatfs_cache_init: +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + int i; + + for (i=0;icluster_cache_idx[i] = 0xFFFFFFFF; // Not used + file->cluster_cache_data[i] = 0; + } +#endif + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_cache_get_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + { + *pNextCluster = file->cluster_cache_data[slot]; + return 1; + } +#endif + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_cache_set_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + file->cluster_cache_data[slot] = nextCluster; + else + { + file->cluster_cache_idx[slot] = clusterIdx; + file->cluster_cache_data[slot] = nextCluster; + } +#endif + + return 1; +} diff --git a/Plugson/src/Lib/fat_io_lib/fat_cache.h b/Plugson/src/Lib/fat_io_lib/fat_cache.h new file mode 100644 index 00000000..348d5d38 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_cache.h @@ -0,0 +1,13 @@ +#ifndef __FAT_CACHE_H__ +#define __FAT_CACHE_H__ + +#include "fat_filelib.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file); +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster); +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_defs.h b/Plugson/src/Lib/fat_io_lib/fat_defs.h new file mode 100644 index 00000000..5fe8d6a4 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_defs.h @@ -0,0 +1,128 @@ +#ifndef __FAT_DEFS_H__ +#define __FAT_DEFS_H__ + +#include "fat_opts.h" +#include "fat_types.h" + +//----------------------------------------------------------------------------- +// FAT32 Offsets +// Name Offset +//----------------------------------------------------------------------------- + +// Boot Sector +#define BS_JMPBOOT 0 // Length = 3 +#define BS_OEMNAME 3 // Length = 8 +#define BPB_BYTSPERSEC 11 // Length = 2 +#define BPB_SECPERCLUS 13 // Length = 1 +#define BPB_RSVDSECCNT 14 // Length = 2 +#define BPB_NUMFATS 16 // Length = 1 +#define BPB_ROOTENTCNT 17 // Length = 2 +#define BPB_TOTSEC16 19 // Length = 2 +#define BPB_MEDIA 21 // Length = 1 +#define BPB_FATSZ16 22 // Length = 2 +#define BPB_SECPERTRK 24 // Length = 2 +#define BPB_NUMHEADS 26 // Length = 2 +#define BPB_HIDDSEC 28 // Length = 4 +#define BPB_TOTSEC32 32 // Length = 4 + +// FAT 12/16 +#define BS_FAT_DRVNUM 36 // Length = 1 +#define BS_FAT_BOOTSIG 38 // Length = 1 +#define BS_FAT_VOLID 39 // Length = 4 +#define BS_FAT_VOLLAB 43 // Length = 11 +#define BS_FAT_FILSYSTYPE 54 // Length = 8 + +// FAT 32 +#define BPB_FAT32_FATSZ32 36 // Length = 4 +#define BPB_FAT32_EXTFLAGS 40 // Length = 2 +#define BPB_FAT32_FSVER 42 // Length = 2 +#define BPB_FAT32_ROOTCLUS 44 // Length = 4 +#define BPB_FAT32_FSINFO 48 // Length = 2 +#define BPB_FAT32_BKBOOTSEC 50 // Length = 2 +#define BS_FAT32_DRVNUM 64 // Length = 1 +#define BS_FAT32_BOOTSIG 66 // Length = 1 +#define BS_FAT32_VOLID 67 // Length = 4 +#define BS_FAT32_VOLLAB 71 // Length = 11 +#define BS_FAT32_FILSYSTYPE 82 // Length = 8 + +//----------------------------------------------------------------------------- +// FAT Types +//----------------------------------------------------------------------------- +#define FAT_TYPE_FAT12 1 +#define FAT_TYPE_FAT16 2 +#define FAT_TYPE_FAT32 3 + +//----------------------------------------------------------------------------- +// FAT32 Specific Statics +//----------------------------------------------------------------------------- +#define SIGNATURE_POSITION 510 +#define SIGNATURE_VALUE 0xAA55 +#define PARTITION1_TYPECODE_LOCATION 450 +#define FAT32_TYPECODE1 0x0B +#define FAT32_TYPECODE2 0x0C +#define PARTITION1_LBA_BEGIN_LOCATION 454 +#define PARTITION1_SIZE_LOCATION 458 + +#define FAT_DIR_ENTRY_SIZE 32 +#define FAT_SFN_SIZE_FULL 11 +#define FAT_SFN_SIZE_PARTIAL 8 + +//----------------------------------------------------------------------------- +// FAT32 File Attributes and Types +//----------------------------------------------------------------------------- +#define FILE_ATTR_READ_ONLY 0x01 +#define FILE_ATTR_HIDDEN 0x02 +#define FILE_ATTR_SYSTEM 0x04 +#define FILE_ATTR_SYSHID 0x06 +#define FILE_ATTR_VOLUME_ID 0x08 +#define FILE_ATTR_DIRECTORY 0x10 +#define FILE_ATTR_ARCHIVE 0x20 +#define FILE_ATTR_LFN_TEXT 0x0F +#define FILE_HEADER_BLANK 0x00 +#define FILE_HEADER_DELETED 0xE5 +#define FILE_TYPE_DIR 0x10 +#define FILE_TYPE_FILE 0x20 + +//----------------------------------------------------------------------------- +// Time / Date details +//----------------------------------------------------------------------------- +#define FAT_TIME_HOURS_SHIFT 11 +#define FAT_TIME_HOURS_MASK 0x1F +#define FAT_TIME_MINUTES_SHIFT 5 +#define FAT_TIME_MINUTES_MASK 0x3F +#define FAT_TIME_SECONDS_SHIFT 0 +#define FAT_TIME_SECONDS_MASK 0x1F +#define FAT_TIME_SECONDS_SCALE 2 +#define FAT_DATE_YEAR_SHIFT 9 +#define FAT_DATE_YEAR_MASK 0x7F +#define FAT_DATE_MONTH_SHIFT 5 +#define FAT_DATE_MONTH_MASK 0xF +#define FAT_DATE_DAY_SHIFT 0 +#define FAT_DATE_DAY_MASK 0x1F +#define FAT_DATE_YEAR_OFFSET 1980 + +//----------------------------------------------------------------------------- +// Other Defines +//----------------------------------------------------------------------------- +#define FAT32_LAST_CLUSTER 0xFFFFFFFF +#define FAT32_INVALID_CLUSTER 0xFFFFFFFF + +STRUCT_PACK_BEGIN +struct fat_dir_entry STRUCT_PACK +{ + uint8 Name[11]; + uint8 Attr; + uint8 NTRes; + uint8 CrtTimeTenth; + uint8 CrtTime[2]; + uint8 CrtDate[2]; + uint8 LstAccDate[2]; + uint16 FstClusHI; + uint8 WrtTime[2]; + uint8 WrtDate[2]; + uint16 FstClusLO; + uint32 FileSize; +} STRUCT_PACKED; +STRUCT_PACK_END + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_filelib.c b/Plugson/src/Lib/fat_io_lib/fat_filelib.c new file mode 100644 index 00000000..2c4a236f --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_filelib.c @@ -0,0 +1,1603 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_misc.h" +#include "fat_string.h" +#include "fat_filelib.h" +#include "fat_cache.h" + +//----------------------------------------------------------------------------- +// Locals +//----------------------------------------------------------------------------- +static FL_FILE _files[FATFS_MAX_OPEN_FILES]; +static int _filelib_init = 0; +static int _filelib_valid = 0; +static struct fatfs _fs; +static struct fat_list _open_file_list; +static struct fat_list _free_file_list; + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- + +// Macro for checking if file lib is initialised +#define CHECK_FL_INIT() { if (_filelib_init==0) fl_init(); } + +#define FL_LOCK(a) do { if ((a)->fl_lock) (a)->fl_lock(); } while (0) +#define FL_UNLOCK(a) do { if ((a)->fl_unlock) (a)->fl_unlock(); } while (0) + +//----------------------------------------------------------------------------- +// Local Functions +//----------------------------------------------------------------------------- +static void _fl_init(); + +//----------------------------------------------------------------------------- +// _allocate_file: Find a slot in the open files buffer for a new file +//----------------------------------------------------------------------------- +static FL_FILE* _allocate_file(void) +{ + // Allocate free file + struct fat_node *node = fat_list_pop_head(&_free_file_list); + + // Add to open list + if (node) + fat_list_insert_last(&_open_file_list, node); + + return fat_list_entry(node, FL_FILE, list_node); +} +//----------------------------------------------------------------------------- +// _check_file_open: Returns true if the file is already open +//----------------------------------------------------------------------------- +static int _check_file_open(FL_FILE* file) +{ + struct fat_node *node; + + // Compare open files + fat_list_for_each(&_open_file_list, node) + { + FL_FILE* openFile = fat_list_entry(node, FL_FILE, list_node); + + // If not the current file + if (openFile != file) + { + // Compare path and name + if ( (fatfs_compare_names(openFile->path,file->path)) && (fatfs_compare_names(openFile->filename,file->filename)) ) + return 1; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// _free_file: Free open file handle +//----------------------------------------------------------------------------- +static void _free_file(FL_FILE* file) +{ + // Remove from open list + fat_list_remove(&_open_file_list, &file->list_node); + + // Add to free list + fat_list_insert_last(&_free_file_list, &file->list_node); +} + +//----------------------------------------------------------------------------- +// Low Level +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// _open_directory: Cycle through path string to find the start cluster +// address of the highest subdir. +//----------------------------------------------------------------------------- +static int _open_directory(char *path, uint32 *pathCluster) +{ + int levels; + int sublevel; + char currentfolder[FATFS_MAX_LONG_FILENAME]; + struct fat_dir_entry sfEntry; + uint32 startcluster; + + // Set starting cluster to root cluster + startcluster = fatfs_get_root_cluster(&_fs); + + // Find number of levels + levels = fatfs_total_path_levels(path); + + // Cycle through each level and get the start sector + for (sublevel=0;sublevel<(levels+1);sublevel++) + { + if (fatfs_get_substring(path, sublevel, currentfolder, sizeof(currentfolder)) == -1) + return 0; + + // Find clusteraddress for folder (currentfolder) + if (fatfs_get_file_entry(&_fs, startcluster, currentfolder,&sfEntry)) + { + // Check entry is folder + if (fatfs_entry_is_dir(&sfEntry)) + startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + else + return 0; + } + else + return 0; + } + + *pathCluster = startcluster; + return 1; +} +//----------------------------------------------------------------------------- +// _create_directory: Cycle through path string and create the end directory +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static int _create_directory(char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + int i; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return 0; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return 0; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return 0; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return 0; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return 0; + } + + file->startcluster = 0; + + // Create the file space for the folder (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return 0; + } + + // Erase new directory cluster + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;i<_fs.sectors_per_cluster;i++) + { + if (!fatfs_write_sector(&_fs, file->startcluster, i, file->file_data_sector)) + { + _free_file(file); + return 0; + } + } + +#if FATFS_INC_LFN_SUPPORT + + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 1)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_fat_purge(&_fs); + + _free_file(file); + return 1; +} +#endif +//----------------------------------------------------------------------------- +// _open_file: Open a file for reading +//----------------------------------------------------------------------------- +static FL_FILE* _open_file(const char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0]==0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Using dir cluster address search for filename + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry)) + // Make sure entry is file not dir! + if (fatfs_entry_is_file(&sfEntry)) + { + // Initialise file details + memcpy(file->shortfilename, sfEntry.Name, FAT_SFN_SIZE_FULL); + file->filelength = FAT_HTONL(sfEntry.FileSize); + file->bytenum = 0; + file->startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; + } + + _free_file(file); + return NULL; +} +//----------------------------------------------------------------------------- +// _create_file: Create a new file +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static FL_FILE* _create_file(const char *filename) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + + // No write access? + if (!_fs.disk_io.write_media) + return NULL; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)filename, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return NULL; + } + + file->startcluster = 0; + + // Create the file space for the file (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return NULL; + } + +#if FATFS_INC_LFN_SUPPORT + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 0)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; +} +#endif +//----------------------------------------------------------------------------- +// _read_sectors: Read sector(s) from disk to file +//----------------------------------------------------------------------------- +static uint32 _read_sectors(FL_FILE* file, uint32 offset, uint8 *buffer, uint32 count) +{ + uint32 Sector = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 i; + uint32 lba; + + // Find cluster index within file & sector with cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + Sector = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors read to the number remaining in this cluster + if ((Sector + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - Sector; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + } + + // If end of cluster chain then return false + if (Cluster == FAT32_LAST_CLUSTER) + return 0; + + // Calculate sector address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + Sector; + + // Read sector of file + if (fatfs_sector_read(&_fs, lba, buffer, count)) + return count; + else + return 0; +} + +//----------------------------------------------------------------------------- +// External API +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fl_init: Initialise library +//----------------------------------------------------------------------------- +void fl_init(void) +{ + int i; + + fat_list_init(&_free_file_list); + fat_list_init(&_open_file_list); + + // Add all file objects to free list + for (i=0;iflags = flags; + + FL_UNLOCK(&_fs); + return file; +} +//----------------------------------------------------------------------------- +// _write_sectors: Write sector(s) to disk +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static uint32 _write_sectors(FL_FILE* file, uint32 offset, uint8 *buf, uint32 count) +{ + uint32 SectorNumber = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 LastCluster = FAT32_LAST_CLUSTER; + uint32 i; + uint32 lba; + uint32 TotalWriteCount = count; + + // Find values for Cluster index & sector within cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + SectorNumber = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors written to the number remaining in this cluster + if ((SectorNumber + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - SectorNumber; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + + // Calculate write address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + SectorNumber; + + if (fatfs_sector_write(&_fs, lba, buf, count)) + return count; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_fflush: Flush un-written data to the file +//----------------------------------------------------------------------------- +int fl_fflush(void *f) +{ +#if FATFS_INC_WRITE_SUPPORT + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // If some write data still in buffer + if (file->file_data_dirty) + { + // Write back current sector before loading next + if (_write_sectors(file, file->file_data_address, file->file_data_sector, 1)) + file->file_data_dirty = 0; + } + + FL_UNLOCK(&_fs); + } +#endif + return 0; +} +//----------------------------------------------------------------------------- +// fl_fclose: Close an open file +//----------------------------------------------------------------------------- +void fl_fclose(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // Flush un-written data to file + fl_fflush(f); + + // File size changed? + if (file->filelength_changed) + { +#if FATFS_INC_WRITE_SUPPORT + // Update filesize in directory + fatfs_update_file_length(&_fs, file->parentcluster, (char*)file->shortfilename, file->filelength); +#endif + file->filelength_changed = 0; + } + + file->bytenum = 0; + file->filelength = 0; + file->startcluster = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Free file handle + _free_file(file); + + fatfs_fat_purge(&_fs); + + FL_UNLOCK(&_fs); + } +} +//----------------------------------------------------------------------------- +// fl_fgetc: Get a character in the stream +//----------------------------------------------------------------------------- +int fl_fgetc(void *f) +{ + int res; + uint8 data = 0; + + res = fl_fread(&data, 1, 1, f); + if (res == 1) + return (int)data; + else + return res; +} +//----------------------------------------------------------------------------- +// fl_fgets: Get a string from a stream +//----------------------------------------------------------------------------- +char *fl_fgets(char *s, int n, void *f) +{ + int idx = 0; + + // Space for null terminator? + if (n > 0) + { + // While space (+space for null terminator) + while (idx < (n-1)) + { + int ch = fl_fgetc(f); + + // EOF / Error? + if (ch < 0) + break; + + // Store character read from stream + s[idx++] = (char)ch; + + // End of line? + if (ch == '\n') + break; + } + + if (idx > 0) + s[idx] = '\0'; + } + + return (idx > 0) ? s : 0; +} +//----------------------------------------------------------------------------- +// fl_fread: Read a block of data from the file +//----------------------------------------------------------------------------- +int fl_fread(void * buffer, int size, int length, void *f ) +{ + uint32 sector; + uint32 offset; + int copyCount; + int count = size * length; + int bytesRead = 0; + + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (buffer==NULL || file==NULL) + return -1; + + // No read permissions + if (!(file->flags & FILE_READ)) + return -1; + + // Nothing to be done + if (!count) + return 0; + + // Check if read starts past end of file + if (file->bytenum >= file->filelength) + return -1; + + // Limit to file size + if ( (file->bytenum + count) > file->filelength ) + count = file->filelength - file->bytenum; + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesRead < count) + { + // Read whole sector, read from media directly into target buffer + if ((offset == 0) && ((count - bytesRead) >= FAT_SECTOR_SIZE)) + { + // Read as many sectors as possible into target buffer + uint32 sectorsRead = _read_sectors(file, sector, (uint8*)((uint8*)buffer + bytesRead), (count - bytesRead) / FAT_SECTOR_SIZE); + if (sectorsRead) + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE * sectorsRead; + + // Move onto next sector and reset copy offset + sector+= sectorsRead; + offset = 0; + } + else + break; + } + else + { + // Do we need to re-read the sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + // Read failed - out of range (probably) + break; + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (count - bytesRead)) + copyCount = (count - bytesRead); + + // Copy to application buffer + memcpy( (uint8*)((uint8*)buffer + bytesRead), (uint8*)(file->file_data_sector + offset), copyCount); + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + + // Increase total read count + bytesRead += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + } + + return bytesRead; +} +//----------------------------------------------------------------------------- +// fl_fseek: Seek to a specific place in the file +//----------------------------------------------------------------------------- +int fl_fseek( void *f, long offset, int origin ) +{ + FL_FILE *file = (FL_FILE *)f; + int res = -1; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + if (origin == SEEK_END && offset != 0) + return -1; + + FL_LOCK(&_fs); + + // Invalidate file buffer + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + + if (origin == SEEK_SET) + { + file->bytenum = (uint32)offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + + res = 0; + } + else if (origin == SEEK_CUR) + { + // Positive shift + if (offset >= 0) + { + file->bytenum += offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + } + // Negative shift + else + { + // Make shift positive + offset = -offset; + + // Limit to negative shift to start of file + if ((uint32)offset > file->bytenum) + file->bytenum = 0; + else + file->bytenum-= offset; + } + + res = 0; + } + else if (origin == SEEK_END) + { + file->bytenum = file->filelength; + res = 0; + } + else + res = -1; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fgetpos: Get the current file position +//----------------------------------------------------------------------------- +int fl_fgetpos(void *f , uint32 * position) +{ + FL_FILE *file = (FL_FILE *)f; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // Get position + *position = file->bytenum; + + FL_UNLOCK(&_fs); + + return 0; +} +//----------------------------------------------------------------------------- +// fl_ftell: Get the current file position +//----------------------------------------------------------------------------- +long fl_ftell(void *f) +{ + uint32 pos = 0; + + fl_fgetpos(f, &pos); + + return (long)pos; +} +//----------------------------------------------------------------------------- +// fl_feof: Is the file pointer at the end of the stream? +//----------------------------------------------------------------------------- +int fl_feof(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + int res; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + if (file->bytenum == file->filelength) + res = EOF; + else + res = 0; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fputc: Write a character to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputc(int c, void *f) +{ + uint8 data = (uint8)c; + int res; + + res = fl_fwrite(&data, 1, 1, f); + if (res == 1) + return c; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_fwrite: Write a block of data to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fwrite(const void * data, int size, int count, void *f ) +{ + FL_FILE *file = (FL_FILE *)f; + uint32 sector; + uint32 offset; + uint32 length = (size*count); + uint8 *buffer = (uint8 *)data; + uint32 bytesWritten = 0; + uint32 copyCount; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // No write permissions + if (!(file->flags & FILE_WRITE)) + { + FL_UNLOCK(&_fs); + return -1; + } + + // Append writes to end of file + if (file->flags & FILE_APPEND) + file->bytenum = file->filelength; + // Else write to current position + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesWritten < length) + { + // Whole sector or more to be written? + if ((offset == 0) && ((length - bytesWritten) >= FAT_SECTOR_SIZE)) + { + uint32 sectorsWrote; + + // Buffered sector, flush back to disk + if (file->file_data_address != 0xFFFFFFFF) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + } + + // Write as many sectors as possible + sectorsWrote = _write_sectors(file, sector, (uint8*)(buffer + bytesWritten), (length - bytesWritten) / FAT_SECTOR_SIZE); + copyCount = FAT_SECTOR_SIZE * sectorsWrote; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector+= sectorsWrote; + offset = 0; + + if (!sectorsWrote) + break; + } + else + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (length - bytesWritten)) + copyCount = (length - bytesWritten); + + // Do we need to read a new sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // If we plan to overwrite the whole sector, we don't need to read it first! + if (copyCount != FAT_SECTOR_SIZE) + { + // NOTE: This does not have succeed; if last sector of file + // reached, no valid data will be read in, but write will + // allocate some more space for new data. + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + } + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // Copy from application buffer into sector buffer + memcpy((uint8*)(file->file_data_sector + offset), (uint8*)(buffer + bytesWritten), copyCount); + + // Mark buffer as dirty + file->file_data_dirty = 1; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + } + + // Write increased extent of the file? + if (file->bytenum > file->filelength) + { + // Increase file size to new point + file->filelength = file->bytenum; + + // We are changing the file length and this + // will need to be writen back at some point + file->filelength_changed = 1; + } + +#if FATFS_INC_TIME_DATE_SUPPORT + // If time & date support is enabled, always force directory entry to be + // written in-order to update file modify / access time & date. + file->filelength_changed = 1; +#endif + + FL_UNLOCK(&_fs); + + return (size*count); +} +#endif +//----------------------------------------------------------------------------- +// fl_fputs: Write a character string to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputs(const char * str, void *f) +{ + int len = (int)strlen(str); + int res = fl_fwrite(str, 1, len, f); + + if (res == len) + return len; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_remove: Remove a file from the filesystem +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_remove( const char * filename ) +{ + FL_FILE* file; + int res = -1; + + FL_LOCK(&_fs); + + // Use read_file as this will check if the file is already open! + file = fl_fopen((char*)filename, "r"); + if (file) + { + // Delete allocated space + if (fatfs_free_cluster_chain(&_fs, file->startcluster)) + { + // Remove directory entries + if (fatfs_mark_file_deleted(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Close the file handle (this should not write anything to the file + // as we have not changed the file since opening it!) + fl_fclose(file); + + res = 0; + } + } + } + + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_createdirectory: Create a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_createdirectory(const char *path) +{ + int res; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + res =_create_directory((char*)path); + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_listdirectory: List a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fl_listdirectory(const char *path) +{ + FL_DIR dirstat; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + FAT_PRINTF(("\r\nDirectory %s\r\n", path)); + + if (fl_opendir(path, &dirstat)) + { + struct fs_dir_ent dirent; + + while (fl_readdir(&dirstat, &dirent) == 0) + { +#if FATFS_INC_TIME_DATE_SUPPORT + int d,m,y,h,mn,s; + fatfs_convert_from_fat_time(dirent.write_time, &h,&m,&s); + fatfs_convert_from_fat_date(dirent.write_date, &d,&mn,&y); + FAT_PRINTF(("%02d/%02d/%04d %02d:%02d ", d,mn,y,h,m)); +#endif + + if (dirent.is_dir) + { + FAT_PRINTF(("%s \r\n", dirent.filename)); + } + else + { + FAT_PRINTF(("%s [%d bytes]\r\n", dirent.filename, dirent.size)); + } + } + + fl_closedir(&dirstat); + } + + FL_UNLOCK(&_fs); +} +#endif +//----------------------------------------------------------------------------- +// fl_opendir: Opens a directory for listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +FL_DIR* fl_opendir(const char* path, FL_DIR *dir) +{ + int levels; + int res = 1; + uint32 cluster = FAT32_INVALID_CLUSTER; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + levels = fatfs_total_path_levels((char*)path) + 1; + + // If path is in the root dir + if (levels == 0) + cluster = fatfs_get_root_cluster(&_fs); + // Find parent directory start cluster + else + res = _open_directory((char*)path, &cluster); + + if (res) + fatfs_list_directory_start(&_fs, dir, cluster); + + FL_UNLOCK(&_fs); + + return cluster != FAT32_INVALID_CLUSTER ? dir : 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_readdir: Get next item in directory +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_readdir(FL_DIR *dirls, fl_dirent *entry) +{ + int res = 0; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + res = fatfs_list_directory_next(&_fs, dirls, entry); + + FL_UNLOCK(&_fs); + + return res ? 0 : -1; +} +#endif +//----------------------------------------------------------------------------- +// fl_closedir: Close directory after listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_closedir(FL_DIR* dir) +{ + // Not used + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_is_dir: Is this a directory? +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_is_dir(const char *path) +{ + int res = 0; + FL_DIR dir; + + if (fl_opendir(path, &dir)) + { + res = 1; + fl_closedir(&dir); + } + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +#if FATFS_INC_FORMAT_SUPPORT +int fl_format(uint32 volume_sectors, const char *name) +{ + return fatfs_format(&_fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ +//----------------------------------------------------------------------------- +// fl_get_fs: +//----------------------------------------------------------------------------- +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void) +{ + return &_fs; +} +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_filelib.h b/Plugson/src/Lib/fat_io_lib/fat_filelib.h new file mode 100644 index 00000000..a40a28ff --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_filelib.h @@ -0,0 +1,146 @@ +#ifndef __FAT_FILELIB_H__ +#define __FAT_FILELIB_H__ + +#include "fat_opts.h" +#include "fat_access.h" +#include "fat_list.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#ifndef SEEK_CUR + #define SEEK_CUR 1 +#endif + +#ifndef SEEK_END + #define SEEK_END 2 +#endif + +#ifndef SEEK_SET + #define SEEK_SET 0 +#endif + +#ifndef EOF + #define EOF (-1) +#endif + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct sFL_FILE; + +struct cluster_lookup +{ + uint32 ClusterIdx; + uint32 CurrentCluster; +}; + +typedef struct sFL_FILE +{ + uint32 parentcluster; + uint32 startcluster; + uint32 bytenum; + uint32 filelength; + int filelength_changed; + char path[FATFS_MAX_LONG_FILENAME]; + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 shortfilename[11]; + +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 cluster_cache_idx[FAT_CLUSTER_CACHE_ENTRIES]; + uint32 cluster_cache_data[FAT_CLUSTER_CACHE_ENTRIES]; +#endif + + // Cluster Lookup + struct cluster_lookup last_fat_lookup; + + // Read/Write sector buffer + uint8 file_data_sector[FAT_SECTOR_SIZE]; + uint32 file_data_address; + int file_data_dirty; + + // File fopen flags + uint8 flags; +#define FILE_READ (1 << 0) +#define FILE_WRITE (1 << 1) +#define FILE_APPEND (1 << 2) +#define FILE_BINARY (1 << 3) +#define FILE_ERASE (1 << 4) +#define FILE_CREATE (1 << 5) + + struct fat_node list_node; +} FL_FILE; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- + +// External +void fl_init(void); +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)); +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr); +void fl_shutdown(void); + +// Standard API +void* fl_fopen(const char *path, const char *modifiers); +void fl_fclose(void *file); +int fl_fflush(void *file); +int fl_fgetc(void *file); +char * fl_fgets(char *s, int n, void *f); +int fl_fputc(int c, void *file); +int fl_fputs(const char * str, void *file); +int fl_fwrite(const void * data, int size, int count, void *file ); +int fl_fread(void * data, int size, int count, void *file ); +int fl_fseek(void *file , long offset , int origin ); +int fl_fgetpos(void *file , uint32 * position); +long fl_ftell(void *f); +int fl_feof(void *f); +int fl_remove(const char * filename); + +// Equivelant dirent.h +typedef struct fs_dir_list_status FL_DIR; +typedef struct fs_dir_ent fl_dirent; + +FL_DIR* fl_opendir(const char* path, FL_DIR *dir); +int fl_readdir(FL_DIR *dirls, fl_dirent *entry); +int fl_closedir(FL_DIR* dir); + +// Extensions +void fl_listdirectory(const char *path); +int fl_createdirectory(const char *path); +int fl_is_dir(const char *path); + +int fl_format(uint32 volume_sectors, const char *name); + +// Test hooks +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void); +#endif + +//----------------------------------------------------------------------------- +// Stdio file I/O names +//----------------------------------------------------------------------------- +#ifdef USE_FILELIB_STDIO_COMPAT_NAMES + +#define FILE FL_FILE + +#define fopen(a,b) fl_fopen(a, b) +#define fclose(a) fl_fclose(a) +#define fflush(a) fl_fflush(a) +#define fgetc(a) fl_fgetc(a) +#define fgets(a,b,c) fl_fgets(a, b, c) +#define fputc(a,b) fl_fputc(a, b) +#define fputs(a,b) fl_fputs(a, b) +#define fwrite(a,b,c,d) fl_fwrite(a, b, c, d) +#define fread(a,b,c,d) fl_fread(a, b, c, d) +#define fseek(a,b,c) fl_fseek(a, b, c) +#define fgetpos(a,b) fl_fgetpos(a, b) +#define ftell(a) fl_ftell(a) +#define feof(a) fl_feof(a) +#define remove(a) fl_remove(a) +#define mkdir(a) fl_createdirectory(a) +#define rmdir(a) 0 + +#endif + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_format.c b/Plugson/src/Lib/fat_io_lib/fat_format.c new file mode 100644 index 00000000..d067f377 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_format.c @@ -0,0 +1,532 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" +#include "fat_format.h" + +#if FATFS_INC_FORMAT_SUPPORT + +//----------------------------------------------------------------------------- +// Tables +//----------------------------------------------------------------------------- +struct sec_per_clus_table +{ + uint32 sectors; + uint8 sectors_per_cluster; +}; + +struct sec_per_clus_table _cluster_size_table16[] = +{ + { 32680, 2}, // 16MB - 1K + { 262144, 4}, // 128MB - 2K + { 524288, 8}, // 256MB - 4K + { 1048576, 16}, // 512MB - 8K + { 2097152, 32}, // 1GB - 16K + { 4194304, 64}, // 2GB - 32K + { 8388608, 128},// 2GB - 64K [Warning only supported by Windows XP onwards] + { 0 , 0 } // Invalid +}; + +struct sec_per_clus_table _cluster_size_table32[] = +{ + { 532480, 1}, // 260MB - 512b + { 16777216, 8}, // 8GB - 4K + { 33554432, 16}, // 16GB - 8K + { 67108864, 32}, // 32GB - 16K + { 0xFFFFFFFF, 64},// >32GB - 32K + { 0 , 0 } // Invalid +}; + +//----------------------------------------------------------------------------- +// fatfs_calc_cluster_size: Calculate what cluster size should be used +//----------------------------------------------------------------------------- +static uint8 fatfs_calc_cluster_size(uint32 sectors, int is_fat32) +{ + int i; + + if (!is_fat32) + { + for (i=0; _cluster_size_table16[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table16[i].sectors) + return _cluster_size_table16[i].sectors_per_cluster; + } + else + { + for (i=0; _cluster_size_table32[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table32[i].sectors) + return _cluster_size_table32[i].sectors_per_cluster; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_sectors: Erase a number of sectors +//----------------------------------------------------------------------------- +static int fatfs_erase_sectors(struct fatfs *fs, uint32 lba, int count) +{ + int i; + + // Zero sector first + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + for (i=0;idisk_io.write_media(lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_create_boot_sector: Create the boot sector +//----------------------------------------------------------------------------- +static int fatfs_create_boot_sector(struct fatfs *fs, uint32 boot_sector_lba, uint32 vol_sectors, const char *name, int is_fat32) +{ + uint32 total_clusters; + int i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // OEM Name & Jump Code + fs->currentsector.sector[0] = 0xEB; + fs->currentsector.sector[1] = 0x3C; + fs->currentsector.sector[2] = 0x90; + fs->currentsector.sector[3] = 0x4D; + fs->currentsector.sector[4] = 0x53; + fs->currentsector.sector[5] = 0x44; + fs->currentsector.sector[6] = 0x4F; + fs->currentsector.sector[7] = 0x53; + fs->currentsector.sector[8] = 0x35; + fs->currentsector.sector[9] = 0x2E; + fs->currentsector.sector[10] = 0x30; + + // Bytes per sector + fs->currentsector.sector[11] = (FAT_SECTOR_SIZE >> 0) & 0xFF; + fs->currentsector.sector[12] = (FAT_SECTOR_SIZE >> 8) & 0xFF; + + // Get sectors per cluster size for the disk + fs->sectors_per_cluster = fatfs_calc_cluster_size(vol_sectors, is_fat32); + if (!fs->sectors_per_cluster) + return 0; // Invalid disk size + + // Sectors per cluster + fs->currentsector.sector[13] = fs->sectors_per_cluster; + + // Reserved Sectors + if (!is_fat32) + fs->reserved_sectors = 8; + else + fs->reserved_sectors = 32; + fs->currentsector.sector[14] = (fs->reserved_sectors >> 0) & 0xFF; + fs->currentsector.sector[15] = (fs->reserved_sectors >> 8) & 0xFF; + + // Number of FATS + fs->num_of_fats = 2; + fs->currentsector.sector[16] = fs->num_of_fats; + + // Max entries in root dir (FAT16 only) + if (!is_fat32) + { + fs->root_entry_count = 512; + fs->currentsector.sector[17] = (fs->root_entry_count >> 0) & 0xFF; + fs->currentsector.sector[18] = (fs->root_entry_count >> 8) & 0xFF; + } + else + { + fs->root_entry_count = 0; + fs->currentsector.sector[17] = 0; + fs->currentsector.sector[18] = 0; + } + + // [FAT16] Total sectors (use FAT32 count instead) + fs->currentsector.sector[19] = 0x00; + fs->currentsector.sector[20] = 0x00; + + // Media type + fs->currentsector.sector[21] = 0xF8; + + + // FAT16 BS Details + if (!is_fat32) + { + // Count of sectors used by the FAT table (FAT16 only) + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/2)) + 1; + fs->currentsector.sector[22] = (uint8)((fs->fat_sectors >> 0) & 0xFF); + fs->currentsector.sector[23] = (uint8)((fs->fat_sectors >> 8) & 0xFF); + + // Sectors per track + fs->currentsector.sector[24] = 0x00; + fs->currentsector.sector[25] = 0x00; + + // Heads + fs->currentsector.sector[26] = 0x00; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x20; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + // Drive number + fs->currentsector.sector[36] = 0x00; + + // Reserved + fs->currentsector.sector[37] = 0x00; + + // Boot signature + fs->currentsector.sector[38] = 0x29; + + // Volume ID + fs->currentsector.sector[39] = 0x12; + fs->currentsector.sector[40] = 0x34; + fs->currentsector.sector[41] = 0x56; + fs->currentsector.sector[42] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+43] = name[i]; + else + fs->currentsector.sector[i+43] = ' '; + } + + // File sys type + fs->currentsector.sector[54] = 'F'; + fs->currentsector.sector[55] = 'A'; + fs->currentsector.sector[56] = 'T'; + fs->currentsector.sector[57] = '1'; + fs->currentsector.sector[58] = '6'; + fs->currentsector.sector[59] = ' '; + fs->currentsector.sector[60] = ' '; + fs->currentsector.sector[61] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + // FAT32 BS Details + else + { + // Count of sectors used by the FAT table (FAT16 only) + fs->currentsector.sector[22] = 0; + fs->currentsector.sector[23] = 0; + + // Sectors per track (default) + fs->currentsector.sector[24] = 0x3F; + fs->currentsector.sector[25] = 0x00; + + // Heads (default) + fs->currentsector.sector[26] = 0xFF; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x00; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/4)) + 1; + + // BPB_FATSz32 + fs->currentsector.sector[36] = (uint8)((fs->fat_sectors>>0)&0xFF); + fs->currentsector.sector[37] = (uint8)((fs->fat_sectors>>8)&0xFF); + fs->currentsector.sector[38] = (uint8)((fs->fat_sectors>>16)&0xFF); + fs->currentsector.sector[39] = (uint8)((fs->fat_sectors>>24)&0xFF); + + // BPB_ExtFlags + fs->currentsector.sector[40] = 0; + fs->currentsector.sector[41] = 0; + + // BPB_FSVer + fs->currentsector.sector[42] = 0; + fs->currentsector.sector[43] = 0; + + // BPB_RootClus + fs->currentsector.sector[44] = (uint8)((fs->rootdir_first_cluster>>0)&0xFF); + fs->currentsector.sector[45] = (uint8)((fs->rootdir_first_cluster>>8)&0xFF); + fs->currentsector.sector[46] = (uint8)((fs->rootdir_first_cluster>>16)&0xFF); + fs->currentsector.sector[47] = (uint8)((fs->rootdir_first_cluster>>24)&0xFF); + + // BPB_FSInfo + fs->currentsector.sector[48] = (uint8)((fs->fs_info_sector>>0)&0xFF); + fs->currentsector.sector[49] = (uint8)((fs->fs_info_sector>>8)&0xFF); + + // BPB_BkBootSec + fs->currentsector.sector[50] = 6; + fs->currentsector.sector[51] = 0; + + // Drive number + fs->currentsector.sector[64] = 0x00; + + // Boot signature + fs->currentsector.sector[66] = 0x29; + + // Volume ID + fs->currentsector.sector[67] = 0x12; + fs->currentsector.sector[68] = 0x34; + fs->currentsector.sector[69] = 0x56; + fs->currentsector.sector[70] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+71] = name[i]; + else + fs->currentsector.sector[i+71] = ' '; + } + + // File sys type + fs->currentsector.sector[82] = 'F'; + fs->currentsector.sector[83] = 'A'; + fs->currentsector.sector[84] = 'T'; + fs->currentsector.sector[85] = '3'; + fs->currentsector.sector[86] = '2'; + fs->currentsector.sector[87] = ' '; + fs->currentsector.sector[88] = ' '; + fs->currentsector.sector[89] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + + if (fs->disk_io.write_media(boot_sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_fsinfo_sector: Create the FSInfo sector (FAT32) +//----------------------------------------------------------------------------- +static int fatfs_create_fsinfo_sector(struct fatfs *fs, uint32 sector_lba) +{ + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // FSI_LeadSig + fs->currentsector.sector[0] = 0x52; + fs->currentsector.sector[1] = 0x52; + fs->currentsector.sector[2] = 0x61; + fs->currentsector.sector[3] = 0x41; + + // FSI_StrucSig + fs->currentsector.sector[484] = 0x72; + fs->currentsector.sector[485] = 0x72; + fs->currentsector.sector[486] = 0x41; + fs->currentsector.sector[487] = 0x61; + + // FSI_Free_Count + fs->currentsector.sector[488] = 0xFF; + fs->currentsector.sector[489] = 0xFF; + fs->currentsector.sector[490] = 0xFF; + fs->currentsector.sector[491] = 0xFF; + + // FSI_Nxt_Free + fs->currentsector.sector[492] = 0xFF; + fs->currentsector.sector[493] = 0xFF; + fs->currentsector.sector[494] = 0xFF; + fs->currentsector.sector[495] = 0xFF; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + + if (fs->disk_io.write_media(sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_fat: Erase FAT table using fs details in fs struct +//----------------------------------------------------------------------------- +static int fatfs_erase_fat(struct fatfs *fs, int is_fat32) +{ + uint32 i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // Initialise default allocate / reserved clusters + if (!is_fat32) + { + SET_16BIT_WORD(fs->currentsector.sector, 0, 0xFFF8); + SET_16BIT_WORD(fs->currentsector.sector, 2, 0xFFFF); + } + else + { + SET_32BIT_WORD(fs->currentsector.sector, 0, 0x0FFFFFF8); + SET_32BIT_WORD(fs->currentsector.sector, 4, 0xFFFFFFFF); + SET_32BIT_WORD(fs->currentsector.sector, 8, 0x0FFFFFFF); + } + + if (!fs->disk_io.write_media(fs->fat_begin_lba + 0, fs->currentsector.sector, 1)) + return 0; + + // Zero remaining FAT sectors + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + for (i=1;ifat_sectors*fs->num_of_fats;i++) + if (!fs->disk_io.write_media(fs->fat_begin_lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat16: Format a FAT16 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + + // Not valid for FAT16 + fs->fs_info_sector = 0; + fs->rootdir_first_cluster = 0; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 0)) + return 0; + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = fs->reserved_sectors + (fs->num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 0)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fs->lba_begin + fs->rootdir_first_sector, fs->rootdir_sectors)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat32: Format a FAT32 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + + // Basic defaults for normal FAT32 partitions + fs->fs_info_sector = 1; + fs->rootdir_first_cluster = 2; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 1)) + return 0; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FSInfo sector + if (!fatfs_create_fsinfo_sector(fs, fs->fs_info_sector)) + return 0; + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 1)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fatfs_lba_of_cluster(fs, fs->rootdir_first_cluster), fs->sectors_per_cluster)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + // 2GB - 32K limit for safe behaviour for FAT16 + if (volume_sectors <= 4194304) + return fatfs_format_fat16(fs, volume_sectors, name); + else + return fatfs_format_fat32(fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ diff --git a/Plugson/src/Lib/fat_io_lib/fat_format.h b/Plugson/src/Lib/fat_io_lib/fat_format.h new file mode 100644 index 00000000..a8a6bbaf --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_format.h @@ -0,0 +1,15 @@ +#ifndef __FAT_FORMAT_H__ +#define __FAT_FORMAT_H__ + +#include "fat_defs.h" +#include "fat_opts.h" +#include "fat_access.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_list.h b/Plugson/src/Lib/fat_io_lib/fat_list.h new file mode 100644 index 00000000..bd386ef6 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_list.h @@ -0,0 +1,161 @@ +#ifndef __FAT_LIST_H__ +#define __FAT_LIST_H__ + +#ifndef FAT_ASSERT + #define FAT_ASSERT(x) +#endif + +#ifndef FAT_INLINE + #define FAT_INLINE +#endif + +//----------------------------------------------------------------- +// Types +//----------------------------------------------------------------- +struct fat_list; + +struct fat_node +{ + struct fat_node *previous; + struct fat_node *next; +}; + +struct fat_list +{ + struct fat_node *head; + struct fat_node *tail; +}; + +//----------------------------------------------------------------- +// Macros +//----------------------------------------------------------------- +#define fat_list_entry(p, t, m) p ? ((t *)((char *)(p)-(char*)(&((t *)0)->m))) : 0 +#define fat_list_next(l, p) (p)->next +#define fat_list_prev(l, p) (p)->previous +#define fat_list_first(l) (l)->head +#define fat_list_last(l) (l)->tail +#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) + +//----------------------------------------------------------------- +// Inline Functions +//----------------------------------------------------------------- + +//----------------------------------------------------------------- +// fat_list_init: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_init(struct fat_list *list) +{ + FAT_ASSERT(list); + + list->head = list->tail = 0; +} +//----------------------------------------------------------------- +// fat_list_remove: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if(!node->previous) + list->head = node->next; + else + node->previous->next = node->next; + + if(!node->next) + list->tail = node->previous; + else + node->next->previous = node->previous; +} +//----------------------------------------------------------------- +// fat_list_insert_after: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node; + new_node->next = node->next; + if (!node->next) + list->tail = new_node; + else + node->next->previous = new_node; + node->next = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_before: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node->previous; + new_node->next = node; + if (!node->previous) + list->head = new_node; + else + node->previous->next = new_node; + node->previous = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_first: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->head) + { + list->head = node; + list->tail = node; + node->previous = 0; + node->next = 0; + } + else + fat_list_insert_before(list, list->head, node); +} +//----------------------------------------------------------------- +// fat_list_insert_last: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->tail) + fat_list_insert_first(list, node); + else + fat_list_insert_after(list, list->tail, node); +} +//----------------------------------------------------------------- +// fat_list_is_empty: +//----------------------------------------------------------------- +static FAT_INLINE int fat_list_is_empty(struct fat_list *list) +{ + FAT_ASSERT(list); + + return !list->head; +} +//----------------------------------------------------------------- +// fat_list_pop_head: +//----------------------------------------------------------------- +static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) +{ + struct fat_node * node; + + FAT_ASSERT(list); + + node = fat_list_first(list); + if (node) + fat_list_remove(list, node); + + return node; +} + +#endif + diff --git a/Plugson/src/Lib/fat_io_lib/fat_misc.c b/Plugson/src/Lib/fat_io_lib/fat_misc.c new file mode 100644 index 00000000..cbf6f08d --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_misc.c @@ -0,0 +1,505 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_init: Clear long file name cache +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable) +{ + int i = 0; + + lfn->no_of_strings = 0; + +#if FATFS_INC_LFN_SUPPORT + + // Zero out buffer also + if (wipeTable) + for (i=0;iString[i], 0x00, MAX_LFN_ENTRY_LENGTH); +#endif +} +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_entry - Function extracts long file name text from sector +// at a specific offset +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer) +{ + uint8 LFNIndex, i; + LFNIndex = entryBuffer[0] & 0x1F; + + // Limit file name to cache size! + if (LFNIndex > MAX_LONGFILENAME_ENTRIES) + return ; + + // This is an error condition + if (LFNIndex == 0) + return ; + + if (lfn->no_of_strings == 0) + lfn->no_of_strings = LFNIndex; + + lfn->String[LFNIndex-1][0] = entryBuffer[1]; + lfn->String[LFNIndex-1][1] = entryBuffer[3]; + lfn->String[LFNIndex-1][2] = entryBuffer[5]; + lfn->String[LFNIndex-1][3] = entryBuffer[7]; + lfn->String[LFNIndex-1][4] = entryBuffer[9]; + lfn->String[LFNIndex-1][5] = entryBuffer[0x0E]; + lfn->String[LFNIndex-1][6] = entryBuffer[0x10]; + lfn->String[LFNIndex-1][7] = entryBuffer[0x12]; + lfn->String[LFNIndex-1][8] = entryBuffer[0x14]; + lfn->String[LFNIndex-1][9] = entryBuffer[0x16]; + lfn->String[LFNIndex-1][10] = entryBuffer[0x18]; + lfn->String[LFNIndex-1][11] = entryBuffer[0x1C]; + lfn->String[LFNIndex-1][12] = entryBuffer[0x1E]; + + for (i=0; iString[LFNIndex-1][i]==0xFF) + lfn->String[LFNIndex-1][i] = 0x20; // Replace with spaces +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_get: Get a reference to the long filename +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +char* fatfs_lfn_cache_get(struct lfn_cache *lfn) +{ + // Null terminate long filename + if (lfn->no_of_strings == MAX_LONGFILENAME_ENTRIES) + lfn->Null = '\0'; + else if (lfn->no_of_strings) + lfn->String[lfn->no_of_strings][0] = '\0'; + else + lfn->String[0][0] = '\0'; + + return (char*)&lfn->String[0][0]; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_text: If LFN text entry found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_text(struct fat_dir_entry *entry) +{ + if ((entry->Attr & FILE_ATTR_LFN_TEXT) == FILE_ATTR_LFN_TEXT) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_invalid: If SFN found not relating to LFN +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry) +{ + if ( (entry->Name[0]==FILE_HEADER_BLANK) || + (entry->Name[0]==FILE_HEADER_DELETED)|| + (entry->Attr==FILE_ATTR_VOLUME_ID) || + (entry->Attr & FILE_ATTR_SYSHID) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_exists: If LFN exists and correlation SFN found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) && + (lfn->no_of_strings) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_sfn_only: If SFN only exists +//----------------------------------------------------------------------------- +int fatfs_entry_sfn_only(struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) ) + return 1; + else + return 0; +} +// TODO: FILE_ATTR_SYSHID ?!?!??! +//----------------------------------------------------------------------------- +// fatfs_entry_is_dir: Returns 1 if a directory +//----------------------------------------------------------------------------- +int fatfs_entry_is_dir(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_DIR) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_entry_is_file: Returns 1 is a file entry +//----------------------------------------------------------------------------- +int fatfs_entry_is_file(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_FILE) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_lfn_entries_required: Calculate number of 13 characters entries +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_lfn_entries_required(char *filename) +{ + int length = (int)strlen(filename); + + if (length) + return (length + MAX_LFN_ENTRY_LENGTH - 1) / MAX_LFN_ENTRY_LENGTH; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_filename_to_lfn: +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk) +{ + int i; + int nameIndexes[MAX_LFN_ENTRY_LENGTH] = {1,3,5,7,9,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; + + // 13 characters entries + int length = (int)strlen(filename); + int entriesRequired = fatfs_lfn_entries_required(filename); + + // Filename offset + int start = entry * MAX_LFN_ENTRY_LENGTH; + + // Initialise to zeros + memset(buffer, 0x00, FAT_DIR_ENTRY_SIZE); + + // LFN entry number + buffer[0] = (uint8)(((entriesRequired-1)==entry)?(0x40|(entry+1)):(entry+1)); + + // LFN flag + buffer[11] = 0x0F; + + // Checksum of short filename + buffer[13] = sfnChk; + + // Copy to buffer + for (i=0;iName[i] = shortfilename[i]; + + // Unless we have a RTC we might as well set these to 1980 + entry->CrtTimeTenth = 0x00; + entry->CrtTime[1] = entry->CrtTime[0] = 0x00; + entry->CrtDate[1] = 0x00; + entry->CrtDate[0] = 0x20; + entry->LstAccDate[1] = 0x00; + entry->LstAccDate[0] = 0x20; + entry->WrtTime[1] = entry->WrtTime[0] = 0x00; + entry->WrtDate[1] = 0x00; + entry->WrtDate[0] = 0x20; + + if (!dir) + entry->Attr = FILE_TYPE_FILE; + else + entry->Attr = FILE_TYPE_DIR; + + entry->NTRes = 0x00; + + entry->FstClusHI = FAT_HTONS((uint16)((startCluster>>16) & 0xFFFF)); + entry->FstClusLO = FAT_HTONS((uint16)((startCluster>>0) & 0xFFFF)); + entry->FileSize = FAT_HTONL(size); +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_create_sfn: Create a padded SFN +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_create_sfn(char *sfn_output, char *filename) +{ + int i; + int dotPos = -1; + char ext[3]; + int pos; + int len = (int)strlen(filename); + + // Invalid to start with . + if (filename[0]=='.') + return 0; + + memset(sfn_output, ' ', FAT_SFN_SIZE_FULL); + memset(ext, ' ', 3); + + // Find dot seperator + for (i = 0; i< len; i++) + { + if (filename[i]=='.') + dotPos = i; + } + + // Extract extensions + if (dotPos!=-1) + { + // Copy first three chars of extension + for (i = (dotPos+1); i < (dotPos+1+3); i++) + if (i= 'a' && filename[i] <= 'z') + sfn_output[pos++] = filename[i] - 'a' + 'A'; + else + sfn_output[pos++] = filename[i]; + } + + // Fill upto 8 characters + if (pos==FAT_SFN_SIZE_PARTIAL) + break; + } + + // Add extension part + for (i=FAT_SFN_SIZE_PARTIAL;i= 'a' && ext[i-FAT_SFN_SIZE_PARTIAL] <= 'z') + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL] - 'a' + 'A'; + else + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL]; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_itoa: +//----------------------------------------------------------------------------- +static void fatfs_itoa(uint32 num, char *s) +{ + char* cp; + char outbuf[12]; + const char digits[] = "0123456789ABCDEF"; + + // Build string backwards + cp = outbuf; + do + { + *cp++ = digits[(int)(num % 10)]; + } + while ((num /= 10) > 0); + + *cp-- = 0; + + // Copy in forwards + while (cp >= outbuf) + *s++ = *cp--; + + *s = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_generate_tail: +// sfn_input = Input short filename, spaced format & in upper case +// sfn_output = Output short filename with tail +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum) +{ + int tail_chars; + char tail_str[12]; + + if (tailNum > 99999) + return 0; + + // Convert to number + memset(tail_str, 0x00, sizeof(tail_str)); + tail_str[0] = '~'; + fatfs_itoa(tailNum, tail_str+1); + + // Copy in base filename + memcpy(sfn_output, sfn_input, FAT_SFN_SIZE_FULL); + + // Overwrite with tail + tail_chars = (int)strlen(tail_str); + memcpy(sfn_output+(FAT_SFN_SIZE_PARTIAL-tail_chars), tail_str, tail_chars); + + return 1; +} +#endif +#endif +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_time: Convert FAT time to h/m/s +//----------------------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds) +{ + *hours = (fat_time >> FAT_TIME_HOURS_SHIFT) & FAT_TIME_HOURS_MASK; + *minutes = (fat_time >> FAT_TIME_MINUTES_SHIFT) & FAT_TIME_MINUTES_MASK; + *seconds = (fat_time >> FAT_TIME_SECONDS_SHIFT) & FAT_TIME_SECONDS_MASK; + *seconds = *seconds * FAT_TIME_SECONDS_SCALE; +} +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_date: Convert FAT date to d/m/y +//----------------------------------------------------------------------------- +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year) +{ + *day = (fat_date >> FAT_DATE_DAY_SHIFT) & FAT_DATE_DAY_MASK; + *month = (fat_date >> FAT_DATE_MONTH_SHIFT) & FAT_DATE_MONTH_MASK; + *year = (fat_date >> FAT_DATE_YEAR_SHIFT) & FAT_DATE_YEAR_MASK; + *year = *year + FAT_DATE_YEAR_OFFSET; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_time: Convert h/m/s to FAT time +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds) +{ + uint16 fat_time = 0; + + // Most FAT times are to a resolution of 2 seconds + seconds /= FAT_TIME_SECONDS_SCALE; + + fat_time = (hours & FAT_TIME_HOURS_MASK) << FAT_TIME_HOURS_SHIFT; + fat_time|= (minutes & FAT_TIME_MINUTES_MASK) << FAT_TIME_MINUTES_SHIFT; + fat_time|= (seconds & FAT_TIME_SECONDS_MASK) << FAT_TIME_SECONDS_SHIFT; + + return fat_time; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_date: Convert d/m/y to FAT date +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_date(int day, int month, int year) +{ + uint16 fat_date = 0; + + // FAT dates are relative to 1980 + if (year >= FAT_DATE_YEAR_OFFSET) + year -= FAT_DATE_YEAR_OFFSET; + + fat_date = (day & FAT_DATE_DAY_MASK) << FAT_DATE_DAY_SHIFT; + fat_date|= (month & FAT_DATE_MONTH_MASK) << FAT_DATE_MONTH_SHIFT; + fat_date|= (year & FAT_DATE_YEAR_MASK) << FAT_DATE_YEAR_SHIFT; + + return fat_date; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_print_sector: +//----------------------------------------------------------------------------- +#ifdef FATFS_DEBUG +void fatfs_print_sector(uint32 sector, uint8 *data) +{ + int i; + int j; + + FAT_PRINTF(("Sector %d:\n", sector)); + + for (i=0;i 31 && ch < 127) + { + FAT_PRINTF(("%c", ch)); + } + else + { + FAT_PRINTF((".")); + } + } + + FAT_PRINTF(("\n")); + } + } +} +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_misc.h b/Plugson/src/Lib/fat_io_lib/fat_misc.h new file mode 100644 index 00000000..0c026343 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_misc.h @@ -0,0 +1,63 @@ +#ifndef __FAT_MISC_H__ +#define __FAT_MISC_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define MAX_LONGFILENAME_ENTRIES 20 +#define MAX_LFN_ENTRY_LENGTH 13 + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- +#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) +#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) + +#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); \ + buffer[location+2] = (uint8)((value>>16)&0xFF); \ + buffer[location+3] = (uint8)((value>>24)&0xFF); } + +#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); } + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct lfn_cache +{ +#if FATFS_INC_LFN_SUPPORT + // Long File Name Structure (max 260 LFN length) + uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; + uint8 Null; +#endif + uint8 no_of_strings; +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); +char* fatfs_lfn_cache_get(struct lfn_cache *lfn); +int fatfs_entry_lfn_text(struct fat_dir_entry *entry); +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); +int fatfs_entry_sfn_only(struct fat_dir_entry *entry); +int fatfs_entry_is_dir(struct fat_dir_entry *entry); +int fatfs_entry_is_file(struct fat_dir_entry *entry); +int fatfs_lfn_entries_required(char *filename); +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); +void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); +int fatfs_lfn_create_sfn(char *sfn_output, char *filename); +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); +uint16 fatfs_convert_to_fat_date(int day, int month, int year); +void fatfs_print_sector(uint32 sector, uint8 *data); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_opts.h b/Plugson/src/Lib/fat_io_lib/fat_opts.h new file mode 100644 index 00000000..6db158c4 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_opts.h @@ -0,0 +1,83 @@ +#ifndef __FAT_OPTS_H__ +#define __FAT_OPTS_H__ + +#ifdef FATFS_USE_CUSTOM_OPTS_FILE + #include "fat_custom.h" +#endif + +//------------------------------------------------------------- +// Configuration +//------------------------------------------------------------- + +// Is the processor little endian (1) or big endian (0) +#ifndef FATFS_IS_LITTLE_ENDIAN + #define FATFS_IS_LITTLE_ENDIAN 1 +#endif + +// Max filename Length +#ifndef FATFS_MAX_LONG_FILENAME + #define FATFS_MAX_LONG_FILENAME 260 +#endif + +// Max open files (reduce to lower memory requirements) +#ifndef FATFS_MAX_OPEN_FILES + #define FATFS_MAX_OPEN_FILES 2 +#endif + +// Number of sectors per FAT_BUFFER (min 1) +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +// Max FAT sectors to buffer (min 1) +// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +// Size of cluster chain cache (can be undefined) +// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 +// Improves access speed considerably +//#define FAT_CLUSTER_CACHE_ENTRIES 128 + +// Include support for writing files (1 / 0)? +#ifndef FATFS_INC_WRITE_SUPPORT + #define FATFS_INC_WRITE_SUPPORT 1 +#endif + +// Support long filenames (1 / 0)? +// (if not (0) only 8.3 format is supported) +#ifndef FATFS_INC_LFN_SUPPORT + #define FATFS_INC_LFN_SUPPORT 1 +#endif + +// Support directory listing (1 / 0)? +#ifndef FATFS_DIR_LIST_SUPPORT + #define FATFS_DIR_LIST_SUPPORT 1 +#endif + +// Support time/date (1 / 0)? +#ifndef FATFS_INC_TIME_DATE_SUPPORT + #define FATFS_INC_TIME_DATE_SUPPORT 0 +#endif + +// Include support for formatting disks (1 / 0)? +#ifndef FATFS_INC_FORMAT_SUPPORT + #define FATFS_INC_FORMAT_SUPPORT 0 +#endif + +// Sector size used +#define FAT_SECTOR_SIZE 512 + +// Printf output (directory listing / debug) +#ifndef FAT_PRINTF + void ventoy_syslog_printf(const char *Fmt, ...); + #define FAT_PRINTF(a) ventoy_syslog_printf a +#endif + +// Time/Date support requires time.h +#if FATFS_INC_TIME_DATE_SUPPORT + #include +#endif + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_string.c b/Plugson/src/Lib/fat_io_lib/fat_string.c new file mode 100644 index 00000000..f7206ce7 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_string.c @@ -0,0 +1,514 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_string.h" + +//----------------------------------------------------------------------------- +// fatfs_total_path_levels: Take a filename and path and count the sub levels +// of folders. E.g. C:\folder\file.zip = 1 level +// Acceptable input formats are: +// c:\folder\file.zip +// /dev/etc/samba.conf +// Returns: -1 = Error, 0 or more = Ok +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path) +{ + int levels = 0; + char expectedchar; + + if (!path) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Count levels in path string + while (*path) + { + // Fast forward through actual subdir text to next slash + for (; *path; ) + { + // If slash detected escape from for loop + if (*path == expectedchar) { path++; break; } + path++; + } + + // Increase number of subdirs founds + levels++; + } + + // Subtract the file itself + return levels-1; +} +//----------------------------------------------------------------------------- +// fatfs_get_substring: Get a substring from 'path' which contains the folder +// (or file) at the specified level. +// E.g. C:\folder\file.zip : Level 0 = C:\folder, Level 1 = file.zip +// Returns: -1 = Error, 0 = Ok +//----------------------------------------------------------------------------- +int fatfs_get_substring(char *path, int levelreq, char *output, int max_len) +{ + int i; + int pathlen=0; + int levels=0; + int copypnt=0; + char expectedchar; + + if (!path || max_len <= 0) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Get string length of path + pathlen = (int)strlen (path); + + // Loop through the number of times as characters in 'path' + for (i = 0; i path = C:\folder filename = file.zip +// E.g. C:\file.zip -> path = [blank] filename = file.zip +//----------------------------------------------------------------------------- +int fatfs_split_path(char *full_path, char *path, int max_path, char *filename, int max_filename) +{ + int strindex; + + // Count the levels to the filepath + int levels = fatfs_total_path_levels(full_path); + if (levels == -1) + return -1; + + // Get filename part of string + if (fatfs_get_substring(full_path, levels, filename, max_filename) != 0) + return -1; + + // If root file + if (levels == 0) + path[0] = '\0'; + else + { + strindex = (int)strlen(full_path) - (int)strlen(filename); + if (strindex > max_path) + strindex = max_path; + + memcpy(path, full_path, strindex); + path[strindex-1] = '\0'; + } + + return 0; +} +//----------------------------------------------------------------------------- +// FileString_StrCmpNoCase: Compare two strings case with case sensitivity +//----------------------------------------------------------------------------- +static int FileString_StrCmpNoCase(char *s1, char *s2, int n) +{ + int diff; + char a,b; + + while (n--) + { + a = *s1; + b = *s2; + + // Make lower case if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + if ((b>='A') && (b<='Z')) + b+= 32; + + diff = a - b; + + // If different + if (diff) + return diff; + + // If run out of strings + if ( (*s1 == 0) || (*s2 == 0) ) + break; + + s1++; + s2++; + } + return 0; +} +//----------------------------------------------------------------------------- +// FileString_GetExtension: Get index to extension within filename +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_GetExtension(char *str) +{ + int dotPos = -1; + char *strSrc = str; + + // Find last '.' in string (if at all) + while (*strSrc) + { + if (*strSrc=='.') + dotPos = (int)(strSrc-str); + + strSrc++; + } + + return dotPos; +} +//----------------------------------------------------------------------------- +// FileString_TrimLength: Get length of string excluding trailing spaces +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_TrimLength(char *str, int strLen) +{ + int length = strLen; + char *strSrc = str+strLen-1; + + // Find last non white space + while (strLen != 0) + { + if (*strSrc == ' ') + length = (int)(strSrc - str); + else + break; + + strSrc--; + strLen--; + } + + return length; +} +//----------------------------------------------------------------------------- +// fatfs_compare_names: Compare two filenames (without copying or changing origonals) +// Returns 1 if match, 0 if not +//----------------------------------------------------------------------------- +int fatfs_compare_names(char* strA, char* strB) +{ + char *ext1 = NULL; + char *ext2 = NULL; + int ext1Pos, ext2Pos; + int file1Len, file2Len; + + // Get both files extension + ext1Pos = FileString_GetExtension(strA); + ext2Pos = FileString_GetExtension(strB); + + // NOTE: Extension position can be different for matching + // filename if trailing space are present before it! + // Check that if one has an extension, so does the other + if ((ext1Pos==-1) && (ext2Pos!=-1)) + return 0; + if ((ext2Pos==-1) && (ext1Pos!=-1)) + return 0; + + // If they both have extensions, compare them + if (ext1Pos!=-1) + { + // Set pointer to start of extension + ext1 = strA+ext1Pos+1; + ext2 = strB+ext2Pos+1; + + // Verify that the file extension lengths match! + if (strlen(ext1) != strlen(ext2)) + return 0; + + // If they dont match + if (FileString_StrCmpNoCase(ext1, ext2, (int)strlen(ext1))!=0) + return 0; + + // Filelength is upto extensions + file1Len = ext1Pos; + file2Len = ext2Pos; + } + // No extensions + else + { + // Filelength is actual filelength + file1Len = (int)strlen(strA); + file2Len = (int)strlen(strB); + } + + // Find length without trailing spaces (before ext) + file1Len = FileString_TrimLength(strA, file1Len); + file2Len = FileString_TrimLength(strB, file2Len); + + // Check the file lengths match + if (file1Len!=file2Len) + return 0; + + // Compare main part of filenames + if (FileString_StrCmpNoCase(strA, strB, file1Len)!=0) + return 0; + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_string_ends_with_slash: Does the string end with a slash (\ or /) +//----------------------------------------------------------------------------- +int fatfs_string_ends_with_slash(char *path) +{ + if (path) + { + while (*path) + { + // Last character? + if (!(*(path+1))) + { + if (*path == '\\' || *path == '/') + return 1; + } + + path++; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_get_sfn_display_name: Get display name for SFN entry +//----------------------------------------------------------------------------- +int fatfs_get_sfn_display_name(char* out, char* in) +{ + int len = 0; + while (*in && len <= 11) + { + char a = *in++; + + if (a == ' ') + continue; + // Make lower case if uppercase + else if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_get_extension: Get extension of filename passed in 'filename'. +// Returned extension is always lower case. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_get_extension(char* filename, char* out, int maxlen) +{ + int len = 0; + + // Get files extension offset + int ext_pos = FileString_GetExtension(filename); + + if (ext_pos > 0 && out && maxlen) + { + filename += ext_pos + 1; + + while (*filename && len < (maxlen-1)) + { + char a = *filename++; + + // Make lowercase if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_path_string: Append path & filename to create file path string. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen) +{ + int len = 0; + char last = 0; + char seperator = '/'; + + if (path && filename && out && maxlen > 0) + { + while (*path && len < (maxlen-2)) + { + last = *path++; + if (last == '\\') + seperator = '\\'; + *out++ = last; + len++; + } + + // Add a seperator if trailing one not found + if (last != '\\' && last != '/') + *out++ = seperator; + + while (*filename && len < (maxlen-1)) + { + *out++ = *filename++; + len++; + } + + *out = '\0'; + + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// Test Bench +//----------------------------------------------------------------------------- +#ifdef FAT_STRING_TESTBENCH +void main(void) +{ + char output[255]; + char output2[255]; + + assert(fatfs_total_path_levels("C:\\folder\\file.zip") == 1); + assert(fatfs_total_path_levels("C:\\file.zip") == 0); + assert(fatfs_total_path_levels("C:\\folder\\folder2\\file.zip") == 2); + assert(fatfs_total_path_levels("C:\\") == -1); + assert(fatfs_total_path_levels("") == -1); + assert(fatfs_total_path_levels("/dev/etc/file.zip") == 2); + assert(fatfs_total_path_levels("/dev/file.zip") == 1); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "folder") == 0); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "dev") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "etc") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 2, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_split_path("C:\\folder\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "C:\\folder") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("C:\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(output[0] == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("/dev/etc/file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "/dev/etc") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(FileString_GetExtension("C:\\file.zip") == strlen("C:\\file")); + assert(FileString_GetExtension("C:\\file.zip.ext") == strlen("C:\\file.zip")); + assert(FileString_GetExtension("C:\\file.zip.") == strlen("C:\\file.zip")); + + assert(FileString_TrimLength("C:\\file.zip", strlen("C:\\file.zip")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength("C:\\file.zip ", strlen("C:\\file.zip ")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength(" ", strlen(" ")) == 0); + + assert(fatfs_compare_names("C:\\file.ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file2.ext", "C:\\file.ext") == 0); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file2.ext") == 0); + + assert(fatfs_string_ends_with_slash("C:\\folder") == 0); + assert(fatfs_string_ends_with_slash("C:\\folder\\") == 1); + assert(fatfs_string_ends_with_slash("/path") == 0); + assert(fatfs_string_ends_with_slash("/path/a") == 0); + assert(fatfs_string_ends_with_slash("/path/") == 1); + + assert(fatfs_get_extension("/mypath/file.wav", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.WAV", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.zip", output, 4) == 1); + assert(strcmp(output, "ext") != 0); + + assert(fatfs_create_path_string("/mydir1", "myfile.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir1/myfile.txt") == 0); + assert(fatfs_create_path_string("/mydir2/", "myfile2.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir2/myfile2.txt") == 0); + assert(fatfs_create_path_string("C:\\mydir3", "myfile3.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "C:\\mydir3\\myfile3.txt") == 0); +} +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_string.h b/Plugson/src/Lib/fat_io_lib/fat_string.h new file mode 100644 index 00000000..90ca8e05 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_string.h @@ -0,0 +1,20 @@ +#ifndef __FILESTRING_H__ +#define __FILESTRING_H__ + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path); +int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); +int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); +int fatfs_compare_names(char* strA, char* strB); +int fatfs_string_ends_with_slash(char *path); +int fatfs_get_sfn_display_name(char* out, char* in); +int fatfs_get_extension(char* filename, char* out, int maxlen); +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); + +#ifndef NULL + #define NULL 0 +#endif + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_table.c b/Plugson/src/Lib/fat_io_lib/fat_table.c new file mode 100644 index 00000000..8d05d3bf --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_table.c @@ -0,0 +1,478 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" + +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +#if FAT_BUFFERS < 1 || FAT_BUFFER_SECTORS < 1 + #error "FAT_BUFFERS & FAT_BUFFER_SECTORS must be at least 1" +#endif + +//----------------------------------------------------------------------------- +// FAT Sector Buffer +//----------------------------------------------------------------------------- +#define FAT32_GET_32BIT_WORD(pbuf, location) ( GET_32BIT_WORD(pbuf->ptr, location) ) +#define FAT32_SET_32BIT_WORD(pbuf, location, value) { SET_32BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } +#define FAT16_GET_16BIT_WORD(pbuf, location) ( GET_16BIT_WORD(pbuf->ptr, location) ) +#define FAT16_SET_16BIT_WORD(pbuf, location, value) { SET_16BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } + +//----------------------------------------------------------------------------- +// fatfs_fat_init: +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs) +{ + int i; + + // FAT buffer chain head + fs->fat_buffer_head = NULL; + + for (i=0;ifat_buffers[i].address = FAT32_INVALID_CLUSTER; + fs->fat_buffers[i].dirty = 0; + memset(fs->fat_buffers[i].sector, 0x00, sizeof(fs->fat_buffers[i].sector)); + fs->fat_buffers[i].ptr = NULL; + + // Add to head of queue + fs->fat_buffers[i].next = fs->fat_buffer_head; + fs->fat_buffer_head = &fs->fat_buffers[i]; + } +} +//----------------------------------------------------------------------------- +// fatfs_fat_writeback: Writeback 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +static int fatfs_fat_writeback(struct fatfs *fs, struct fat_buffer *pcur) +{ + if (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + { + if (fs->disk_io.write_media) + { + uint32 sectors = FAT_BUFFER_SECTORS; + uint32 offset = pcur->address - fs->fat_begin_lba; + + // Limit to sectors used for the FAT + if ((offset + FAT_BUFFER_SECTORS) <= fs->fat_sectors) + sectors = FAT_BUFFER_SECTORS; + else + sectors = fs->fat_sectors - offset; + + if (!fs->disk_io.write_media(pcur->address, pcur->sector, sectors)) + return 0; + } + + pcur->dirty = 0; + } + + return 1; + } + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_fat_read_sector: Read a FAT sector +//----------------------------------------------------------------------------- +static struct fat_buffer *fatfs_fat_read_sector(struct fatfs *fs, uint32 sector) +{ + struct fat_buffer *last = NULL; + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Sector within this buffer? + if ((sector >= pcur->address) && (sector < (pcur->address + FAT_BUFFER_SECTORS))) + break; + + // End of list? + if (pcur->next == NULL) + { + // Remove buffer from list + if (last) + last->next = NULL; + // We the first and last buffer in the chain? + else + fs->fat_buffer_head = NULL; + } + + last = pcur; + pcur = pcur->next; + } + + // We found the sector already in FAT buffer chain + if (pcur) + { + pcur->ptr = (uint8 *)(pcur->sector + ((sector - pcur->address) * FAT_SECTOR_SIZE)); + return pcur; + } + + // Else, we removed the last item from the list + pcur = last; + + // Add to start of sector buffer list (now newest sector) + pcur->next = fs->fat_buffer_head; + fs->fat_buffer_head = pcur; + + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + // Address is now new sector + pcur->address = sector; + + // Read next sector + if (!fs->disk_io.read_media(pcur->address, pcur->sector, FAT_BUFFER_SECTORS)) + { + // Read failed, invalidate buffer address + pcur->address = FAT32_INVALID_CLUSTER; + return NULL; + } + + pcur->ptr = pcur->sector; + return pcur; +} +//----------------------------------------------------------------------------- +// fatfs_fat_purge: Purge 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +int fatfs_fat_purge(struct fatfs *fs) +{ + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + pcur = pcur->next; + } + + return 1; +} + +//----------------------------------------------------------------------------- +// General FAT Table Operations +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fatfs_find_next_cluster: Return cluster number of next cluster in chain by +// reading FAT table and traversing it. Return 0xffffffff for end of chain. +//----------------------------------------------------------------------------- +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + struct fat_buffer *pbuf; + + // Why is '..' labelled with cluster 0 when it should be 2 ?? + if (current_cluster == 0) + current_cluster = 2; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return (FAT32_LAST_CLUSTER); + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + + // If end of chain found + if (nextcluster >= 0xFFF8 && nextcluster <= 0xFFFF) + return (FAT32_LAST_CLUSTER); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + + // If end of chain found + if (nextcluster >= 0x0FFFFFF8 && nextcluster <= 0x0FFFFFFF) + return (FAT32_LAST_CLUSTER); + } + + // Else return next cluster + return (nextcluster); +} +//----------------------------------------------------------------------------- +// fatfs_set_fs_info_next_free_cluster: Write the next free cluster to the FSINFO table +//----------------------------------------------------------------------------- +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue) +{ + if (fs->fat_type == FAT_TYPE_16) + ; + else + { + // Load sector to change it + struct fat_buffer *pbuf = fatfs_fat_read_sector(fs, fs->lba_begin+fs->fs_info_sector); + if (!pbuf) + return ; + + // Change + FAT32_SET_32BIT_WORD(pbuf, 492, newValue); + fs->next_free_cluster = newValue; + + // Write back FSINFO sector to disk + if (fs->disk_io.write_media) + fs->disk_io.write_media(pbuf->address, pbuf->sector, 1); + + // Invalidate cache entry + pbuf->address = FAT32_INVALID_CLUSTER; + pbuf->dirty = 0; + } +} +//----------------------------------------------------------------------------- +// fatfs_find_blank_cluster: Find a free cluster entry by reading the FAT +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + uint32 current_cluster = start_cluster; + struct fat_buffer *pbuf; + + do + { + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + if ( fat_sector_offset < fs->fat_sectors) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + } + + if (nextcluster !=0 ) + current_cluster++; + } + else + // Otherwise, run out of FAT sectors to check... + return 0; + } + while (nextcluster != 0x0); + + // Found blank entry + *free_cluster = current_cluster; + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_set_cluster: Set a cluster link in the chain. NOTE: Immediate +// write (slow). +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster) +{ + struct fat_buffer *pbuf; + uint32 fat_sector_offset, position; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = cluster / 256; + else + fat_sector_offset = cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 16 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 256)) * 2; + + // Write Next Clusters value to Sector Buffer + FAT16_SET_16BIT_WORD(pbuf, (uint16)position, ((uint16)next_cluster)); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 128)) * 4; + + // Write Next Clusters value to Sector Buffer + FAT32_SET_32BIT_WORD(pbuf, (uint16)position, next_cluster); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_free_cluster_chain: Follow a chain marking each element as free +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster) +{ + uint32 last_cluster; + uint32 next_cluster = start_cluster; + + // Loop until end of chain + while ( (next_cluster != FAT32_LAST_CLUSTER) && (next_cluster != 0x00000000) ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + + // Clear last link + fatfs_fat_set_cluster(fs, last_cluster, 0x00000000); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_add_cluster_to_chain: Follow a chain marking and then add a new entry +// to the current tail. +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry) +{ + uint32 last_cluster = FAT32_LAST_CLUSTER; + uint32 next_cluster = start_cluster; + + if (start_cluster == FAT32_LAST_CLUSTER) + return 0; + + // Loop until end of chain + while ( next_cluster != FAT32_LAST_CLUSTER ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + if (!next_cluster) + return 0; + } + + // Add link in for new cluster + fatfs_fat_set_cluster(fs, last_cluster, newEntry); + + // Mark new cluster as end of chain + fatfs_fat_set_cluster(fs, newEntry, FAT32_LAST_CLUSTER); + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_count_free_clusters: +//----------------------------------------------------------------------------- +uint32 fatfs_count_free_clusters(struct fatfs *fs) +{ + uint32 i,j; + uint32 count = 0; + struct fat_buffer *pbuf; + + for (i = 0; i < fs->fat_sectors; i++) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba + i); + if (!pbuf) + break; + + for (j = 0; j < FAT_SECTOR_SIZE; ) + { + if (fs->fat_type == FAT_TYPE_16) + { + if (FAT16_GET_16BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 2; + } + else + { + if (FAT32_GET_32BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 4; + } + } + } + + return count; +} diff --git a/Plugson/src/Lib/fat_io_lib/fat_table.h b/Plugson/src/Lib/fat_io_lib/fat_table.h new file mode 100644 index 00000000..ead75f32 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_table.h @@ -0,0 +1,20 @@ +#ifndef __FAT_TABLE_H__ +#define __FAT_TABLE_H__ + +#include "fat_opts.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs); +int fatfs_fat_purge(struct fatfs *fs); +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); +uint32 fatfs_count_free_clusters(struct fatfs *fs); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_types.h b/Plugson/src/Lib/fat_io_lib/fat_types.h new file mode 100644 index 00000000..5e2cca8a --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_types.h @@ -0,0 +1,69 @@ +#ifndef __FAT_TYPES_H__ +#define __FAT_TYPES_H__ + +// Detect 64-bit compilation on GCC +#if defined(__GNUC__) && defined(__SIZEOF_LONG__) + #if __SIZEOF_LONG__ == 8 + #define FATFS_DEF_UINT32_AS_INT + #endif +#endif + +//------------------------------------------------------------- +// System specific types +//------------------------------------------------------------- +#ifndef FATFS_NO_DEF_TYPES + typedef unsigned char uint8; + typedef unsigned short uint16; + + // If compiling on a 64-bit machine, use int as 32-bits + #ifdef FATFS_DEF_UINT32_AS_INT + typedef unsigned int uint32; + // Else for 32-bit machines & embedded systems, use long... + #else + typedef unsigned long uint32; + #endif +#endif + +#ifndef NULL + #define NULL 0 +#endif + +//------------------------------------------------------------- +// Endian Macros +//------------------------------------------------------------- +// FAT is little endian so big endian systems need to swap words + +// Little Endian - No swap required +#if FATFS_IS_LITTLE_ENDIAN == 1 + + #define FAT_HTONS(n) (n) + #define FAT_HTONL(n) (n) + +// Big Endian - Swap required +#else + + #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) + #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ + ((((uint32)(n) & 0xFF00)) << 8) | \ + ((((uint32)(n) & 0xFF0000)) >> 8) | \ + ((((uint32)(n) & 0xFF000000)) >> 24)) + +#endif + +//------------------------------------------------------------- +// Structure Packing Compile Options +//------------------------------------------------------------- +#ifdef __GNUC__ + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED __attribute__ ((packed)) +#else + // Other compilers may require other methods of packing structures + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED +#endif + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_write.c b/Plugson/src/Lib/fat_io_lib/fat_write.c new file mode 100644 index 00000000..0718cb13 --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_write.c @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +#if FATFS_INC_WRITE_SUPPORT +//----------------------------------------------------------------------------- +// fatfs_add_free_space: Allocate another cluster of free space to the end +// of a files cluster chain. +//----------------------------------------------------------------------------- +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters) +{ + uint32 i; + uint32 nextcluster; + uint32 start = *startCluster; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + for (i=0;irootdir_first_cluster, &nextcluster)) + { + // Point last to this + fatfs_fat_set_cluster(fs, start, nextcluster); + + // Point this to end of file + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + + // Adjust argument reference + start = nextcluster; + if (i == 0) + *startCluster = nextcluster; + } + else + return 0; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_allocate_free_space: Add an ammount of free space to a file either from +// 'startCluster' if newFile = false, or allocating a new start to the chain if +// newFile = true. +//----------------------------------------------------------------------------- +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size) +{ + uint32 clusterSize; + uint32 clusterCount; + uint32 nextcluster; + + if (size==0) + return 0; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + // Work out size and clusters + clusterSize = fs->sectors_per_cluster * FAT_SECTOR_SIZE; + clusterCount = (size / clusterSize); + + // If any left over + if (size-(clusterSize*clusterCount)) + clusterCount++; + + // Allocated first link in the chain if a new file + if (newFile) + { + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &nextcluster)) + return 0; + + // If this is all that is needed then all done + if (clusterCount==1) + { + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + *startCluster = nextcluster; + return 1; + } + } + // Allocate from end of current chain (startCluster is end of chain) + else + nextcluster = *startCluster; + + if (!fatfs_add_free_space(fs, &nextcluster, clusterCount)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_find_free_dir_offset: Find a free space in the directory for a new entry +// which takes up 'entryCount' blocks (or allocate some more) +//----------------------------------------------------------------------------- +static int fatfs_find_free_dir_offset(struct fatfs *fs, uint32 dirCluster, int entryCount, uint32 *pSector, uint8 *pOffset) +{ + struct fat_dir_entry *directoryEntry; + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + int possible_spaces = 0; + int start_recorded = 0; + + // No entries required? + if (entryCount == 0) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + + // LFN Entry + if (fatfs_entry_lfn_text(directoryEntry)) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the count in-case the file turns + // out to be deleted... + possible_spaces++; + } + // SFN Entry + else + { + // Has file been deleted? + if (fs->currentsector.sector[recordoffset] == FILE_HEADER_DELETED) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + + // Else continue counting until we find a valid entry! + } + // Is the file entry empty? + else if (fs->currentsector.sector[recordoffset] == FILE_HEADER_BLANK) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the blank entries count + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + } + // File entry is valid + else + { + // Reset all flags + possible_spaces = 0; + start_recorded = 0; + } + } + } // End of for + } // End of if + // Run out of free space in the directory, allocate some more + else + { + uint32 newCluster; + + // Get a new cluster for directory + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &newCluster)) + return 0; + + // Add cluster to end of directory tree + if (!fatfs_fat_add_cluster_to_chain(fs, dirCluster, newCluster)) + return 0; + + // Erase new directory cluster + memset(fs->currentsector.sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;isectors_per_cluster;i++) + { + if (!fatfs_write_sector(fs, newCluster, i, 0)) + return 0; + } + + // If non of the name fitted on previous sectors + if (!start_recorded) + { + // Store start + *pSector = (x-1); + *pOffset = 0; + start_recorded = 1; + } + + return 1; + } + } // End of while loop + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_add_file_entry: Add a directory entry to a location found by FindFreeOffset +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + uint32 x=0; + int entryCount; + struct fat_dir_entry shortEntry; + int dirtySector = 0; + + uint32 dirSector = 0; + uint8 dirOffset = 0; + int foundEnd = 0; + + uint8 checksum; + uint8 *pSname; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + +#if FATFS_INC_LFN_SUPPORT + // How many LFN entries are required? + // NOTE: We always request one LFN even if it would fit in a SFN! + entryCount = fatfs_lfn_entries_required(filename); + if (!entryCount) + return 0; +#else + entryCount = 0; +#endif + + // Find space in the directory for this filename (or allocate some more) + // NOTE: We need to find space for at least the LFN + SFN (or just the SFN if LFNs not supported). + if (!fatfs_find_free_dir_offset(fs, dirCluster, entryCount + 1, &dirSector, &dirOffset)) + return 0; + + // Generate checksum of short filename + pSname = (uint8*)shortfilename; + checksum = 0; + for (i=11; i!=0; i--) checksum = ((checksum & 1) ? 0x80 : 0) + (checksum >> 1) + *pSname++; + + // Start from current sector where space was found! + x = dirSector; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // If the start position for the entry has been found + if (foundEnd==0) + if ( (dirSector==(x-1)) && (dirOffset==item) ) + foundEnd = 1; + + // Start adding filename + if (foundEnd) + { + if (entryCount==0) + { + // Short filename + fatfs_sfn_create_entry(shortfilename, size, startCluster, &shortEntry, dir); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update create, access & modify time & date + fatfs_update_timestamps(&shortEntry, 1, 1, 1); +#endif + + memcpy(&fs->currentsector.sector[recordoffset], &shortEntry, sizeof(shortEntry)); + + // Writeback + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } +#if FATFS_INC_LFN_SUPPORT + else + { + entryCount--; + + // Copy entry to directory buffer + fatfs_filename_to_lfn(filename, &fs->currentsector.sector[recordoffset], entryCount, checksum); + dirtySector = 1; + } +#endif + } + } // End of if + + // Write back to disk before loading another sector + if (dirtySector) + { + if (!fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1)) + return 0; + + dirtySector = 0; + } + } + else + return 0; + } // End of while loop + + return 0; +} +#endif diff --git a/Plugson/src/Lib/fat_io_lib/fat_write.h b/Plugson/src/Lib/fat_io_lib/fat_write.h new file mode 100644 index 00000000..5558a86e --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/fat_write.h @@ -0,0 +1,14 @@ +#ifndef __FAT_WRITE_H__ +#define __FAT_WRITE_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); + +#endif diff --git a/Plugson/src/Lib/fat_io_lib/version.txt b/Plugson/src/Lib/fat_io_lib/version.txt new file mode 100644 index 00000000..5a00a98c --- /dev/null +++ b/Plugson/src/Lib/fat_io_lib/version.txt @@ -0,0 +1 @@ +2.6.11 diff --git a/Plugson/src/Lib/libhttp/include/civetweb.c b/Plugson/src/Lib/libhttp/include/civetweb.c new file mode 100644 index 00000000..ef77700b --- /dev/null +++ b/Plugson/src/Lib/libhttp/include/civetweb.c @@ -0,0 +1,13159 @@ +/* Copyright (c) 2013-2016 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#if defined(_WIN32) +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* Disable deprecation warning in VS2005 */ +#endif +#ifndef _WIN32_WINNT /* defined for tdm-gcc so we can use getnameinfo */ +#define _WIN32_WINNT 0x0501 +#endif +#else +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE /* for setgroups() */ +#endif +#if defined(__linux__) && !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 /* For flockfile() on Linux */ +#endif +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE /* For fseeko(), ftello() */ +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 /* Use 64-bit file offsets by default */ +#endif +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS /* wants this for C++ */ +#endif +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS /* C++ wants that for INT64_MAX */ +#endif +#ifdef __sun +#define __EXTENSIONS__ /* to expose flockfile and friends in stdio.h */ +#define __inline inline /* not recognized on older compiler versions */ +#endif +#endif + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) +#define USE_TIMERS +#endif + +#if defined(_MSC_VER) +/* 'type cast' : conversion from 'int' to 'HANDLE' of greater size */ +#pragma warning(disable : 4306) +/* conditional expression is constant: introduced by FD_SET(..) */ +#pragma warning(disable : 4127) +/* non-constant aggregate initializer: issued due to missing C99 support */ +#pragma warning(disable : 4204) +/* padding added after data member */ +#pragma warning(disable : 4820) +/* not defined as a preprocessor macro, replacing with '0' for '#if/#elif' */ +#pragma warning(disable : 4668) +/* no function prototype given: converting '()' to '(void)' */ +#pragma warning(disable : 4255) +/* function has been selected for automatic inline expansion */ +#pragma warning(disable : 4711) +#endif + + +/* This code uses static_assert to check some conditions. + * Unfortunately some compilers still do not support it, so we have a + * replacement function here. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1600) +#define mg_static_assert static_assert +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define mg_static_assert static_assert +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define mg_static_assert _Static_assert +#else +char static_assert_replacement[1]; +#define mg_static_assert(cond, txt) \ + extern char static_assert_replacement[(cond) ? 1 : -1] +#endif + +mg_static_assert(sizeof(int) == 4 || sizeof(int) == 8, + "int data type size check"); +mg_static_assert(sizeof(void *) == 4 || sizeof(void *) == 8, + "pointer data type size check"); +mg_static_assert(sizeof(void *) >= sizeof(int), "data type size check"); +/* mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t data + * type size check"); */ + +/* DTL -- including winsock2.h works better if lean and mean */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#if defined(__SYMBIAN32__) +#define NO_SSL /* SSL is not supported */ +#define NO_CGI /* CGI is not supported */ +#define PATH_MAX FILENAME_MAX +#endif /* __SYMBIAN32__ */ + + +/* Include the header file here, so the CivetWeb interface is defined for the + * entire implementation, including the following forward definitions. */ +#include "civetweb.h" + + +#ifndef IGNORE_UNUSED_RESULT +#define IGNORE_UNUSED_RESULT(a) ((void)((a) && 1)) +#endif + +#ifndef _WIN32_WCE /* Some ANSI #includes are not available on Windows CE */ +#include +#include +#include +#include +#include +#endif /* !_WIN32_WCE */ + +#ifdef __MACH__ + +#define CLOCK_MONOTONIC (1) +#define CLOCK_REALTIME (2) + +#include +#include +#include +#include +#include + + +/* clock_gettime is not implemented on OSX */ +int clock_gettime(int clk_id, struct timespec *t); + +int +clock_gettime(int clk_id, struct timespec *t) +{ + memset(t, 0, sizeof(*t)); + if (clk_id == CLOCK_REALTIME) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) { + return rv; + } + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; + + } else if (clk_id == CLOCK_MONOTONIC) { + static uint64_t clock_start_time = 0; + static mach_timebase_info_data_t timebase_ifo = {0, 0}; + + uint64_t now = mach_absolute_time(); + + if (clock_start_time == 0) { + kern_return_t mach_status = mach_timebase_info(&timebase_ifo); +#if defined(DEBUG) + assert(mach_status == KERN_SUCCESS); +#else + /* appease "unused variable" warning for release builds */ + (void)mach_status; +#endif + clock_start_time = now; + } + + now = (uint64_t)((double)(now - clock_start_time) + * (double)timebase_ifo.numer + / (double)timebase_ifo.denom); + + t->tv_sec = now / 1000000000; + t->tv_nsec = now % 1000000000; + return 0; + } + return -1; /* EINVAL - Clock ID is unknown */ +} +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifndef MAX_WORKER_THREADS +#define MAX_WORKER_THREADS (1024 * 64) +#endif +#ifndef SOCKET_TIMEOUT_QUANTUM +#define SOCKET_TIMEOUT_QUANTUM (10000) +#endif + +mg_static_assert(MAX_WORKER_THREADS >= 1, + "worker threads must be a positive number"); + +#if defined(_WIN32) \ + && !defined(__SYMBIAN32__) /* WINDOWS / UNIX include block */ +#include +#include /* DTL add for SO_EXCLUSIVE */ +#include + +typedef const char *SOCK_OPT_TYPE; + +#if !defined(PATH_MAX) +#define PATH_MAX (MAX_PATH) +#endif + +#if !defined(PATH_MAX) +#define PATH_MAX (4096) +#endif + +mg_static_assert(PATH_MAX >= 1, "path length must be a positive number"); + +#ifndef _IN_PORT_T +#ifndef in_port_t +#define in_port_t u_short +#endif +#endif + +#ifndef _WIN32_WCE +#include +#include +#include +#else /* _WIN32_WCE */ +#define NO_CGI /* WinCE has no pipes */ + +typedef long off_t; + +#define errno ((int)(GetLastError())) +#define strerror(x) (_ultoa(x, (char *)_alloca(sizeof(x) * 3), 10)) +#endif /* _WIN32_WCE */ + +#define MAKEUQUAD(lo, hi) \ + ((uint64_t)(((uint32_t)(lo)) | ((uint64_t)((uint32_t)(hi))) << 32)) +#define RATE_DIFF (10000000) /* 100 nsecs */ +#define EPOCH_DIFF (MAKEUQUAD(0xd53e8000, 0x019db1de)) +#define SYS2UNIX_TIME(lo, hi) \ + ((time_t)((MAKEUQUAD((lo), (hi)) - EPOCH_DIFF) / RATE_DIFF)) + +/* Visual Studio 6 does not know __func__ or __FUNCTION__ + * The rest of MS compilers use __FUNCTION__, not C99 __func__ + * Also use _strtoui64 on modern M$ compilers */ +#if defined(_MSC_VER) +#if (_MSC_VER < 1300) +#define STRX(x) #x +#define STR(x) STRX(x) +#define __func__ __FILE__ ":" STR(__LINE__) +#define strtoull(x, y, z) ((unsigned __int64)_atoi64(x)) +#define strtoll(x, y, z) (_atoi64(x)) +#else +#define __func__ __FUNCTION__ +#define strtoull(x, y, z) (_strtoui64(x, y, z)) +#define strtoll(x, y, z) (_strtoi64(x, y, z)) +#endif +#endif /* _MSC_VER */ + +#define ERRNO ((int)(GetLastError())) +#define NO_SOCKLEN_T + +#if defined(_WIN64) || defined(__MINGW64__) +#define SSL_LIB "ssleay64.dll" +#define CRYPTO_LIB "libeay64.dll" +#else +#define SSL_LIB "ssleay32.dll" +#define CRYPTO_LIB "libeay32.dll" +#endif + +#define O_NONBLOCK (0) +#ifndef W_OK +#define W_OK (2) /* http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx */ +#endif +#if !defined(EWOULDBLOCK) +#define EWOULDBLOCK WSAEWOULDBLOCK +#endif /* !EWOULDBLOCK */ +#define _POSIX_ +#define INT64_FMT "I64d" +#define UINT64_FMT "I64u" + +#define WINCDECL __cdecl +#define SHUT_RD (0) +#define SHUT_WR (1) +#define SHUT_BOTH (2) +#define vsnprintf_impl _vsnprintf +#define access _access +#define mg_sleep(x) (Sleep(x)) + +#define pipe(x) _pipe(x, MG_BUF_LEN, _O_BINARY) +#ifndef popen +#define popen(x, y) (_popen(x, y)) +#endif +#ifndef pclose +#define pclose(x) (_pclose(x)) +#endif +#define close(x) (_close(x)) +#define dlsym(x, y) (GetProcAddress((HINSTANCE)(x), (y))) +#define RTLD_LAZY (0) +#define fseeko(x, y, z) (_lseeki64(_fileno(x), (y), (z)) == -1 ? -1 : 0) +#define fdopen(x, y) (_fdopen((x), (y))) +#define write(x, y, z) (_write((x), (y), (unsigned)z)) +#define read(x, y, z) (_read((x), (y), (unsigned)z)) +#define flockfile(x) (EnterCriticalSection(&global_log_file_lock)) +#define funlockfile(x) (LeaveCriticalSection(&global_log_file_lock)) +#define sleep(x) (Sleep((x)*1000)) +#define rmdir(x) (_rmdir(x)) +#define timegm(x) (_mkgmtime(x)) + +#if !defined(fileno) +#define fileno(x) (_fileno(x)) +#endif /* !fileno MINGW #defines fileno */ + +typedef HANDLE pthread_mutex_t; +typedef DWORD pthread_key_t; +typedef HANDLE pthread_t; +typedef struct { + CRITICAL_SECTION threadIdSec; + int waitingthreadcount; /* The number of threads queued. */ + pthread_t *waitingthreadhdls; /* The thread handles. */ +} pthread_cond_t; + +#ifndef __clockid_t_defined +typedef DWORD clockid_t; +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC (1) +#endif +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME (2) +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) +#define _TIMESPEC_DEFINED +#endif +#ifndef _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +#define pid_t HANDLE /* MINGW typedefs pid_t to int. Using #define here. */ + +static int pthread_mutex_lock(pthread_mutex_t *); +static int pthread_mutex_unlock(pthread_mutex_t *); +static void path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len); +struct file; +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p); + + +#if defined(HAVE_STDINT) +#include +#else +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +#define INT64_MAX (9223372036854775807) +#endif /* HAVE_STDINT */ + +/* POSIX dirent interface */ +struct dirent { + char d_name[PATH_MAX]; +}; + +typedef struct DIR { + HANDLE handle; + WIN32_FIND_DATAW info; + struct dirent result; +} DIR; + +#if defined(_WIN32) && !defined(POLLIN) +#ifndef HAVE_POLL +struct pollfd { + SOCKET fd; + short events; + short revents; +}; +#define POLLIN (0x0300) +#endif +#endif + +/* Mark required libraries */ +#if defined(_MSC_VER) +#pragma comment(lib, "Ws2_32.lib") +#endif + +#else /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef const void *SOCK_OPT_TYPE; + +#if defined(ANDROID) +typedef unsigned short int in_port_t; +#endif + +#include +#include +#include +#include +#define vsnprintf_impl vsnprintf + +#if !defined(NO_SSL_DL) && !defined(NO_SSL) +#include +#endif +#include +#if defined(__MACH__) +#define SSL_LIB "libssl.dylib" +#define CRYPTO_LIB "libcrypto.dylib" +#else +#if !defined(SSL_LIB) +#define SSL_LIB "libssl.so" +#endif +#if !defined(CRYPTO_LIB) +#define CRYPTO_LIB "libcrypto.so" +#endif +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif /* O_BINARY */ +#define closesocket(a) (close(a)) +#define mg_mkdir(conn, path, mode) (mkdir(path, mode)) +#define mg_remove(conn, x) (remove(x)) +#define mg_sleep(x) (usleep((x)*1000)) +#define mg_opendir(conn, x) (opendir(x)) +#define mg_closedir(x) (closedir(x)) +#define mg_readdir(x) (readdir(x)) +#define ERRNO (errno) +#define INVALID_SOCKET (-1) +#define INT64_FMT PRId64 +#define UINT64_FMT PRIu64 +typedef int SOCKET; +#define WINCDECL + +#if defined(__hpux) +/* HPUX 11 does not have monotonic, fall back to realtime */ +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC CLOCK_REALTIME +#endif + +/* HPUX defines socklen_t incorrectly as size_t which is 64bit on + * Itanium. Without defining _XOPEN_SOURCE or _XOPEN_SOURCE_EXTENDED + * the prototypes use int* rather than socklen_t* which matches the + * actual library expectation. When called with the wrong size arg + * accept() returns a zero client inet addr and check_acl() always + * fails. Since socklen_t is widely used below, just force replace + * their typedef with int. - DTL + */ +#define socklen_t int +#endif /* hpux */ + +#endif /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +/* va_copy should always be a macro, C99 and C++11 - DTL */ +#ifndef va_copy +#define va_copy(x, y) ((x) = (y)) +#endif + +#ifdef _WIN32 +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static CRITICAL_SECTION global_log_file_lock; +static DWORD +pthread_self(void) +{ + return GetCurrentThreadId(); +} + + +static int +pthread_key_create( + pthread_key_t *key, + void (*_ignored)(void *) /* destructor not supported for Windows */ + ) +{ + (void)_ignored; + + if ((key != 0)) { + *key = TlsAlloc(); + return (*key != TLS_OUT_OF_INDEXES) ? 0 : -1; + } + return -2; +} + + +static int +pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : 1; +} + + +static int +pthread_setspecific(pthread_key_t key, void *value) +{ + return TlsSetValue(key, value) ? 0 : 1; +} + + +static void * +pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +static struct pthread_mutex_undefined_struct *pthread_mutex_attr = NULL; +#else +static pthread_mutexattr_t pthread_mutex_attr; +#endif /* _WIN32 */ + + +#define PASSWORDS_FILE_NAME ".htpasswd" +#define CGI_ENVIRONMENT_SIZE (4096) +#define MAX_CGI_ENVIR_VARS (256) +#define MG_BUF_LEN (8192) + +#ifndef MAX_REQUEST_SIZE +#define MAX_REQUEST_SIZE (16384) +#endif + +mg_static_assert(MAX_REQUEST_SIZE >= 256, + "request size length must be a positive number"); + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + +#if !defined(DEBUG_TRACE) +#if defined(DEBUG) + + +static void DEBUG_TRACE_FUNC(const char *func, + unsigned line, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +DEBUG_TRACE_FUNC(const char *func, unsigned line, const char *fmt, ...) +{ + va_list args; + flockfile(stdout); + printf("*** %lu.%p.%s.%u: ", + (unsigned long)time(NULL), + (void *)pthread_self(), + func, + line); + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + putchar('\n'); + fflush(stdout); + funlockfile(stdout); +} + +#define DEBUG_TRACE(fmt, ...) \ + DEBUG_TRACE_FUNC(__func__, __LINE__, fmt, __VA_ARGS__) + +#else +#define DEBUG_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif /* DEBUG */ +#endif /* DEBUG_TRACE */ + +#if defined(MEMORY_DEBUGGING) +unsigned long mg_memory_debug_blockCount = 0; +unsigned long mg_memory_debug_totalMemUsed = 0; + + +static void * +mg_malloc_ex(size_t size, const char *file, unsigned line) +{ + void *data = malloc(size + sizeof(size_t)); + void *memory = 0; + char mallocStr[256]; + + if (data) { + *(size_t *)data = size; + mg_memory_debug_totalMemUsed += size; + mg_memory_debug_blockCount++; + memory = (void *)(((char *)data) + sizeof(size_t)); + } + + sprintf(mallocStr, + "MEM: %p %5lu alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + return memory; +} + + +static void * +mg_calloc_ex(size_t count, size_t size, const char *file, unsigned line) +{ + void *data = mg_malloc_ex(size * count, file, line); + if (data) { + memset(data, 0, size); + } + return data; +} + + +static void +mg_free_ex(void *memory, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data = (void *)(((char *)memory) - sizeof(size_t)); + size_t size; + + if (memory) { + size = *(size_t *)data; + mg_memory_debug_totalMemUsed -= size; + mg_memory_debug_blockCount--; + sprintf(mallocStr, + "MEM: %p %5lu free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + free(data); + } +} + + +static void * +mg_realloc_ex(void *memory, size_t newsize, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data; + void *_realloc; + size_t oldsize; + + if (newsize) { + if (memory) { + data = (void *)(((char *)memory) - sizeof(size_t)); + oldsize = *(size_t *)data; + _realloc = realloc(data, newsize + sizeof(size_t)); + if (_realloc) { + data = _realloc; + mg_memory_debug_totalMemUsed -= oldsize; + sprintf(mallocStr, + "MEM: %p %5lu r-free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)oldsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + mg_memory_debug_totalMemUsed += newsize; + sprintf(mallocStr, + "MEM: %p %5lu r-alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)newsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + *(size_t *)data = newsize; + data = (void *)(((char *)data) + sizeof(size_t)); + } else { +#if defined(_WIN32) + OutputDebugStringA("MEM: realloc failed\n"); +#else + DEBUG_TRACE("%s", "MEM: realloc failed\n"); +#endif + return _realloc; + } + } else { + data = mg_malloc_ex(newsize, file, line); + } + } else { + data = 0; + mg_free_ex(memory, file, line); + } + + return data; +} + +#define mg_malloc(a) mg_malloc_ex(a, __FILE__, __LINE__) +#define mg_calloc(a, b) mg_calloc_ex(a, b, __FILE__, __LINE__) +#define mg_realloc(a, b) mg_realloc_ex(a, b, __FILE__, __LINE__) +#define mg_free(a) mg_free_ex(a, __FILE__, __LINE__) + +#else + +static __inline void * +mg_malloc(size_t a) +{ + return malloc(a); +} + +static __inline void * +mg_calloc(size_t a, size_t b) +{ + return calloc(a, b); +} + +static __inline void * +mg_realloc(void *a, size_t b) +{ + return realloc(a, b); +} + +static __inline void +mg_free(void *a) +{ + free(a); +} + +#endif + + +static void mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap); + +static void mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(5, 6); + +/* This following lines are just meant as a reminder to use the mg-functions + * for memory management */ +#ifdef malloc +#undef malloc +#endif +#ifdef calloc +#undef calloc +#endif +#ifdef realloc +#undef realloc +#endif +#ifdef free +#undef free +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsnprintf +#undef vsnprintf +#endif +#define malloc DO_NOT_USE_THIS_FUNCTION__USE_mg_malloc +#define calloc DO_NOT_USE_THIS_FUNCTION__USE_mg_calloc +#define realloc DO_NOT_USE_THIS_FUNCTION__USE_mg_realloc +#define free DO_NOT_USE_THIS_FUNCTION__USE_mg_free +#define snprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_snprintf +#ifdef _WIN32 /* vsnprintf must not be used in any system, * \ + * but this define only works well for Windows. */ +#define vsnprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_vsnprintf +#endif + +#define MD5_STATIC static +#include "md5.inl" + +/* Darwin prior to 7.0 and Win32 do not have socklen_t */ +#ifdef NO_SOCKLEN_T +typedef int socklen_t; +#endif /* NO_SOCKLEN_T */ +#define _DARWIN_UNLIMITED_SELECT + +#define IP_ADDR_STR_LEN (50) /* IPv6 hex string is 46 chars */ + +#if !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL (0) +#endif + +#if !defined(SOMAXCONN) +#define SOMAXCONN (100) +#endif + +/* Size of the accepted socket queue */ +#if !defined(MGSQLEN) +#define MGSQLEN (20) +#endif + +#if defined(NO_SSL_DL) +#include +#include +#include +#include +#include +#else +/* SSL loaded dynamically from DLL. + * I put the prototypes here to be independent from OpenSSL source + * installation. */ + +typedef struct ssl_st SSL; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_ctx_st SSL_CTX; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +#define SSL_CTRL_OPTIONS (32) +#define SSL_CTRL_CLEAR_OPTIONS (77) +#define SSL_CTRL_SET_ECDH_AUTO (94) + +#define SSL_VERIFY_NONE (0) +#define SSL_VERIFY_PEER (1) +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2) +#define SSL_VERIFY_CLIENT_ONCE (4) +#define SSL_OP_ALL ((long)(0x80000BFFUL)) +#define SSL_OP_NO_SSLv2 (0x01000000L) +#define SSL_OP_NO_SSLv3 (0x02000000L) +#define SSL_OP_NO_TLSv1 (0x04000000L) +#define SSL_OP_NO_TLSv1_2 (0x08000000L) +#define SSL_OP_NO_TLSv1_1 (0x10000000L) +#define SSL_OP_SINGLE_DH_USE (0x00100000L) + +struct ssl_func { + const char *name; /* SSL function name */ + void (*ptr)(void); /* Function pointer */ +}; + +#define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr) +#define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr) +#define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr) +#define SSL_read (*(int (*)(SSL *, void *, int))ssl_sw[3].ptr) +#define SSL_write (*(int (*)(SSL *, const void *, int))ssl_sw[4].ptr) +#define SSL_get_error (*(int (*)(SSL *, int))ssl_sw[5].ptr) +#define SSL_set_fd (*(int (*)(SSL *, SOCKET))ssl_sw[6].ptr) +#define SSL_new (*(SSL * (*)(SSL_CTX *))ssl_sw[7].ptr) +#define SSL_CTX_new (*(SSL_CTX * (*)(SSL_METHOD *))ssl_sw[8].ptr) +#define SSLv23_server_method (*(SSL_METHOD * (*)(void))ssl_sw[9].ptr) +#define SSL_library_init (*(int (*)(void))ssl_sw[10].ptr) +#define SSL_CTX_use_PrivateKey_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[11].ptr) +#define SSL_CTX_use_certificate_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[12].ptr) +#define SSL_CTX_set_default_passwd_cb \ + (*(void (*)(SSL_CTX *, mg_callback_t))ssl_sw[13].ptr) +#define SSL_CTX_free (*(void (*)(SSL_CTX *))ssl_sw[14].ptr) +#define SSL_load_error_strings (*(void (*)(void))ssl_sw[15].ptr) +#define SSL_CTX_use_certificate_chain_file \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[16].ptr) +#define SSLv23_client_method (*(SSL_METHOD * (*)(void))ssl_sw[17].ptr) +#define SSL_pending (*(int (*)(SSL *))ssl_sw[18].ptr) +#define SSL_CTX_set_verify \ + (*(void (*)(SSL_CTX *, \ + int, \ + int (*verify_callback)(int, X509_STORE_CTX *)))ssl_sw[19].ptr) +#define SSL_shutdown (*(int (*)(SSL *))ssl_sw[20].ptr) +#define SSL_CTX_load_verify_locations \ + (*(int (*)(SSL_CTX *, const char *, const char *))ssl_sw[21].ptr) +#define SSL_CTX_set_default_verify_paths (*(int (*)(SSL_CTX *))ssl_sw[22].ptr) +#define SSL_CTX_set_verify_depth (*(void (*)(SSL_CTX *, int))ssl_sw[23].ptr) +#define SSL_get_peer_certificate (*(X509 * (*)(SSL *))ssl_sw[24].ptr) +#define SSL_get_version (*(const char *(*)(SSL *))ssl_sw[25].ptr) +#define SSL_get_current_cipher (*(SSL_CIPHER * (*)(SSL *))ssl_sw[26].ptr) +#define SSL_CIPHER_get_name \ + (*(const char *(*)(const SSL_CIPHER *))ssl_sw[27].ptr) +#define SSL_CTX_check_private_key (*(int (*)(SSL_CTX *))ssl_sw[28].ptr) +#define SSL_CTX_set_session_id_context \ + (*(int (*)(SSL_CTX *, const unsigned char *, unsigned int))ssl_sw[29].ptr) +#define SSL_CTX_ctrl (*(long (*)(SSL_CTX *, int, long, void *))ssl_sw[30].ptr) +#define SSL_CTX_set_cipher_list \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[31].ptr) +#define SSL_CTX_set_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_OPTIONS, (op), NULL) +#define SSL_CTX_clear_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_OPTIONS, (op), NULL) +#define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_ECDH_AUTO, onoff, NULL) + +#define CRYPTO_num_locks (*(int (*)(void))crypto_sw[0].ptr) +#define CRYPTO_set_locking_callback \ + (*(void (*)(void (*)(int, int, const char *, int)))crypto_sw[1].ptr) +#define CRYPTO_set_id_callback \ + (*(void (*)(unsigned long (*)(void)))crypto_sw[2].ptr) +#define ERR_get_error (*(unsigned long (*)(void))crypto_sw[3].ptr) +#define ERR_error_string (*(char *(*)(unsigned long, char *))crypto_sw[4].ptr) +#define ERR_remove_state (*(void (*)(unsigned long))crypto_sw[5].ptr) +#define ERR_free_strings (*(void (*)(void))crypto_sw[6].ptr) +#define ENGINE_cleanup (*(void (*)(void))crypto_sw[7].ptr) +#define CONF_modules_unload (*(void (*)(int))crypto_sw[8].ptr) +#define CRYPTO_cleanup_all_ex_data (*(void (*)(void))crypto_sw[9].ptr) +#define EVP_cleanup (*(void (*)(void))crypto_sw[10].ptr) + + +/* set_ssl_option() function updates this array. + * It loads SSL library dynamically and changes NULLs to the actual addresses + * of respective functions. The macros above (like SSL_connect()) are really + * just calling these functions indirectly via the pointer. */ +static struct ssl_func ssl_sw[] = {{"SSL_free", NULL}, + {"SSL_accept", NULL}, + {"SSL_connect", NULL}, + {"SSL_read", NULL}, + {"SSL_write", NULL}, + {"SSL_get_error", NULL}, + {"SSL_set_fd", NULL}, + {"SSL_new", NULL}, + {"SSL_CTX_new", NULL}, + {"SSLv23_server_method", NULL}, + {"SSL_library_init", NULL}, + {"SSL_CTX_use_PrivateKey_file", NULL}, + {"SSL_CTX_use_certificate_file", NULL}, + {"SSL_CTX_set_default_passwd_cb", NULL}, + {"SSL_CTX_free", NULL}, + {"SSL_load_error_strings", NULL}, + {"SSL_CTX_use_certificate_chain_file", NULL}, + {"SSLv23_client_method", NULL}, + {"SSL_pending", NULL}, + {"SSL_CTX_set_verify", NULL}, + {"SSL_shutdown", NULL}, + {"SSL_CTX_load_verify_locations", NULL}, + {"SSL_CTX_set_default_verify_paths", NULL}, + {"SSL_CTX_set_verify_depth", NULL}, + {"SSL_get_peer_certificate", NULL}, + {"SSL_get_version", NULL}, + {"SSL_get_current_cipher", NULL}, + {"SSL_CIPHER_get_name", NULL}, + {"SSL_CTX_check_private_key", NULL}, + {"SSL_CTX_set_session_id_context", NULL}, + {"SSL_CTX_ctrl", NULL}, + {"SSL_CTX_set_cipher_list", NULL}, + {NULL, NULL}}; + + +/* Similar array as ssl_sw. These functions could be located in different + * lib. */ +#if !defined(NO_SSL) +static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL}, + {"CRYPTO_set_locking_callback", NULL}, + {"CRYPTO_set_id_callback", NULL}, + {"ERR_get_error", NULL}, + {"ERR_error_string", NULL}, + {"ERR_remove_state", NULL}, + {"ERR_free_strings", NULL}, + {"ENGINE_cleanup", NULL}, + {"CONF_modules_unload", NULL}, + {"CRYPTO_cleanup_all_ex_data", NULL}, + {"EVP_cleanup", NULL}, + {NULL, NULL}}; +#endif /* NO_SSL */ +#endif /* NO_SSL_DL */ + + +#if !defined(NO_CACHING) +static const char *month_names[] = {"Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; +#endif /* !NO_CACHING */ + +/* Unified socket address. For IPv6 support, add IPv6 address structure in the + * union u. */ +union usa { + struct sockaddr sa; + struct sockaddr_in sin; +#if defined(USE_IPV6) + struct sockaddr_in6 sin6; +#endif +}; + +/* Describes a string (chunk of memory). */ +struct vec { + const char *ptr; + size_t len; +}; + +struct file { + uint64_t size; + time_t last_modified; + FILE *fp; + const char *membuf; /* Non-NULL if file data is in memory */ + int is_directory; + int gzipped; /* set to 1 if the content is gzipped + * in which case we need a content-encoding: gzip header */ +}; + +#define STRUCT_FILE_INITIALIZER \ + { \ + (uint64_t)0, (time_t)0, (FILE *)NULL, (const char *)NULL, 0, 0 \ + } + +/* Describes listening socket, or socket which was accept()-ed by the master + * thread and queued for future handling by the worker thread. */ +struct socket { + SOCKET sock; /* Listening socket */ + union usa lsa; /* Local socket address */ + union usa rsa; /* Remote socket address */ + unsigned char is_ssl; /* Is port SSL-ed */ + unsigned char ssl_redir; /* Is port supposed to redirect everything to SSL + * port */ +}; + +/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */ +enum { + CGI_EXTENSIONS, + CGI_ENVIRONMENT, + PUT_DELETE_PASSWORDS_FILE, + CGI_INTERPRETER, + PROTECT_URI, + AUTHENTICATION_DOMAIN, + SSI_EXTENSIONS, + THROTTLE, + ACCESS_LOG_FILE, + ENABLE_DIRECTORY_LISTING, + ERROR_LOG_FILE, + GLOBAL_PASSWORDS_FILE, + INDEX_FILES, + ENABLE_KEEP_ALIVE, + ACCESS_CONTROL_LIST, + EXTRA_MIME_TYPES, + LISTENING_PORTS, + DOCUMENT_ROOT, + SSL_CERTIFICATE, + NUM_THREADS, + RUN_AS_USER, + REWRITE, + HIDE_FILES, + REQUEST_TIMEOUT, + SSL_DO_VERIFY_PEER, + SSL_CA_PATH, + SSL_CA_FILE, + SSL_VERIFY_DEPTH, + SSL_DEFAULT_VERIFY_PATHS, + SSL_CIPHER_LIST, + SSL_PROTOCOL_VERSION, + SSL_SHORT_TRUST, +#if defined(USE_WEBSOCKET) + WEBSOCKET_TIMEOUT, +#endif + DECODE_URL, + +#if defined(USE_LUA) + LUA_PRELOAD_FILE, + LUA_SCRIPT_EXTENSIONS, + LUA_SERVER_PAGE_EXTENSIONS, +#endif +#if defined(USE_DUKTAPE) + DUKTAPE_SCRIPT_EXTENSIONS, +#endif + +#if defined(USE_WEBSOCKET) + WEBSOCKET_ROOT, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + LUA_WEBSOCKET_EXTENSIONS, +#endif + ACCESS_CONTROL_ALLOW_ORIGIN, + ERROR_PAGES, + CONFIG_TCP_NODELAY, /* Prepended CONFIG_ to avoid conflict with the + * socket option typedef TCP_NODELAY. */ +#if !defined(NO_CACHING) + STATIC_FILE_MAX_AGE, +#endif + + NUM_OPTIONS +}; + + +/* Config option name, config types, default value */ +static struct mg_option config_options[] = { + {"cgi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.cgi$|**.pl$|**.php$"}, + {"cgi_environment", CONFIG_TYPE_STRING, NULL}, + {"put_delete_auth_file", CONFIG_TYPE_FILE, NULL}, + {"cgi_interpreter", CONFIG_TYPE_FILE, NULL}, + {"protect_uri", CONFIG_TYPE_STRING, NULL}, + {"authentication_domain", CONFIG_TYPE_STRING, "mydomain.com"}, + {"ssi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.shtml$|**.shtm$"}, + {"throttle", CONFIG_TYPE_STRING, NULL}, + {"access_log_file", CONFIG_TYPE_FILE, NULL}, + {"enable_directory_listing", CONFIG_TYPE_BOOLEAN, "yes"}, + {"error_log_file", CONFIG_TYPE_FILE, NULL}, + {"global_auth_file", CONFIG_TYPE_FILE, NULL}, + {"index_files", + CONFIG_TYPE_STRING, +#ifdef USE_LUA + "index.xhtml,index.html,index.htm,index.lp,index.lsp,index.lua,index.cgi," + "index.shtml,index.php"}, +#else + "index.xhtml,index.html,index.htm,index.cgi,index.shtml,index.php"}, +#endif + {"enable_keep_alive", CONFIG_TYPE_BOOLEAN, "no"}, + {"access_control_list", CONFIG_TYPE_STRING, NULL}, + {"extra_mime_types", CONFIG_TYPE_STRING, NULL}, + {"listening_ports", CONFIG_TYPE_STRING, "8080"}, + {"document_root", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_certificate", CONFIG_TYPE_FILE, NULL}, + {"num_threads", CONFIG_TYPE_NUMBER, "50"}, + {"run_as_user", CONFIG_TYPE_STRING, NULL}, + {"url_rewrite_patterns", CONFIG_TYPE_STRING, NULL}, + {"hide_files_patterns", CONFIG_TYPE_EXT_PATTERN, NULL}, + {"request_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, + {"ssl_verify_peer", CONFIG_TYPE_BOOLEAN, "no"}, + {"ssl_ca_path", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_ca_file", CONFIG_TYPE_FILE, NULL}, + {"ssl_verify_depth", CONFIG_TYPE_NUMBER, "9"}, + {"ssl_default_verify_paths", CONFIG_TYPE_BOOLEAN, "yes"}, + {"ssl_cipher_list", CONFIG_TYPE_STRING, NULL}, + {"ssl_protocol_version", CONFIG_TYPE_NUMBER, "0"}, + {"ssl_short_trust", CONFIG_TYPE_BOOLEAN, "no"}, +#if defined(USE_WEBSOCKET) + {"websocket_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, +#endif + {"decode_url", CONFIG_TYPE_BOOLEAN, "yes"}, + +#if defined(USE_LUA) + {"lua_preload_file", CONFIG_TYPE_FILE, NULL}, + {"lua_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, + {"lua_server_page_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lp$|**.lsp$"}, +#endif +#if defined(USE_DUKTAPE) + /* The support for duktape is still in alpha version state. + * The name of this config option might change. */ + {"duktape_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.ssjs$"}, +#endif + +#if defined(USE_WEBSOCKET) + {"websocket_root", CONFIG_TYPE_DIRECTORY, NULL}, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + {"lua_websocket_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, +#endif + {"access_control_allow_origin", CONFIG_TYPE_STRING, "*"}, + {"error_pages", CONFIG_TYPE_DIRECTORY, NULL}, + {"tcp_nodelay", CONFIG_TYPE_NUMBER, "0"}, +#if !defined(NO_CACHING) + {"static_file_max_age", CONFIG_TYPE_NUMBER, "3600"}, +#endif + + {NULL, CONFIG_TYPE_UNKNOWN, NULL}}; + +/* Check if the config_options and the corresponding enum have compatible + * sizes. */ +mg_static_assert((sizeof(config_options) / sizeof(config_options[0])) + == (NUM_OPTIONS + 1), + "config_options and enum not sync"); + +enum { REQUEST_HANDLER, WEBSOCKET_HANDLER, AUTH_HANDLER }; + +struct mg_handler_info { + /* Name/Pattern of the URI. */ + char *uri; + size_t uri_len; + + /* handler type */ + int handler_type; + + /* Handler for http/https or authorization requests. */ + mg_request_handler handler; + + /* Handler for ws/wss (websocket) requests. */ + mg_websocket_connect_handler connect_handler; + mg_websocket_ready_handler ready_handler; + mg_websocket_data_handler data_handler; + mg_websocket_close_handler close_handler; + + /* Handler for authorization requests */ + mg_authorization_handler auth_handler; + + /* User supplied argument for the handler function. */ + void *cbdata; + + /* next handler in a linked list */ + struct mg_handler_info *next; +}; + +struct mg_context { + volatile int stop_flag; /* Should we stop event loop */ + SSL_CTX *ssl_ctx; /* SSL context */ + char *config[NUM_OPTIONS]; /* Civetweb configuration parameters */ + struct mg_callbacks callbacks; /* User-defined callback function */ + void *user_data; /* User-defined data */ + int context_type; /* 1 = server context, 2 = client context */ + + struct socket *listening_sockets; + in_port_t *listening_ports; + unsigned int num_listening_sockets; + + volatile int + running_worker_threads; /* Number of currently running worker threads */ + pthread_mutex_t thread_mutex; /* Protects (max|num)_threads */ + pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */ + + struct socket queue[MGSQLEN]; /* Accepted sockets */ + volatile int sq_head; /* Head of the socket queue */ + volatile int sq_tail; /* Tail of the socket queue */ + pthread_cond_t sq_full; /* Signaled when socket is produced */ + pthread_cond_t sq_empty; /* Signaled when socket is consumed */ + pthread_t masterthreadid; /* The master thread ID */ + unsigned int + cfg_worker_threads; /* The number of configured worker threads. */ + pthread_t *workerthreadids; /* The worker thread IDs */ + + time_t start_time; /* Server start time, used for authentication */ + uint64_t auth_nonce_mask; /* Mask for all nonce values */ + pthread_mutex_t nonce_mutex; /* Protects nonce_count */ + unsigned long nonce_count; /* Used nonces, used for authentication */ + + char *systemName; /* What operating system is running */ + + /* linked list of uri handlers */ + struct mg_handler_info *handlers; + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + /* linked list of shared lua websockets */ + struct mg_shared_lua_websocket_list *shared_lua_websockets; +#endif + +#ifdef USE_TIMERS + struct ttimers *timers; +#endif +}; + + +struct mg_connection { + struct mg_request_info request_info; + struct mg_context *ctx; + SSL *ssl; /* SSL descriptor */ + SSL_CTX *client_ssl_ctx; /* SSL context for client connections */ + struct socket client; /* Connected client */ + time_t conn_birth_time; /* Time (wall clock) when connection was + * established */ + struct timespec req_time; /* Time (since system start) when the request + * was received */ + int64_t num_bytes_sent; /* Total bytes sent to client */ + int64_t content_len; /* Content-Length header value */ + int64_t consumed_content; /* How many bytes of content have been read */ + int is_chunked; /* Transfer-Encoding is chunked: 0=no, 1=yes: + * data available, 2: all data read */ + size_t chunk_remainder; /* Unread data from the last chunk */ + char *buf; /* Buffer for received data */ + char *path_info; /* PATH_INFO part of the URL */ + + int must_close; /* 1 if connection must be closed */ + int in_error_handler; /* 1 if in handler for user defined error + * pages */ + int internal_error; /* 1 if an error occured while processing the + * request */ + + int buf_size; /* Buffer size */ + int request_len; /* Size of the request + headers in a buffer */ + int data_len; /* Total size of data in a buffer */ + int status_code; /* HTTP reply status code, e.g. 200 */ + int throttle; /* Throttling, bytes/sec. <= 0 means no + * throttle */ + time_t last_throttle_time; /* Last time throttled data was sent */ + int64_t last_throttle_bytes; /* Bytes sent this second */ + pthread_mutex_t mutex; /* Used by mg_(un)lock_connection to ensure + * atomic transmissions for websockets */ +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + void *lua_websocket_state; /* Lua_State for a websocket connection */ +#endif +}; + + +static pthread_key_t sTlsKey; /* Thread local storage index */ +static int sTlsInit = 0; +static int thread_idx_max = 0; + + +struct mg_workerTLS { + int is_master; + unsigned long thread_idx; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + HANDLE pthread_cond_helper_mutex; +#endif +}; + +/* Directory entry */ +struct de { + struct mg_connection *conn; + char *file_name; + struct file file; +}; + + +#if defined(USE_WEBSOCKET) +static int is_websocket_protocol(const struct mg_connection *conn); +#else +#define is_websocket_protocol(conn) (0) +#endif + + +static int +mg_atomic_inc(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedIncrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_add_and_fetch(addr, 1); +#else + ret = (++(*addr)); +#endif + return ret; +} + + +static int +mg_atomic_dec(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedDecrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_sub_and_fetch(addr, 1); +#else + ret = (--(*addr)); +#endif + return ret; +} + +#if !defined(NO_THREAD_NAME) +#if defined(_WIN32) && defined(_MSC_VER) +/* Set the thread name for debugging purposes in Visual Studio + * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + */ +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { + DWORD dwType; /* Must be 0x1000. */ + LPCSTR szName; /* Pointer to name (in user addr space). */ + DWORD dwThreadID; /* Thread ID (-1=caller thread). */ + DWORD dwFlags; /* Reserved for future use, must be zero. */ +} THREADNAME_INFO; +#pragma pack(pop) +#elif defined(__linux__) +#include +#include +#endif + + +static void +mg_set_thread_name(const char *name) +{ + char threadName[16 + 1]; /* 16 = Max. thread length in Linux/OSX/.. */ + + mg_snprintf( + NULL, NULL, threadName, sizeof(threadName), "civetweb-%s", name); + +#if defined(_WIN32) +#if defined(_MSC_VER) + /* Windows and Visual Studio Compiler */ + __try + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = ~0U; + info.dwFlags = 0; + + RaiseException(0x406D1388, + 0, + sizeof(info) / sizeof(ULONG_PTR), + (ULONG_PTR *)&info); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + } +#elif defined(__MINGW32__) +/* No option known to set thread name for MinGW */ +#endif +#elif defined(__GLIBC__) \ + && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12))) + /* pthread_setname_np first appeared in glibc in version 2.12*/ + (void)pthread_setname_np(pthread_self(), threadName); +#elif defined(__linux__) + /* on linux we can use the old prctl function */ + (void)prctl(PR_SET_NAME, threadName, 0, 0, 0); +#endif +} +#else /* !defined(NO_THREAD_NAME) */ +void +mg_set_thread_name(const char *threadName) +{ +} +#endif + + +#if defined(MG_LEGACY_INTERFACE) +const char ** +mg_get_valid_option_names(void) +{ + /* This function is deprecated. Use mg_get_valid_options instead. */ + static const char * + data[2 * sizeof(config_options) / sizeof(config_options[0])] = {0}; + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + data[i * 2] = config_options[i].name; + data[i * 2 + 1] = config_options[i].default_value; + } + + return data; +} +#endif + + +const struct mg_option * +mg_get_valid_options(void) +{ + return config_options; +} + + +static int +is_file_in_memory(const struct mg_connection *conn, + const char *path, + struct file *filep) +{ + size_t size = 0; + if (!conn || !filep) { + return 0; + } + + if (conn->ctx->callbacks.open_file) { + filep->membuf = conn->ctx->callbacks.open_file(conn, path, &size); + if (filep->membuf != NULL) { + /* NOTE: override filep->size only on success. Otherwise, it might + * break constructs like if (!mg_stat() || !mg_fopen()) ... */ + filep->size = size; + } + } + + return filep->membuf != NULL; +} + + +static int +is_file_opened(const struct file *filep) +{ + if (!filep) { + return 0; + } + + return filep->membuf != NULL || filep->fp != NULL; +} + + +/* mg_fopen will open a file either in memory or on the disk. + * The input parameter path is a string in UTF-8 encoding. + * The input parameter mode is the same as for fopen. + * Either fp or membuf will be set in the output struct filep. + * The function returns 1 on success, 0 on error. */ +static int +mg_fopen(const struct mg_connection *conn, + const char *path, + const char *mode, + struct file *filep) +{ + struct stat st; + + if (!filep) { + return 0; + } + + /* TODO (high): mg_fopen should only open a file, while mg_stat should + * only get the file status. They should not work on different members of + * the same structure (bad cohesion). */ + memset(filep, 0, sizeof(*filep)); + + if (stat(path, &st) == 0) { + filep->size = (uint64_t)(st.st_size); + } + + if (!is_file_in_memory(conn, path, filep)) { +#ifdef _WIN32 + wchar_t wbuf[PATH_MAX], wmode[20]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, ARRAY_SIZE(wmode)); + filep->fp = _wfopen(wbuf, wmode); +#else + /* Linux et al already use unicode. No need to convert. */ + filep->fp = fopen(path, mode); +#endif + } + + return is_file_opened(filep); +} + + +static void +mg_fclose(struct file *filep) +{ + if (filep != NULL && filep->fp != NULL) { + fclose(filep->fp); + } +} + + +static void +mg_strlcpy(register char *dst, register const char *src, size_t n) +{ + for (; *src != '\0' && n > 1; n--) { + *dst++ = *src++; + } + *dst = '\0'; +} + + +static int +lowercase(const char *s) +{ + return tolower(*(const unsigned char *)s); +} + + +int +mg_strncasecmp(const char *s1, const char *s2, size_t len) +{ + int diff = 0; + + if (len > 0) { + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0' && --len > 0); + } + + return diff; +} + + +int +mg_strcasecmp(const char *s1, const char *s2) +{ + int diff; + + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +static char * +mg_strndup(const char *ptr, size_t len) +{ + char *p; + + if ((p = (char *)mg_malloc(len + 1)) != NULL) { + mg_strlcpy(p, ptr, len + 1); + } + + return p; +} + + +static char * +mg_strdup(const char *str) +{ + return mg_strndup(str, strlen(str)); +} + + +static const char * +mg_strcasestr(const char *big_str, const char *small_str) +{ + size_t i, big_len = strlen(big_str), small_len = strlen(small_str); + + if (big_len >= small_len) { + for (i = 0; i <= (big_len - small_len); i++) { + if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) { + return big_str + i; + } + } + } + + return NULL; +} + + +/* Return null terminated string of given maximum length. + * Report errors if length is exceeded. */ +static void +mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap) +{ + int n, ok; + + if (buflen == 0) { + return; + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" +/* Using fmt as a non-literal is intended here, since it is mostly called + * indirectly by mg_snprintf */ +#endif + + n = (int)vsnprintf_impl(buf, buflen, fmt, ap); + ok = (n >= 0) && ((size_t)n < buflen); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + if (ok) { + if (truncated) { + *truncated = 0; + } + } else { + if (truncated) { + *truncated = 1; + } + mg_cry(conn, + "truncating vsnprintf buffer: [%.*s]", + (int)((buflen > 200) ? 200 : (buflen - 1)), + buf); + n = (int)buflen - 1; + } + buf[n] = '\0'; +} + + +static void +mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + ...) +{ + va_list ap; + + va_start(ap, fmt); + mg_vsnprintf(conn, truncated, buf, buflen, fmt, ap); + va_end(ap); +} + + +static int +get_option_index(const char *name) +{ + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + if (strcmp(config_options[i].name, name) == 0) { + return i; + } + } + return -1; +} + + +const char * +mg_get_option(const struct mg_context *ctx, const char *name) +{ + int i; + if ((i = get_option_index(name)) == -1) { + return NULL; + } else if (!ctx || ctx->config[i] == NULL) { + return ""; + } else { + return ctx->config[i]; + } +} + + +struct mg_context * +mg_get_context(const struct mg_connection *conn) +{ + return (conn == NULL) ? (struct mg_context *)NULL : (conn->ctx); +} + + +void * +mg_get_user_data(const struct mg_context *ctx) +{ + return (ctx == NULL) ? NULL : ctx->user_data; +} + + +void +mg_set_user_connection_data(struct mg_connection *conn, void *data) +{ + if (conn != NULL) { + conn->request_info.conn_data = data; + } +} + + +void * +mg_get_user_connection_data(const struct mg_connection *conn) +{ + if (conn != NULL) { + return conn->request_info.conn_data; + } + return NULL; +} + + +size_t +mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl) +{ + size_t i; + if (!ctx) { + return 0; + } + for (i = 0; i < size && i < ctx->num_listening_sockets; i++) { + ssl[i] = ctx->listening_sockets[i].is_ssl; + ports[i] = ctx->listening_ports[i]; + } + return i; +} + + +int +mg_get_server_ports(const struct mg_context *ctx, + int size, + struct mg_server_ports *ports) +{ + int i, cnt = 0; + + if (size <= 0) { + return -1; + } + memset(ports, 0, sizeof(*ports) * (size_t)size); + if (!ctx) { + return -1; + } + if (!ctx->listening_sockets || !ctx->listening_ports) { + return -1; + } + + for (i = 0; (i < size) && (i < (int)ctx->num_listening_sockets); i++) { + + ports[cnt].port = ctx->listening_ports[i]; + ports[cnt].is_ssl = ctx->listening_sockets[i].is_ssl; + ports[cnt].is_redirect = ctx->listening_sockets[i].ssl_redir; + + if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET) { + /* IPv4 */ + ports[cnt].protocol = 1; + cnt++; + } else if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET6) { + /* IPv6 */ + ports[cnt].protocol = 3; + cnt++; + } + } + + return cnt; +} + + +static void +sockaddr_to_string(char *buf, size_t len, const union usa *usa) +{ + buf[0] = '\0'; + + if (!usa) { + return; + } + + if (usa->sa.sa_family == AF_INET) { + getnameinfo(&usa->sa, + sizeof(usa->sin), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#if defined(USE_IPV6) + else if (usa->sa.sa_family == AF_INET6) { + getnameinfo(&usa->sa, + sizeof(usa->sin6), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#endif +} + + +/* Convert time_t to a string. According to RFC2616, Sec 14.18, this must be + * included in all responses other than 100, 101, 5xx. */ +static void +gmt_time_string(char *buf, size_t buf_len, time_t *t) +{ + struct tm *tm; + + tm = ((t != NULL) ? gmtime(t) : NULL); + if (tm != NULL) { + strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", tm); + } else { + mg_strlcpy(buf, "Thu, 01 Jan 1970 00:00:00 GMT", buf_len); + buf[buf_len - 1] = '\0'; + } +} + + +/* difftime for struct timespec. Return value is in seconds. */ +static double +mg_difftimespec(const struct timespec *ts_now, const struct timespec *ts_before) +{ + return (double)(ts_now->tv_nsec - ts_before->tv_nsec) * 1.0E-9 + + (double)(ts_now->tv_sec - ts_before->tv_sec); +} + + +/* Print error message to the opened error log stream. */ +void +mg_cry(const struct mg_connection *conn, const char *fmt, ...) +{ + char buf[MG_BUF_LEN], src_addr[IP_ADDR_STR_LEN]; + va_list ap; + struct file fi; + time_t timestamp; + + va_start(ap, fmt); + IGNORE_UNUSED_RESULT(vsnprintf_impl(buf, sizeof(buf), fmt, ap)); + va_end(ap); + buf[sizeof(buf) - 1] = 0; + + if (!conn) { + puts(buf); + return; + } + + /* Do not lock when getting the callback value, here and below. + * I suppose this is fine, since function cannot disappear in the + * same way string option can. */ + if ((conn->ctx->callbacks.log_message == NULL) + || (conn->ctx->callbacks.log_message(conn, buf) == 0)) { + + if (conn->ctx->config[ERROR_LOG_FILE] != NULL) { + if (mg_fopen(conn, conn->ctx->config[ERROR_LOG_FILE], "a+", &fi) + == 0) { + fi.fp = NULL; + } + } else { + fi.fp = NULL; + } + + if (fi.fp != NULL) { + flockfile(fi.fp); + timestamp = time(NULL); + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + fprintf(fi.fp, + "[%010lu] [error] [client %s] ", + (unsigned long)timestamp, + src_addr); + + if (conn->request_info.request_method != NULL) { + fprintf(fi.fp, + "%s %s: ", + conn->request_info.request_method, + conn->request_info.request_uri); + } + + fprintf(fi.fp, "%s", buf); + fputc('\n', fi.fp); + fflush(fi.fp); + funlockfile(fi.fp); + mg_fclose(&fi); + } + } +} + + +/* Return fake connection structure. Used for logging, if connection + * is not applicable at the moment of logging. */ +static struct mg_connection * +fc(struct mg_context *ctx) +{ + static struct mg_connection fake_connection; + fake_connection.ctx = ctx; + return &fake_connection; +} + + +const char * +mg_version(void) +{ + return CIVETWEB_VERSION; +} + + +const struct mg_request_info * +mg_get_request_info(const struct mg_connection *conn) +{ + if (!conn) { + return NULL; + } + return &conn->request_info; +} + + +/* Skip the characters until one of the delimiters characters found. + * 0-terminate resulting word. Skip the delimiter and following whitespaces. + * Advance pointer to buffer to the next word. Return found 0-terminated word. + * Delimiters can be quoted with quotechar. */ +static char * +skip_quoted(char **buf, + const char *delimiters, + const char *whitespace, + char quotechar) +{ + char *p, *begin_word, *end_word, *end_whitespace; + + begin_word = *buf; + end_word = begin_word + strcspn(begin_word, delimiters); + + /* Check for quotechar */ + if (end_word > begin_word) { + p = end_word - 1; + while (*p == quotechar) { + /* While the delimiter is quoted, look for the next delimiter. */ + /* This happens, e.g., in calls from parse_auth_header, + * if the user name contains a " character. */ + + /* If there is anything beyond end_word, copy it. */ + if (*end_word != '\0') { + size_t end_off = strcspn(end_word + 1, delimiters); + memmove(p, end_word, end_off + 1); + p += end_off; /* p must correspond to end_word - 1 */ + end_word += end_off + 1; + } else { + *p = '\0'; + break; + } + } + for (p++; p < end_word; p++) { + *p = '\0'; + } + } + + if (*end_word == '\0') { + *buf = end_word; + } else { + end_whitespace = end_word + 1 + strspn(end_word + 1, whitespace); + + for (p = end_word; p < end_whitespace; p++) { + *p = '\0'; + } + + *buf = end_whitespace; + } + + return begin_word; +} + + +/* Simplified version of skip_quoted without quote char + * and whitespace == delimiters */ +static char * +skip(char **buf, const char *delimiters) +{ + return skip_quoted(buf, delimiters, delimiters, 0); +} + + +/* Return HTTP header value, or NULL if not found. */ +static const char * +get_header(const struct mg_request_info *ri, const char *name) +{ + int i; + if (ri) { + for (i = 0; i < ri->num_headers; i++) { + if (!mg_strcasecmp(name, ri->http_headers[i].name)) { + return ri->http_headers[i].value; + } + } + } + + return NULL; +} + + +const char * +mg_get_header(const struct mg_connection *conn, const char *name) +{ + if (!conn) { + return NULL; + } + + return get_header(&conn->request_info, name); +} + + +/* A helper function for traversing a comma separated list of values. + * It returns a list pointer shifted to the next value, or NULL if the end + * of the list found. + * Value is stored in val vector. If value has form "x=y", then eq_val + * vector is initialized to point to the "y" part, and val vector length + * is adjusted to point only to "x". */ +static const char * +next_option(const char *list, struct vec *val, struct vec *eq_val) +{ + int end; + +reparse: + if (val == NULL || list == NULL || *list == '\0') { + /* End of the list */ + list = NULL; + } else { + /* Skip over leading LWS */ + while (*list == ' ' || *list == '\t') + list++; + + val->ptr = list; + if ((list = strchr(val->ptr, ',')) != NULL) { + /* Comma found. Store length and shift the list ptr */ + val->len = ((size_t)(list - val->ptr)); + list++; + } else { + /* This value is the last one */ + list = val->ptr + strlen(val->ptr); + val->len = ((size_t)(list - val->ptr)); + } + + /* Adjust length for trailing LWS */ + end = (int)val->len - 1; + while (end >= 0 && (val->ptr[end] == ' ' || val->ptr[end] == '\t')) + end--; + val->len = (size_t)(end + 1); + + if (val->len == 0) { + /* Ignore any empty entries. */ + goto reparse; + } + + if (eq_val != NULL) { + /* Value has form "x=y", adjust pointers and lengths + * so that val points to "x", and eq_val points to "y". */ + eq_val->len = 0; + eq_val->ptr = (const char *)memchr(val->ptr, '=', val->len); + if (eq_val->ptr != NULL) { + eq_val->ptr++; /* Skip over '=' character */ + eq_val->len = ((size_t)(val->ptr - eq_val->ptr)) + val->len; + val->len = ((size_t)(eq_val->ptr - val->ptr)) - 1; + } + } + } + + return list; +} + +/* A helper function for checking if a comma separated list of values contains + * the given option (case insensitvely). + * 'header' can be NULL, in which case false is returned. */ +static int +header_has_option(const char *header, const char *option) +{ + struct vec opt_vec; + struct vec eq_vec; + + assert(option != NULL); + assert(option[0] != '\0'); + + while ((header = next_option(header, &opt_vec, &eq_vec)) != NULL) { + if (mg_strncasecmp(option, opt_vec.ptr, opt_vec.len) == 0) + return 1; + } + + return 0; +} + +/* Perform case-insensitive match of string against pattern */ +static int +match_prefix(const char *pattern, size_t pattern_len, const char *str) +{ + const char *or_str; + size_t i; + int j, len, res; + + if ((or_str = (const char *)memchr(pattern, '|', pattern_len)) != NULL) { + res = match_prefix(pattern, (size_t)(or_str - pattern), str); + return res > 0 ? res : match_prefix(or_str + 1, + (size_t)((pattern + pattern_len) + - (or_str + 1)), + str); + } + + for (i = 0, j = 0; i < pattern_len; i++, j++) { + if (pattern[i] == '?' && str[j] != '\0') { + continue; + } else if (pattern[i] == '$') { + return str[j] == '\0' ? j : -1; + } else if (pattern[i] == '*') { + i++; + if (pattern[i] == '*') { + i++; + len = (int)strlen(str + j); + } else { + len = (int)strcspn(str + j, "/"); + } + if (i == pattern_len) { + return j + len; + } + do { + res = match_prefix(pattern + i, pattern_len - i, str + j + len); + } while (res == -1 && len-- > 0); + return res == -1 ? -1 : j + res + len; + } else if (lowercase(&pattern[i]) != lowercase(&str[j])) { + return -1; + } + } + return j; +} + + +/* HTTP 1.1 assumes keep alive if "Connection:" header is not set + * This function must tolerate situations when connection info is not + * set up, for example if request parsing failed. */ +static int +should_keep_alive(const struct mg_connection *conn) +{ + if (conn != NULL) { + const char *http_version = conn->request_info.http_version; + const char *header = mg_get_header(conn, "Connection"); + if (conn->must_close || conn->internal_error || conn->status_code == 401 + || mg_strcasecmp(conn->ctx->config[ENABLE_KEEP_ALIVE], "yes") != 0 + || (header != NULL && !header_has_option(header, "keep-alive")) + || (header == NULL && http_version + && 0 != strcmp(http_version, "1.1"))) { + return 0; + } + return 1; + } + return 0; +} + + +static int +should_decode_url(const struct mg_connection *conn) +{ + if (!conn || !conn->ctx) { + return 0; + } + + return (mg_strcasecmp(conn->ctx->config[DECODE_URL], "yes") == 0); +} + + +static const char * +suggest_connection_header(const struct mg_connection *conn) +{ + return should_keep_alive(conn) ? "keep-alive" : "close"; +} + + +static int +send_no_cache_header(struct mg_connection *conn) +{ + /* Send all current and obsolete cache opt-out directives. */ + return mg_printf(conn, + "Cache-Control: no-cache, no-store, " + "must-revalidate, private, max-age=0\r\n" + "Pragma: no-cache\r\n" + "Expires: 0\r\n"); +} + + +static int +send_static_cache_header(struct mg_connection *conn) +{ +#if !defined(NO_CACHING) + /* Read the server config to check how long a file may be cached. + * The configuration is in seconds. */ + int max_age = atoi(conn->ctx->config[STATIC_FILE_MAX_AGE]); + if (max_age <= 0) { + /* 0 means "do not cache". All values <0 are reserved + * and may be used differently in the future. */ + /* If a file should not be cached, do not only send + * max-age=0, but also pragmas and Expires headers. */ + return send_no_cache_header(conn); + } + + /* Use "Cache-Control: max-age" instead of "Expires" header. + * Reason: see https://www.mnot.net/blog/2007/05/15/expires_max-age */ + /* See also https://www.mnot.net/cache_docs/ */ + /* According to RFC 2616, Section 14.21, caching times should not exceed + * one year. A year with 365 days corresponds to 31536000 seconds, a leap + * year to 31622400 seconds. For the moment, we just send whatever has + * been configured, still the behavior for >1 year should be considered + * as undefined. */ + return mg_printf(conn, "Cache-Control: max-age=%u\r\n", (unsigned)max_age); +#else /* NO_CACHING */ + return send_no_cache_header(conn); +#endif /* !NO_CACHING */ +} + + +static void handle_file_based_request(struct mg_connection *conn, + const char *path, + struct file *filep); + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep); + + +const char * +mg_get_response_code_text(struct mg_connection *conn, int response_code) +{ + /* See IANA HTTP status code assignment: + * http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + */ + + switch (response_code) { + /* RFC2616 Section 10.1 - Informational 1xx */ + case 100: + return "Continue"; /* RFC2616 Section 10.1.1 */ + case 101: + return "Switching Protocols"; /* RFC2616 Section 10.1.2 */ + case 102: + return "Processing"; /* RFC2518 Section 10.1 */ + + /* RFC2616 Section 10.2 - Successful 2xx */ + case 200: + return "OK"; /* RFC2616 Section 10.2.1 */ + case 201: + return "Created"; /* RFC2616 Section 10.2.2 */ + case 202: + return "Accepted"; /* RFC2616 Section 10.2.3 */ + case 203: + return "Non-Authoritative Information"; /* RFC2616 Section 10.2.4 */ + case 204: + return "No Content"; /* RFC2616 Section 10.2.5 */ + case 205: + return "Reset Content"; /* RFC2616 Section 10.2.6 */ + case 206: + return "Partial Content"; /* RFC2616 Section 10.2.7 */ + case 207: + return "Multi-Status"; /* RFC2518 Section 10.2, RFC4918 Section 11.1 */ + case 208: + return "Already Reported"; /* RFC5842 Section 7.1 */ + + case 226: + return "IM used"; /* RFC3229 Section 10.4.1 */ + + /* RFC2616 Section 10.3 - Redirection 3xx */ + case 300: + return "Multiple Choices"; /* RFC2616 Section 10.3.1 */ + case 301: + return "Moved Permanently"; /* RFC2616 Section 10.3.2 */ + case 302: + return "Found"; /* RFC2616 Section 10.3.3 */ + case 303: + return "See Other"; /* RFC2616 Section 10.3.4 */ + case 304: + return "Not Modified"; /* RFC2616 Section 10.3.5 */ + case 305: + return "Use Proxy"; /* RFC2616 Section 10.3.6 */ + case 307: + return "Temporary Redirect"; /* RFC2616 Section 10.3.8 */ + case 308: + return "Permanent Redirect"; /* RFC7238 Section 3 */ + + /* RFC2616 Section 10.4 - Client Error 4xx */ + case 400: + return "Bad Request"; /* RFC2616 Section 10.4.1 */ + case 401: + return "Unauthorized"; /* RFC2616 Section 10.4.2 */ + case 402: + return "Payment Required"; /* RFC2616 Section 10.4.3 */ + case 403: + return "Forbidden"; /* RFC2616 Section 10.4.4 */ + case 404: + return "Not Found"; /* RFC2616 Section 10.4.5 */ + case 405: + return "Method Not Allowed"; /* RFC2616 Section 10.4.6 */ + case 406: + return "Not Acceptable"; /* RFC2616 Section 10.4.7 */ + case 407: + return "Proxy Authentication Required"; /* RFC2616 Section 10.4.8 */ + case 408: + return "Request Time-out"; /* RFC2616 Section 10.4.9 */ + case 409: + return "Conflict"; /* RFC2616 Section 10.4.10 */ + case 410: + return "Gone"; /* RFC2616 Section 10.4.11 */ + case 411: + return "Length Required"; /* RFC2616 Section 10.4.12 */ + case 412: + return "Precondition Failed"; /* RFC2616 Section 10.4.13 */ + case 413: + return "Request Entity Too Large"; /* RFC2616 Section 10.4.14 */ + case 414: + return "Request-URI Too Large"; /* RFC2616 Section 10.4.15 */ + case 415: + return "Unsupported Media Type"; /* RFC2616 Section 10.4.16 */ + case 416: + return "Requested range not satisfiable"; /* RFC2616 Section 10.4.17 */ + case 417: + return "Expectation Failed"; /* RFC2616 Section 10.4.18 */ + + case 421: + return "Misdirected Request"; /* RFC7540 Section 9.1.2 */ + case 422: + return "Unproccessable entity"; /* RFC2518 Section 10.3, RFC4918 + * Section 11.2 */ + case 423: + return "Locked"; /* RFC2518 Section 10.4, RFC4918 Section 11.3 */ + case 424: + return "Failed Dependency"; /* RFC2518 Section 10.5, RFC4918 + * Section 11.4 */ + + case 426: + return "Upgrade Required"; /* RFC 2817 Section 4 */ + + case 428: + return "Precondition Required"; /* RFC 6585, Section 3 */ + case 429: + return "Too Many Requests"; /* RFC 6585, Section 4 */ + + case 431: + return "Request Header Fields Too Large"; /* RFC 6585, Section 5 */ + + case 451: + return "Unavailable For Legal Reasons"; /* draft-tbray-http-legally-restricted-status-05, + * Section 3 */ + + /* RFC2616 Section 10.5 - Server Error 5xx */ + case 500: + return "Internal Server Error"; /* RFC2616 Section 10.5.1 */ + case 501: + return "Not Implemented"; /* RFC2616 Section 10.5.2 */ + case 502: + return "Bad Gateway"; /* RFC2616 Section 10.5.3 */ + case 503: + return "Service Unavailable"; /* RFC2616 Section 10.5.4 */ + case 504: + return "Gateway Time-out"; /* RFC2616 Section 10.5.5 */ + case 505: + return "HTTP Version not supported"; /* RFC2616 Section 10.5.6 */ + case 506: + return "Variant Also Negotiates"; /* RFC 2295, Section 8.1 */ + case 507: + return "Insufficient Storage"; /* RFC2518 Section 10.6, RFC4918 + * Section 11.5 */ + case 508: + return "Loop Detected"; /* RFC5842 Section 7.1 */ + + case 510: + return "Not Extended"; /* RFC 2774, Section 7 */ + case 511: + return "Network Authentication Required"; /* RFC 6585, Section 6 */ + + /* Other status codes, not shown in the IANA HTTP status code assignment. + * E.g., "de facto" standards due to common use, ... */ + case 418: + return "I am a teapot"; /* RFC2324 Section 2.3.2 */ + case 419: + return "Authentication Timeout"; /* common use */ + case 420: + return "Enhance Your Calm"; /* common use */ + case 440: + return "Login Timeout"; /* common use */ + case 509: + return "Bandwidth Limit Exceeded"; /* common use */ + + default: + /* This error code is unknown. This should not happen. */ + if (conn) { + mg_cry(conn, "Unknown HTTP response code: %u", response_code); + } + + /* Return at least a category according to RFC 2616 Section 10. */ + if (response_code >= 100 && response_code < 200) { + /* Unknown informational status code */ + return "Information"; + } + if (response_code >= 200 && response_code < 300) { + /* Unknown success code */ + return "Success"; + } + if (response_code >= 300 && response_code < 400) { + /* Unknown redirection code */ + return "Redirection"; + } + if (response_code >= 400 && response_code < 500) { + /* Unknown request error code */ + return "Client Error"; + } + if (response_code >= 500 && response_code < 600) { + /* Unknown server error code */ + return "Server Error"; + } + + /* Response code not even within reasonable range */ + return ""; + } +} + + +static void send_http_error(struct mg_connection *, + int, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +send_http_error(struct mg_connection *conn, int status, const char *fmt, ...) +{ + char buf[MG_BUF_LEN]; + va_list ap; + int len, i, page_handler_found, scope, truncated; + char date[64]; + time_t curtime = time(NULL); + const char *error_handler = NULL; + struct file error_page_file = STRUCT_FILE_INITIALIZER; + const char *error_page_file_ext, *tstr; + + const char *status_text = mg_get_response_code_text(conn, status); + + if (conn == NULL) { + return; + } + + conn->status_code = status; + if (conn->in_error_handler || conn->ctx->callbacks.http_error == NULL + || conn->ctx->callbacks.http_error(conn, status)) { + if (!conn->in_error_handler) { + /* Send user defined error pages, if defined */ + error_handler = conn->ctx->config[ERROR_PAGES]; + error_page_file_ext = conn->ctx->config[INDEX_FILES]; + page_handler_found = 0; + if (error_handler != NULL) { + for (scope = 1; (scope <= 3) && !page_handler_found; scope++) { + switch (scope) { + case 1: /* Handler for specific error, e.g. 404 error */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%03u.", + error_handler, + status); + break; + case 2: /* Handler for error group, e.g., 5xx error handler + * for all server errors (500-599) */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%01uxx.", + error_handler, + status / 100); + break; + default: /* Handler for all errors */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror.", + error_handler); + break; + } + + /* String truncation in buf may only occur if error_handler + * is too long. This string is from the config, not from a + * client. */ + (void)truncated; + + len = (int)strlen(buf); + + tstr = strchr(error_page_file_ext, '.'); + + while (tstr) { + for (i = 1; i < 32 && tstr[i] != 0 && tstr[i] != ','; + i++) + buf[len + i - 1] = tstr[i]; + buf[len + i - 1] = 0; + if (mg_stat(conn, buf, &error_page_file)) { + page_handler_found = 1; + break; + } + tstr = strchr(tstr + i, '.'); + } + } + } + + if (page_handler_found) { + conn->in_error_handler = 1; + handle_file_based_request(conn, buf, &error_page_file); + conn->in_error_handler = 0; + return; + } + } + + /* No custom error page. Send default error page. */ + gmt_time_string(date, sizeof(date), &curtime); + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 %d %s\r\n", status, status_text); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n\r\n", + date); + + /* Errors 1xx, 204 and 304 MUST NOT send a body */ + if (status > 199 && status != 204 && status != 304) { + + mg_printf(conn, "Error %d: %s\n", status, status_text); + + if (fmt != NULL) { + va_start(ap, fmt); + mg_vsnprintf(conn, NULL, buf, sizeof(buf), fmt, ap); + va_end(ap); + mg_write(conn, buf, strlen(buf)); + DEBUG_TRACE("Error %i - [%s]", status, buf); + } + + } else { + /* No body allowed. Close the connection. */ + DEBUG_TRACE("Error %i", status); + } + } +} + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static int +pthread_mutex_init(pthread_mutex_t *mutex, void *unused) +{ + (void)unused; + *mutex = CreateMutex(NULL, FALSE, NULL); + return *mutex == NULL ? -1 : 0; +} + + +static int +pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + return CloseHandle(*mutex) == 0 ? -1 : 0; +} + + +static int +pthread_mutex_lock(pthread_mutex_t *mutex) +{ + return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +} + + +#ifdef ENABLE_UNUSED_PTHREAD_FUNCTIONS +static int +pthread_mutex_trylock(pthread_mutex_t *mutex) +{ + switch (WaitForSingleObject(*mutex, 0)) { + case WAIT_OBJECT_0: + return 0; + case WAIT_TIMEOUT: + return -2; /* EBUSY */ + } + return -1; +} +#endif + + +static int +pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + return ReleaseMutex(*mutex) == 0 ? -1 : 0; +} + + +#ifndef WIN_PTHREADS_TIME_H +static int +clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + FILETIME ft; + ULARGE_INTEGER li; + BOOL ok = FALSE; + double d; + static double perfcnt_per_sec = 0.0; + + if (tp) { + memset(tp, 0, sizeof(*tp)); + if (clk_id == CLOCK_REALTIME) { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + li.QuadPart -= 116444736000000000; /* 1.1.1970 in filedate */ + tp->tv_sec = (time_t)(li.QuadPart / 10000000); + tp->tv_nsec = (long)(li.QuadPart % 10000000) * 100; + ok = TRUE; + } else if (clk_id == CLOCK_MONOTONIC) { + if (perfcnt_per_sec == 0.0) { + QueryPerformanceFrequency((LARGE_INTEGER *)&li); + perfcnt_per_sec = 1.0 / li.QuadPart; + } + if (perfcnt_per_sec != 0.0) { + QueryPerformanceCounter((LARGE_INTEGER *)&li); + d = li.QuadPart * perfcnt_per_sec; + tp->tv_sec = (time_t)d; + d -= tp->tv_sec; + tp->tv_nsec = (long)(d * 1.0E9); + ok = TRUE; + } + } + } + + return ok ? 0 : -1; +} +#endif + + +static int +pthread_cond_init(pthread_cond_t *cv, const void *unused) +{ + (void)unused; + InitializeCriticalSection(&cv->threadIdSec); + cv->waitingthreadcount = 0; + cv->waitingthreadhdls = + (pthread_t *)mg_calloc(MAX_WORKER_THREADS, sizeof(pthread_t)); + return (cv->waitingthreadhdls != NULL) ? 0 : -1; +} + + +static int +pthread_cond_timedwait(pthread_cond_t *cv, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); + int ok; + struct timespec tsnow; + int64_t nsnow, nswaitabs, nswaitrel; + DWORD mswaitrel; + + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount < MAX_WORKER_THREADS); + cv->waitingthreadhdls[cv->waitingthreadcount] = + tls->pthread_cond_helper_mutex; + cv->waitingthreadcount++; + LeaveCriticalSection(&cv->threadIdSec); + + if (abstime) { + clock_gettime(CLOCK_REALTIME, &tsnow); + nsnow = (((int64_t)tsnow.tv_sec) * 1000000000) + tsnow.tv_nsec; + nswaitabs = + (((int64_t)abstime->tv_sec) * 1000000000) + abstime->tv_nsec; + nswaitrel = nswaitabs - nsnow; + if (nswaitrel < 0) { + nswaitrel = 0; + } + mswaitrel = (DWORD)(nswaitrel / 1000000); + } else { + mswaitrel = INFINITE; + } + + pthread_mutex_unlock(mutex); + ok = (WAIT_OBJECT_0 + == WaitForSingleObject(tls->pthread_cond_helper_mutex, mswaitrel)); + pthread_mutex_lock(mutex); + + return ok ? 0 : -1; +} + + +static int +pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex) +{ + return pthread_cond_timedwait(cv, mutex, NULL); +} + + +static int +pthread_cond_signal(pthread_cond_t *cv) +{ + int i; + HANDLE wkup = NULL; + BOOL ok = FALSE; + + EnterCriticalSection(&cv->threadIdSec); + if (cv->waitingthreadcount) { + wkup = cv->waitingthreadhdls[0]; + ok = SetEvent(wkup); + + for (i = 1; i < cv->waitingthreadcount; i++) { + cv->waitingthreadhdls[i - 1] = cv->waitingthreadhdls[i]; + } + cv->waitingthreadcount--; + + assert(ok); + } + LeaveCriticalSection(&cv->threadIdSec); + + return ok ? 0 : 1; +} + + +static int +pthread_cond_broadcast(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + while (cv->waitingthreadcount) { + pthread_cond_signal(cv); + } + LeaveCriticalSection(&cv->threadIdSec); + + return 0; +} + + +static int +pthread_cond_destroy(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount == 0); + mg_free(cv->waitingthreadhdls); + cv->waitingthreadhdls = 0; + LeaveCriticalSection(&cv->threadIdSec); + DeleteCriticalSection(&cv->threadIdSec); + + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +/* For Windows, change all slashes to backslashes in path names. */ +static void +change_slashes_to_backslashes(char *path) +{ + int i; + + for (i = 0; path[i] != '\0'; i++) { + if (path[i] == '/') { + path[i] = '\\'; + } + + /* remove double backslash (check i > 0 to preserve UNC paths, + * like \\server\file.txt) */ + if ((path[i] == '\\') && (i > 0)) { + while (path[i + 1] == '\\' || path[i + 1] == '/') { + (void)memmove(path + i + 1, path + i + 2, strlen(path + i + 1)); + } + } + } +} + + +static int +mg_wcscasecmp(const wchar_t *s1, const wchar_t *s2) +{ + int diff; + + do { + diff = tolower(*s1) - tolower(*s2); + s1++; + s2++; + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +/* Encode 'path' which is assumed UTF-8 string, into UNICODE string. + * wbuf and wbuf_len is a target buffer and its length. */ +static void +path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len) +{ + char buf[PATH_MAX], buf2[PATH_MAX]; + wchar_t wbuf2[MAX_PATH + 1]; + DWORD long_len, err; + int (*fcompare)(const wchar_t *, const wchar_t *) = mg_wcscasecmp; + + mg_strlcpy(buf, path, sizeof(buf)); + change_slashes_to_backslashes(buf); + + /* Convert to Unicode and back. If doubly-converted string does not + * match the original, something is fishy, reject. */ + memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int)wbuf_len); + WideCharToMultiByte( + CP_UTF8, 0, wbuf, (int)wbuf_len, buf2, sizeof(buf2), NULL, NULL); + if (strcmp(buf, buf2) != 0) { + wbuf[0] = L'\0'; + } + + /* TODO: Add a configuration to switch between case sensitive and + * case insensitive URIs for Windows server. */ + /* + if (conn) { + if (conn->ctx->config[WINDOWS_CASE_SENSITIVE]) { + fcompare = wcscmp; + } + } + */ + (void)conn; /* conn is currently unused */ + + /* Only accept a full file path, not a Windows short (8.3) path. */ + memset(wbuf2, 0, ARRAY_SIZE(wbuf2) * sizeof(wchar_t)); + long_len = GetLongPathNameW(wbuf, wbuf2, ARRAY_SIZE(wbuf2) - 1); + if (long_len == 0) { + err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) { + /* File does not exist. This is not always a problem here. */ + return; + } + } + if ((long_len >= ARRAY_SIZE(wbuf2)) || (fcompare(wbuf, wbuf2) != 0)) { + /* Short name is used. */ + wbuf[0] = L'\0'; + } +} + + +#if defined(_WIN32_WCE) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static time_t +time(time_t *ptime) +{ + time_t t; + SYSTEMTIME st; + FILETIME ft; + + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + t = SYS2UNIX_TIME(ft.dwLowDateTime, ft.dwHighDateTime); + + if (ptime != NULL) { + *ptime = t; + } + + return t; +} + + +static struct tm * +localtime(const time_t *ptime, struct tm *ptm) +{ + int64_t t = ((int64_t)*ptime) * RATE_DIFF + EPOCH_DIFF; + FILETIME ft, lft; + SYSTEMTIME st; + TIME_ZONE_INFORMATION tzinfo; + + if (ptm == NULL) { + return NULL; + } + + *(int64_t *)&ft = t; + FileTimeToLocalFileTime(&ft, &lft); + FileTimeToSystemTime(&lft, &st); + ptm->tm_year = st.wYear - 1900; + ptm->tm_mon = st.wMonth - 1; + ptm->tm_wday = st.wDayOfWeek; + ptm->tm_mday = st.wDay; + ptm->tm_hour = st.wHour; + ptm->tm_min = st.wMinute; + ptm->tm_sec = st.wSecond; + ptm->tm_yday = 0; /* hope nobody uses this */ + ptm->tm_isdst = + GetTimeZoneInformation(&tzinfo) == TIME_ZONE_ID_DAYLIGHT ? 1 : 0; + + return ptm; +} + + +static struct tm * +gmtime(const time_t *ptime, struct tm *ptm) +{ + /* FIXME(lsm): fix this. */ + return localtime(ptime, ptm); +} + + +static size_t +strftime(char *dst, size_t dst_size, const char *fmt, const struct tm *tm) +{ + (void)mg_snprintf(NULL, dst, dst_size, "implement strftime() for WinCE"); + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +/* Windows happily opens files with some garbage at the end of file name. + * For example, fopen("a.cgi ", "r") on Windows successfully opens + * "a.cgi", despite one would expect an error back. + * This function returns non-0 if path ends with some garbage. */ +static int +path_cannot_disclose_cgi(const char *path) +{ + static const char *allowed_last_characters = "_-"; + int last = path[strlen(path) - 1]; + return isalnum(last) || strchr(allowed_last_characters, last) != NULL; +} + + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + wchar_t wbuf[PATH_MAX]; + WIN32_FILE_ATTRIBUTE_DATA info; + time_t creation_time; + + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + /* filep->is_directory = 0; filep->gzipped = 0; .. already done by + * memset */ + filep->last_modified = time(NULL); + /* last_modified = now ... assumes the file may change during runtime, + * so every mg_fopen call may return different data */ + /* last_modified = conn->ctx.start_time; + * May be used it the data does not change during runtime. This allows + * browser caching. Since we do not know, we have to assume the file + * in memory may change. */ + return 1; + } + + if (path && path[4] == 0 && memcmp(path, "www/", 4) == 0) + { + filep->size = 512; + filep->is_directory = 1; + return 1; + } + + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + if (GetFileAttributesExW(wbuf, GetFileExInfoStandard, &info) != 0) { + filep->size = MAKEUQUAD(info.nFileSizeLow, info.nFileSizeHigh); + filep->last_modified = + SYS2UNIX_TIME(info.ftLastWriteTime.dwLowDateTime, + info.ftLastWriteTime.dwHighDateTime); + + /* On Windows, the file creation time can be higher than the + * modification time, e.g. when a file is copied. + * Since the Last-Modified timestamp is used for caching + * it should be based on the most recent timestamp. */ + creation_time = SYS2UNIX_TIME(info.ftCreationTime.dwLowDateTime, + info.ftCreationTime.dwHighDateTime); + if (creation_time > filep->last_modified) { + filep->last_modified = creation_time; + } + + filep->is_directory = info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + /* If file name is fishy, reset the file structure and return + * error. + * Note it is important to reset, not just return the error, cause + * functions like is_file_opened() check the struct. */ + if (!filep->is_directory && !path_cannot_disclose_cgi(path)) { + memset(filep, 0, sizeof(*filep)); + return 0; + } + + return 1; + } + + return 0; +} + + +static int +mg_remove(const struct mg_connection *conn, const char *path) +{ + wchar_t wbuf[PATH_MAX]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return DeleteFileW(wbuf) ? 0 : -1; +} + + +static int +mg_mkdir(const struct mg_connection *conn, const char *path, int mode) +{ + wchar_t wbuf[PATH_MAX]; + (void)mode; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return CreateDirectoryW(wbuf, NULL) ? 0 : -1; +} + + +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +/* Implementation of POSIX opendir/closedir/readdir for Windows. */ +static DIR * +mg_opendir(const struct mg_connection *conn, const char *name) +{ + DIR *dir = NULL; + wchar_t wpath[PATH_MAX]; + DWORD attrs; + + if (name == NULL) { + SetLastError(ERROR_BAD_ARGUMENTS); + } else if ((dir = (DIR *)mg_malloc(sizeof(*dir))) == NULL) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + } else { + path_to_unicode(conn, name, wpath, ARRAY_SIZE(wpath)); + attrs = GetFileAttributesW(wpath); + if (attrs != 0xFFFFFFFF && ((attrs & FILE_ATTRIBUTE_DIRECTORY) + == FILE_ATTRIBUTE_DIRECTORY)) { + (void)wcscat(wpath, L"\\*"); + dir->handle = FindFirstFileW(wpath, &dir->info); + dir->result.d_name[0] = '\0'; + } else { + mg_free(dir); + dir = NULL; + } + } + + return dir; +} + + +static int +mg_closedir(DIR *dir) +{ + int result = 0; + + if (dir != NULL) { + if (dir->handle != INVALID_HANDLE_VALUE) + result = FindClose(dir->handle) ? 0 : -1; + + mg_free(dir); + } else { + result = -1; + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +static struct dirent * +mg_readdir(DIR *dir) +{ + struct dirent *result = 0; + + if (dir) { + if (dir->handle != INVALID_HANDLE_VALUE) { + result = &dir->result; + (void)WideCharToMultiByte(CP_UTF8, + 0, + dir->info.cFileName, + -1, + result->d_name, + sizeof(result->d_name), + NULL, + NULL); + + if (!FindNextFileW(dir->handle, &dir->info)) { + (void)FindClose(dir->handle); + dir->handle = INVALID_HANDLE_VALUE; + } + + } else { + SetLastError(ERROR_FILE_NOT_FOUND); + } + } else { + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +#ifndef HAVE_POLL +static int +poll(struct pollfd *pfd, unsigned int n, int milliseconds) +{ + struct timeval tv; + fd_set set; + unsigned int i; + int result; + SOCKET maxfd = 0; + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds % 1000) * 1000; + FD_ZERO(&set); + + for (i = 0; i < n; i++) { + FD_SET((SOCKET)pfd[i].fd, &set); + pfd[i].revents = 0; + + if (pfd[i].fd > maxfd) { + maxfd = pfd[i].fd; + } + } + + if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { + for (i = 0; i < n; i++) { + if (FD_ISSET(pfd[i].fd, &set)) { + pfd[i].revents = POLLIN; + } + } + } + + return result; +} +#endif /* HAVE_POLL */ + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +static void +set_close_on_exec(SOCKET sock, struct mg_connection *conn /* may be null */) +{ + (void)conn; /* Unused. */ + (void)SetHandleInformation((HANDLE)(intptr_t)sock, HANDLE_FLAG_INHERIT, 0); +} + + +int +mg_start_thread(mg_thread_func_t f, void *p) +{ +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, e.g. -DUSE_STACK_SIZE=16384 + */ + return ((_beginthread((void(__cdecl *)(void *))f, USE_STACK_SIZE, p) + == ((uintptr_t)(-1L))) + ? -1 + : 0); +#else + return ( + (_beginthread((void(__cdecl *)(void *))f, 0, p) == ((uintptr_t)(-1L))) + ? -1 + : 0); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(unsigned(__stdcall *f)(void *), + void *p, + pthread_t *threadidptr) +{ + uintptr_t uip; + HANDLE threadhandle; + int result = -1; + + uip = _beginthreadex(NULL, 0, (unsigned(__stdcall *)(void *))f, p, 0, NULL); + threadhandle = (HANDLE)uip; + if ((uip != (uintptr_t)(-1L)) && (threadidptr != NULL)) { + *threadidptr = threadhandle; + result = 0; + } + + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + DWORD dwevent; + + result = -1; + dwevent = WaitForSingleObject(threadid, INFINITE); + if (dwevent == WAIT_FAILED) { + DEBUG_TRACE("WaitForSingleObject() failed, error %d", ERRNO); + } else { + if (dwevent == WAIT_OBJECT_0) { + CloseHandle(threadid); + result = 0; + } + } + + return result; +} + +#if !defined(NO_SSL_DL) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static HANDLE +dlopen(const char *dll_name, int flags) +{ + wchar_t wbuf[PATH_MAX]; + (void)flags; + path_to_unicode(NULL, dll_name, wbuf, ARRAY_SIZE(wbuf)); + return LoadLibraryW(wbuf); +} + + +static int +dlclose(void *handle) +{ + int result; + + if (FreeLibrary((HMODULE)handle) != 0) { + result = 0; + } else { + result = -1; + } + + return result; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +#if !defined(NO_CGI) +#define SIGKILL (0) + +static int +kill(pid_t pid, int sig_num) +{ + (void)TerminateProcess((HANDLE)pid, (UINT)sig_num); + (void)CloseHandle((HANDLE)pid); + return 0; +} + + +static void +trim_trailing_whitespaces(char *s) +{ + char *e = s + strlen(s) - 1; + while (e > s && isspace(*(unsigned char *)e)) { + *e-- = '\0'; + } +} + + +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + HANDLE me; + char *p, *interp, full_interp[PATH_MAX], full_dir[PATH_MAX], + cmdline[PATH_MAX], buf[PATH_MAX]; + int truncated; + struct file file = STRUCT_FILE_INITIALIZER; + STARTUPINFOA si; + PROCESS_INFORMATION pi = {0}; + + (void)envp; + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + + me = GetCurrentProcess(); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdin[0]), + me, + &si.hStdInput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdout[1]), + me, + &si.hStdOutput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fderr[1]), + me, + &si.hStdError, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + + /* Mark handles that should not be inherited. See + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx + */ + SetHandleInformation((HANDLE)_get_osfhandle(fdin[1]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fdout[0]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fderr[0]), + HANDLE_FLAG_INHERIT, + 0); + + /* If CGI file is a script, try to read the interpreter line */ + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + buf[0] = buf[1] = '\0'; + + /* Read the first line of the script into the buffer */ + mg_snprintf( + conn, &truncated, cmdline, sizeof(cmdline), "%s/%s", dir, prog); + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + if (mg_fopen(conn, cmdline, "r", &file)) { + p = (char *)file.membuf; + mg_fgets(buf, sizeof(buf), &file, &p); + mg_fclose(&file); + buf[sizeof(buf) - 1] = '\0'; + } + + if (buf[0] == '#' && buf[1] == '!') { + trim_trailing_whitespaces(buf + 2); + } else { + buf[2] = '\0'; + } + interp = buf + 2; + } + + if (interp[0] != '\0') { + GetFullPathNameA(interp, sizeof(full_interp), full_interp, NULL); + interp = full_interp; + } + GetFullPathNameA(dir, sizeof(full_dir), full_dir, NULL); + + if (interp[0] != '\0') { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\" \"%s\\%s\"", + interp, + full_dir, + prog); + } else { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\\%s\"", + full_dir, + prog); + } + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + DEBUG_TRACE("Running [%s]", cmdline); + if (CreateProcessA(NULL, + cmdline, + NULL, + NULL, + TRUE, + CREATE_NEW_PROCESS_GROUP, + envblk, + NULL, + &si, + &pi) == 0) { + mg_cry( + conn, "%s: CreateProcess(%s): %ld", __func__, cmdline, (long)ERRNO); + pi.hProcess = (pid_t)-1; + /* goto spawn_cleanup; */ + } + +spawn_cleanup: + (void)CloseHandle(si.hStdOutput); + (void)CloseHandle(si.hStdError); + (void)CloseHandle(si.hStdInput); + if (pi.hThread != NULL) { + (void)CloseHandle(pi.hThread); + } + + return (pid_t)pi.hProcess; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + unsigned long on = 1; + return ioctlsocket(sock, (long)FIONBIO, &on); +} + +#else + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + struct stat st; + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + return 1; + } + + if (path && path[4] == 0 && memcmp(path, "www/", 4) == 0) + { + filep->size = 512; + filep->is_directory = 1; + return 1; + } + + if (0 == stat(path, &st)) { + filep->size = (uint64_t)(st.st_size); + filep->last_modified = st.st_mtime; + filep->is_directory = S_ISDIR(st.st_mode); + return 1; + } + + return 0; +} + + +static void +set_close_on_exec(SOCKET fd, struct mg_connection *conn /* may be null */) +{ + if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + if (conn) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } + } +} + + +int +mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(mg_thread_func_t func, + void *param, + pthread_t *threadidptr) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && USE_STACK_SIZE > 1 */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + if ((result == 0) && (threadidptr != NULL)) { + *threadidptr = thread_id; + } + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + + result = pthread_join(threadid, NULL); + return result; +} + + +#ifndef NO_CGI +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + pid_t pid; + const char *interp; + + (void)envblk; + + if (conn == NULL) { + return 0; + } + + if ((pid = fork()) == -1) { + /* Parent */ + send_http_error(conn, + 500, + "Error: Creating CGI process\nfork(): %s", + strerror(ERRNO)); + } else if (pid == 0) { + /* Child */ + if (chdir(dir) != 0) { + mg_cry(conn, "%s: chdir(%s): %s", __func__, dir, strerror(ERRNO)); + } else if (dup2(fdin[0], 0) == -1) { + mg_cry(conn, + "%s: dup2(%d, 0): %s", + __func__, + fdin[0], + strerror(ERRNO)); + } else if (dup2(fdout[1], 1) == -1) { + mg_cry(conn, + "%s: dup2(%d, 1): %s", + __func__, + fdout[1], + strerror(ERRNO)); + } else if (dup2(fderr[1], 2) == -1) { + mg_cry(conn, + "%s: dup2(%d, 2): %s", + __func__, + fderr[1], + strerror(ERRNO)); + } else { + /* Keep stderr and stdout in two different pipes. + * Stdout will be sent back to the client, + * stderr should go into a server error log. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + + /* Close write end fdin and read end fdout and fderr */ + (void)close(fdin[1]); + (void)close(fdout[0]); + (void)close(fderr[0]); + + /* After exec, all signal handlers are restored to their default + * values, with one exception of SIGCHLD. According to + * POSIX.1-2001 and Linux's implementation, SIGCHLD's handler will + * leave unchanged after exec if it was set to be ignored. Restore + * it to default action. */ + signal(SIGCHLD, SIG_DFL); + + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + (void)execle(prog, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s): %s", + __func__, + prog, + strerror(ERRNO)); + } else { + (void)execle(interp, interp, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s %s): %s", + __func__, + interp, + prog, + strerror(ERRNO)); + } + } + exit(EXIT_FAILURE); + } + + return pid; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + int flags; + + flags = fcntl(sock, F_GETFL, 0); + (void)fcntl(sock, F_SETFL, flags | O_NONBLOCK); + + return 0; +} +#endif /* _WIN32 */ +/* End of initial operating system specific define block. */ + + +/* Get a random number (independent of C rand function) */ +static uint64_t +get_random(void) +{ + static uint64_t lfsr = 0; /* Linear feedback shift register */ + static uint64_t lcg = 0; /* Linear congruential generator */ + struct timespec now; + + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &now); + + if (lfsr == 0) { + /* lfsr will be only 0 if has not been initialized, + * so this code is called only once. */ + lfsr = (((uint64_t)now.tv_sec) << 21) ^ ((uint64_t)now.tv_nsec) + ^ ((uint64_t)(ptrdiff_t)&now) ^ (((uint64_t)time(NULL)) << 33); + lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec + + (uint64_t)(ptrdiff_t)&now; + } else { + /* Get the next step of both random number generators. */ + lfsr = (lfsr >> 1) + | ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1) + << 63); + lcg = lcg * 6364136223846793005 + 1442695040888963407; + } + + /* Combining two pseudo-random number generators and a high resolution part + * of the current server time will make it hard (impossible?) to guess the + * next number. */ + return (lfsr ^ lcg ^ (uint64_t)now.tv_nsec); +} + + +/* Write data to the IO channel - opened file descriptor, socket or SSL + * descriptor. Return number of bytes written. */ +static int +push(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int len, + double timeout) +{ + struct timespec start, now; + int n, err; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + if (ctx == NULL) { + return -1; + } + +#ifdef NO_SSL + if (ssl) { + return -1; + } +#endif + + do { + +#ifndef NO_SSL + if (ssl != NULL) { + n = SSL_write(ssl, buf, len); + if (n <= 0) { + err = SSL_get_error(ssl, n); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (n == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_write() failed, error %d", err); + return -1; + } + } else { + err = 0; + } + } else +#endif + if (fp != NULL) { + n = (int)fwrite(buf, 1, (size_t)len, fp); + if (ferror(fp)) { + n = -1; + err = ERRNO; + } else { + err = 0; + } + } else { + n = (int)send(sock, buf, (len_t)len, MSG_NOSIGNAL); + err = (n < 0) ? ERRNO : 0; + } + + if (ctx->stop_flag) { + return -1; + } + + if ((n > 0) || (n == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return n; + } + if (n == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (n < 0) { + /* socket error - check errno */ + DEBUG_TRACE("send() failed, error %d", err); + + /* TODO: error handling depending on the error code. + * These codes are different between Windows and Linux. + */ + return -1; + } + + /* This code is not reached in the moment. + * ==> Fix the TODOs above first. */ + + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + (void)err; /* Avoid unused warning if NO_SSL is set and DEBUG_TRACE is not + used */ + + return -1; +} + + +static int64_t +push_all(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int64_t len) +{ + double timeout = -1.0; + int64_t n, nwritten = 0; + + if (ctx == NULL) { + return -1; + } + + if (ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && ctx->stop_flag == 0) { + n = push(ctx, fp, sock, ssl, buf + nwritten, (int)len, timeout); + if (n < 0) { + if (nwritten == 0) { + nwritten = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to write */ + } else { + nwritten += n; + len -= n; + } + } + + return nwritten; +} + + +/* Read from IO channel - opened file descriptor, socket, or SSL descriptor. + * Return negative value on error, or number of bytes read on success. */ +static int +pull(FILE *fp, struct mg_connection *conn, char *buf, int len, double timeout) +{ + int nread, err; + struct timespec start, now; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + do { + if (fp != NULL) { + /* Use read() instead of fread(), because if we're reading from the + * CGI pipe, fread() may block until IO buffer is filled up. We + * cannot afford to block and must pass all read bytes immediately + * to the client. */ + nread = (int)read(fileno(fp), buf, (size_t)len); + err = (nread < 0) ? ERRNO : 0; + +#ifndef NO_SSL + } else if (conn->ssl != NULL) { + nread = SSL_read(conn->ssl, buf, len); + if (nread <= 0) { + err = SSL_get_error(conn->ssl, nread); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (nread == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_read() failed, error %d", err); + return -1; + } + } else { + err = 0; + } +#endif + + } else { + nread = (int)recv(conn->client.sock, buf, (len_t)len, 0); + err = (nread < 0) ? ERRNO : 0; + } + + if (conn->ctx->stop_flag) { + return -1; + } + + if ((nread > 0) || (nread == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return nread; + } + if (nread == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (nread < 0) { +/* socket error - check errno */ +#ifdef _WIN32 + if (err == WSAEWOULDBLOCK) { + /* standard case if called from close_socket_gracefully */ + return -1; + } else if (err == WSAETIMEDOUT) { + /* timeout is handled by the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#else + /* TODO: POSIX returns either EAGAIN or EWOULDBLOCK in both cases, + * if the timeout is reached and if the socket was set to non- + * blocking in close_socket_gracefully, so we can not distinguish + * here. We have to wait for the timeout in both cases for now. + */ + if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR) { + /* EAGAIN/EWOULDBLOCK: + * standard case if called from close_socket_gracefully + * => should return -1 */ + /* or timeout occured + * => the code must stay in the while loop */ + + /* EINTR can be generated on a socket with a timeout set even + * when SA_RESTART is effective for all relevant signals + * (see signal(7)). + * => stay in the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#endif + } + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + /* Timeout occured, but no data available. */ + return -1; +} + + +static int +pull_all(FILE *fp, struct mg_connection *conn, char *buf, int len) +{ + int n, nread = 0; + double timeout = -1.0; + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && conn->ctx->stop_flag == 0) { + n = pull(fp, conn, buf + nread, len, timeout); + if (n < 0) { + if (nread == 0) { + nread = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to read */ + } else { + conn->consumed_content += n; + nread += n; + len -= n; + } + } + + return nread; +} + + +static void +discard_unread_request_data(struct mg_connection *conn) +{ + char buf[MG_BUF_LEN]; + size_t to_read; + int nread; + + if (conn == NULL) { + return; + } + + to_read = sizeof(buf); + + if (conn->is_chunked) { + /* Chunked encoding: 1=chunk not read completely, 2=chunk read + * completely */ + while (conn->is_chunked == 1) { + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + + } else { + /* Not chunked: content length is known */ + while (conn->consumed_content < conn->content_len) { + if (to_read + > (size_t)(conn->content_len - conn->consumed_content)) { + to_read = (size_t)(conn->content_len - conn->consumed_content); + } + + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + } +} + + +static int +mg_read_inner(struct mg_connection *conn, void *buf, size_t len) +{ + int64_t n, buffered_len, nread; + int64_t len64 = + (int64_t)(len > INT_MAX ? INT_MAX : len); /* since the return value is + * int, we may not read more + * bytes */ + const char *body; + + if (conn == NULL) { + return 0; + } + + /* If Content-Length is not set for a PUT or POST request, read until + * socket is closed */ + if (conn->consumed_content == 0 && conn->content_len == -1) { + conn->content_len = INT64_MAX; + conn->must_close = 1; + } + + nread = 0; + if (conn->consumed_content < conn->content_len) { + /* Adjust number of bytes to read. */ + int64_t left_to_read = conn->content_len - conn->consumed_content; + if (left_to_read < len64) { + /* Do not read more than the total content length of the request. + */ + len64 = left_to_read; + } + + /* Return buffered data */ + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + if (buffered_len > 0) { + if (len64 < buffered_len) { + buffered_len = len64; + } + body = conn->buf + conn->request_len + conn->consumed_content; + memcpy(buf, body, (size_t)buffered_len); + len64 -= buffered_len; + conn->consumed_content += buffered_len; + nread += buffered_len; + buf = (char *)buf + buffered_len; + } + + /* We have returned all buffered data. Read new data from the remote + * socket. + */ + if ((n = pull_all(NULL, conn, (char *)buf, (int)len64)) >= 0) { + nread += n; + } else { + nread = (nread > 0 ? nread : n); + } + } + return (int)nread; +} + + +static char +mg_getc(struct mg_connection *conn) +{ + char c; + if (conn == NULL) { + return 0; + } + conn->content_len++; + if (mg_read_inner(conn, &c, 1) <= 0) { + return (char)0; + } + return c; +} + + +int +mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + if (len > INT_MAX) { + len = INT_MAX; + } + + if (conn == NULL) { + return 0; + } + + if (conn->is_chunked) { + size_t all_read = 0; + + while (len > 0) { + + if (conn->is_chunked == 2) { + /* No more data left to read */ + return 0; + } + + if (conn->chunk_remainder) { + /* copy from the remainder of the last received chunk */ + long read_ret; + size_t read_now = + ((conn->chunk_remainder > len) ? (len) + : (conn->chunk_remainder)); + + conn->content_len += (int)read_now; + read_ret = + mg_read_inner(conn, (char *)buf + all_read, read_now); + all_read += (size_t)read_ret; + + conn->chunk_remainder -= read_now; + len -= read_now; + + if (conn->chunk_remainder == 0) { + /* the rest of the data in the current chunk has been read + */ + if ((mg_getc(conn) != '\r') || (mg_getc(conn) != '\n')) { + /* Protocol violation */ + return -1; + } + } + + } else { + /* fetch a new chunk */ + int i = 0; + char lenbuf[64]; + char *end = 0; + unsigned long chunkSize = 0; + + for (i = 0; i < ((int)sizeof(lenbuf) - 1); i++) { + lenbuf[i] = mg_getc(conn); + if (i > 0 && lenbuf[i] == '\r' && lenbuf[i - 1] != '\r') { + continue; + } + if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') { + lenbuf[i + 1] = 0; + chunkSize = strtoul(lenbuf, &end, 16); + if (chunkSize == 0) { + /* regular end of content */ + conn->is_chunked = 2; + } + break; + } + if (!isalnum(lenbuf[i])) { + /* illegal character for chunk length */ + return -1; + } + } + if ((end == NULL) || (*end != '\r')) { + /* chunksize not set correctly */ + return -1; + } + if (chunkSize == 0) { + break; + } + + conn->chunk_remainder = chunkSize; + } + } + + return (int)all_read; + } + return mg_read_inner(conn, buf, len); +} + + +int +mg_write(struct mg_connection *conn, const void *buf, size_t len) +{ + time_t now; + int64_t n, total, allowed; + + if (conn == NULL) { + return 0; + } + + if (conn->throttle > 0) { + if ((now = time(NULL)) != conn->last_throttle_time) { + conn->last_throttle_time = now; + conn->last_throttle_bytes = 0; + } + allowed = conn->throttle - conn->last_throttle_bytes; + if (allowed > (int64_t)len) { + allowed = (int64_t)len; + } + if ((total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) == allowed) { + buf = (const char *)buf + total; + conn->last_throttle_bytes += total; + while (total < (int64_t)len && conn->ctx->stop_flag == 0) { + allowed = conn->throttle > (int64_t)len - total + ? (int64_t)len - total + : conn->throttle; + if ((n = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) != allowed) { + break; + } + sleep(1); + conn->last_throttle_bytes = allowed; + conn->last_throttle_time = time(NULL); + buf = (const char *)buf + n; + total += n; + } + } + } else { + total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)len); + } + return (int)total; +} + + +/* Alternative alloc_vprintf() for non-compliant C runtimes */ +static int +alloc_vprintf2(char **buf, const char *fmt, va_list ap) +{ + va_list ap_copy; + size_t size = MG_BUF_LEN / 4; + int len = -1; + + *buf = NULL; + while (len < 0) { + if (*buf) { + mg_free(*buf); + } + + size *= 4; + *buf = (char *)mg_malloc(size); + if (!*buf) { + break; + } + + va_copy(ap_copy, ap); + len = vsnprintf_impl(*buf, size - 1, fmt, ap_copy); + va_end(ap_copy); + (*buf)[size - 1] = 0; + } + + return len; +} + + +/* Print message to buffer. If buffer is large enough to hold the message, + * return buffer. If buffer is to small, allocate large enough buffer on heap, + * and return allocated buffer. */ +static int +alloc_vprintf(char **out_buf, + char *prealloc_buf, + size_t prealloc_size, + const char *fmt, + va_list ap) +{ + va_list ap_copy; + int len; + + /* Windows is not standard-compliant, and vsnprintf() returns -1 if + * buffer is too small. Also, older versions of msvcrt.dll do not have + * _vscprintf(). However, if size is 0, vsnprintf() behaves correctly. + * Therefore, we make two passes: on first pass, get required message + * length. + * On second pass, actually print the message. */ + va_copy(ap_copy, ap); + len = vsnprintf_impl(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + if (len < 0) { + /* C runtime is not standard compliant, vsnprintf() returned -1. + * Switch to alternative code path that uses incremental allocations. + */ + va_copy(ap_copy, ap); + len = alloc_vprintf2(out_buf, fmt, ap); + va_end(ap_copy); + + } else if ((size_t)(len) >= prealloc_size) { + /* The pre-allocated buffer not large enough. */ + /* Allocate a new buffer. */ + *out_buf = (char *)mg_malloc((size_t)(len) + 1); + if (!*out_buf) { + /* Allocation failed. Return -1 as "out of memory" error. */ + return -1; + } + /* Buffer allocation successful. Store the string there. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(*out_buf, (size_t)(len) + 1, fmt, ap_copy)); + va_end(ap_copy); + + } else { + /* The pre-allocated buffer is large enough. + * Use it to store the string and return the address. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(prealloc_buf, prealloc_size, fmt, ap_copy)); + va_end(ap_copy); + *out_buf = prealloc_buf; + } + + return len; +} + + +static int +mg_vprintf(struct mg_connection *conn, const char *fmt, va_list ap) +{ + char mem[MG_BUF_LEN]; + char *buf = NULL; + int len; + + if ((len = alloc_vprintf(&buf, mem, sizeof(mem), fmt, ap)) > 0) { + len = mg_write(conn, buf, (size_t)len); + } + if (buf != mem && buf != NULL) { + mg_free(buf); + } + + return len; +} + + +int +mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + va_list ap; + int result; + + va_start(ap, fmt); + result = mg_vprintf(conn, fmt, ap); + va_end(ap); + + return result; +} + + +int +mg_url_decode(const char *src, + int src_len, + char *dst, + int dst_len, + int is_form_url_encoded) +{ + int i, j, a, b; +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { + if (i < src_len - 2 && src[i] == '%' + && isxdigit(*(const unsigned char *)(src + i + 1)) + && isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); + i += 2; + } else if (is_form_url_encoded && src[i] == '+') { + dst[j] = ' '; + } else { + dst[j] = src[i]; + } + } + + dst[j] = '\0'; /* Null-terminate the destination */ + + return i >= src_len ? j : -1; +} + + +int +mg_get_var(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len) +{ + return mg_get_var2(data, data_len, name, dst, dst_len, 0); +} + + +int +mg_get_var2(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len, + size_t occurrence) +{ + const char *p, *e, *s; + size_t name_len; + int len; + + if (dst == NULL || dst_len == 0) { + len = -2; + } else if (data == NULL || name == NULL || data_len == 0) { + len = -1; + dst[0] = '\0'; + } else { + name_len = strlen(name); + e = data + data_len; + len = -1; + dst[0] = '\0'; + + /* data is "var1=val1&var2=val2...". Find variable first */ + for (p = data; p + name_len < e; p++) { + if ((p == data || p[-1] == '&') && p[name_len] == '=' + && !mg_strncasecmp(name, p, name_len) && 0 == occurrence--) { + /* Point p to variable value */ + p += name_len + 1; + + /* Point s to the end of the value */ + s = (const char *)memchr(p, '&', (size_t)(e - p)); + if (s == NULL) { + s = e; + } + /* assert(s >= p); */ + if (s < p) { + return -3; + } + + /* Decode variable into destination buffer */ + len = mg_url_decode(p, (int)(s - p), dst, (int)dst_len, 1); + + /* Redirect error code from -1 to -2 (destination buffer too + * small). */ + if (len == -1) { + len = -2; + } + break; + } + } + } + + return len; +} + + +int +mg_get_cookie(const char *cookie_header, + const char *var_name, + char *dst, + size_t dst_size) +{ + const char *s, *p, *end; + int name_len, len = -1; + + if (dst == NULL || dst_size == 0) { + len = -2; + } else if (var_name == NULL || (s = cookie_header) == NULL) { + len = -1; + dst[0] = '\0'; + } else { + name_len = (int)strlen(var_name); + end = s + strlen(s); + dst[0] = '\0'; + + for (; (s = mg_strcasestr(s, var_name)) != NULL; s += name_len) { + if (s[name_len] == '=') { + s += name_len + 1; + if ((p = strchr(s, ' ')) == NULL) { + p = end; + } + if (p[-1] == ';') { + p--; + } + if (*s == '"' && p[-1] == '"' && p > s + 1) { + s++; + p--; + } + if ((size_t)(p - s) < dst_size) { + len = (int)(p - s); + mg_strlcpy(dst, s, (size_t)len + 1); + } else { + len = -3; + } + break; + } + } + } + return len; +} + + +#if defined(USE_WEBSOCKET) || defined(USE_LUA) +static void +base64_encode(const unsigned char *src, int src_len, char *dst) +{ + static const char *b64 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + int i, j, a, b, c; + + for (i = j = 0; i < src_len; i += 3) { + a = src[i]; + b = i + 1 >= src_len ? 0 : src[i + 1]; + c = i + 2 >= src_len ? 0 : src[i + 2]; + + dst[j++] = b64[a >> 2]; + dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; + if (i + 1 < src_len) { + dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; + } + if (i + 2 < src_len) { + dst[j++] = b64[c & 63]; + } + } + while (j % 4 != 0) { + dst[j++] = '='; + } + dst[j++] = '\0'; +} +#endif + + +#if defined(USE_LUA) +static unsigned char +b64reverse(char letter) +{ + if (letter >= 'A' && letter <= 'Z') { + return letter - 'A'; + } + if (letter >= 'a' && letter <= 'z') { + return letter - 'a' + 26; + } + if (letter >= '0' && letter <= '9') { + return letter - '0' + 52; + } + if (letter == '+') { + return 62; + } + if (letter == '/') { + return 63; + } + if (letter == '=') { + return 255; /* normal end */ + } + return 254; /* error */ +} + + +static int +base64_decode(const unsigned char *src, int src_len, char *dst, size_t *dst_len) +{ + int i; + unsigned char a, b, c, d; + + *dst_len = 0; + + for (i = 0; i < src_len; i += 4) { + a = b64reverse(src[i]); + if (a >= 254) { + return i; + } + + b = b64reverse(i + 1 >= src_len ? 0 : src[i + 1]); + if (b >= 254) { + return i + 1; + } + + c = b64reverse(i + 2 >= src_len ? 0 : src[i + 2]); + if (c == 254) { + return i + 2; + } + + d = b64reverse(i + 3 >= src_len ? 0 : src[i + 3]); + if (d == 254) { + return i + 3; + } + + dst[(*dst_len)++] = (a << 2) + (b >> 4); + if (c != 255) { + dst[(*dst_len)++] = (b << 4) + (c >> 2); + if (d != 255) { + dst[(*dst_len)++] = (c << 6) + d; + } + } + } + return -1; +} +#endif + + +static int +is_put_or_delete_method(const struct mg_connection *conn) +{ + if (conn) { + const char *s = conn->request_info.request_method; + return s != NULL && (!strcmp(s, "PUT") || !strcmp(s, "DELETE") + || !strcmp(s, "MKCOL") || !strcmp(s, "PATCH")); + } + return 0; +} + + +static void +interpret_uri(struct mg_connection *conn, /* in: request (must be valid) */ + char *filename, /* out: filename */ + size_t filename_buf_len, /* in: size of filename buffer */ + struct file *filep, /* out: file structure */ + int *is_found, /* out: file is found (directly) */ + int *is_script_resource, /* out: handled by a script? */ + int *is_websocket_request, /* out: websocket connetion? */ + int *is_put_or_delete_request /* out: put/delete a file? */ + ) +{ +/* TODO (high): Restructure this function */ + +#if !defined(NO_FILES) + const char *uri = conn->request_info.local_uri; + const char *root = conn->ctx->config[DOCUMENT_ROOT]; + const char *rewrite; + struct vec a, b; + int match_len; + char gz_path[PATH_MAX]; + char const *accept_encoding; + int truncated; +#if !defined(NO_CGI) || defined(USE_LUA) + char *p; +#endif +#else + (void)filename_buf_len; /* unused if NO_FILES is defined */ +#endif + + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_put_or_delete_request = is_put_or_delete_method(conn); + +#if defined(USE_WEBSOCKET) + *is_websocket_request = is_websocket_protocol(conn); +#if !defined(NO_FILES) + if (*is_websocket_request && conn->ctx->config[WEBSOCKET_ROOT]) { + root = conn->ctx->config[WEBSOCKET_ROOT]; + } +#endif /* !NO_FILES */ +#else /* USE_WEBSOCKET */ + *is_websocket_request = 0; +#endif /* USE_WEBSOCKET */ + +#if !defined(NO_FILES) + /* Note that root == NULL is a regular use case here. This occurs, + * if all requests are handled by callbacks, so the WEBSOCKET_ROOT + * config is not required. */ + if (root == NULL) { + /* all file related outputs have already been set to 0, just return + */ + return; + } + + /* Using buf_len - 1 because memmove() for PATH_INFO may shift part + * of the path one byte on the right. + * If document_root is NULL, leave the file empty. */ + mg_snprintf( + conn, &truncated, filename, filename_buf_len - 1, "%s%s", root, uri); + + if (truncated) { + goto interpret_cleanup; + } + + rewrite = conn->ctx->config[REWRITE]; + while ((rewrite = next_option(rewrite, &a, &b)) != NULL) { + if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) { + mg_snprintf(conn, + &truncated, + filename, + filename_buf_len - 1, + "%.*s%s", + (int)b.len, + b.ptr, + uri + match_len); + break; + } + } + + if (truncated) { + goto interpret_cleanup; + } + + /* Local file path and name, corresponding to requested URI + * is now stored in "filename" variable. */ + if (mg_stat(conn, filename, filep)) { +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* File exists. Check if it is a script type. */ + if (0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) { + /* The request addresses a CGI script or a Lua script. The URI + * corresponds to the script itself (like /path/script.cgi), + * and there is no additional resource path + * (like /path/script.cgi/something). + * Requests that modify (replace or delete) a resource, like + * PUT and DELETE requests, should replace/delete the script + * file. + * Requests that read or write from/to a resource, like GET and + * POST requests, should call the script and return the + * generated response. */ + *is_script_resource = !*is_put_or_delete_request; + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ + *is_found = 1; + return; + } + + /* If we can't find the actual file, look for the file + * with the same name but a .gz extension. If we find it, + * use that and set the gzipped flag in the file struct + * to indicate that the response need to have the content- + * encoding: gzip header. + * We can only do this if the browser declares support. */ + if ((accept_encoding = mg_get_header(conn, "Accept-Encoding")) != NULL) { + if (strstr(accept_encoding, "gzip") != NULL) { + mg_snprintf( + conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", filename); + + if (truncated) { + goto interpret_cleanup; + } + + if (mg_stat(conn, gz_path, filep)) { + if (filep) { + filep->gzipped = 1; + *is_found = 1; + } + /* Currently gz files can not be scripts. */ + return; + } + } + } + +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* Support PATH_INFO for CGI scripts. */ + for (p = filename + strlen(filename); p > filename + 1; p--) { + if (*p == '/') { + *p = '\0'; + if ((0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) && mg_stat(conn, filename, filep)) { + /* Shift PATH_INFO block one character right, e.g. + * "/x.cgi/foo/bar\x00" => "/x.cgi\x00/foo/bar\x00" + * conn->path_info is pointing to the local variable "path" + * declared in handle_request(), so PATH_INFO is not valid + * after handle_request returns. */ + conn->path_info = p + 1; + memmove(p + 2, p + 1, strlen(p + 1) + 1); /* +1 is for + * trailing \0 */ + p[1] = '/'; + *is_script_resource = 1; + break; + } else { + *p = '/'; + } + } + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ +#endif /* !defined(NO_FILES) */ + return; + +#if !defined(NO_FILES) +/* Reset all outputs */ +interpret_cleanup: + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_websocket_request = 0; + *is_put_or_delete_request = 0; +#endif /* !defined(NO_FILES) */ +} + + +/* Check whether full request is buffered. Return: + * -1 if request is malformed + * 0 if request is not yet fully buffered + * >0 actual request length, including last \r\n\r\n */ +static int +get_request_len(const char *buf, int buflen) +{ + const char *s, *e; + int len = 0; + + for (s = buf, e = s + buflen - 1; len <= 0 && s < e; s++) + /* Control characters are not allowed but >=128 is. */ + if (!isprint(*(const unsigned char *)s) && *s != '\r' && *s != '\n' + && *(const unsigned char *)s < 128) { + len = -1; + break; /* [i_a] abort scan as soon as one malformed character is + * found; */ + /* don't let subsequent \r\n\r\n win us over anyhow */ + } else if (s[0] == '\n' && s[1] == '\n') { + len = (int)(s - buf) + 2; + } else if (s[0] == '\n' && &s[1] < e && s[1] == '\r' && s[2] == '\n') { + len = (int)(s - buf) + 3; + } + + return len; +} + + +#if !defined(NO_CACHING) +/* Convert month to the month number. Return -1 on error, or month number */ +static int +get_month_index(const char *s) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(month_names); i++) { + if (!strcmp(s, month_names[i])) { + return (int)i; + } + } + + return -1; +} + + +/* Parse UTC date-time string, and return the corresponding time_t value. */ +static time_t +parse_date_string(const char *datetime) +{ + char month_str[32] = {0}; + int second, minute, hour, day, month, year; + time_t result = (time_t)0; + struct tm tm; + + if ((sscanf(datetime, + "%d/%3s/%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) + || (sscanf(datetime, + "%*3s, %d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d-%3s-%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6)) { + month = get_month_index(month_str); + if ((month >= 0) && (year >= 1970)) { + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year - 1900; + tm.tm_mon = month; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = minute; + tm.tm_sec = second; + result = timegm(&tm); + } + } + + return result; +} +#endif /* !NO_CACHING */ + + +/* Protect against directory disclosure attack by removing '..', + * excessive '/' and '\' characters */ +static void +remove_double_dots_and_double_slashes(char *s) +{ + char *p = s; + + while (*s != '\0') { + *p++ = *s++; + if (s[-1] == '/' || s[-1] == '\\') { + /* Skip all following slashes, backslashes and double-dots */ + while (s[0] != '\0') { + if (s[0] == '/' || s[0] == '\\') { + s++; + } else if (s[0] == '.' && s[1] == '.') { + s += 2; + } else { + break; + } + } + } + } + *p = '\0'; +} + + +static const struct { + const char *extension; + size_t ext_len; + const char *mime_type; +} builtin_mime_types[] = { + /* IANA registered MIME types (http://www.iana.org/assignments/media-types) + * application types */ + {".doc", 4, "application/msword"}, + {".eps", 4, "application/postscript"}, + {".exe", 4, "application/octet-stream"}, + {".js", 3, "application/javascript"}, + {".json", 5, "application/json"}, + {".pdf", 4, "application/pdf"}, + {".ps", 3, "application/postscript"}, + {".rtf", 4, "application/rtf"}, + {".xhtml", 6, "application/xhtml+xml"}, + {".xsl", 4, "application/xml"}, + {".xslt", 5, "application/xml"}, + + /* fonts */ + {".ttf", 4, "application/font-sfnt"}, + {".cff", 4, "application/font-sfnt"}, + {".otf", 4, "application/font-sfnt"}, + {".aat", 4, "application/font-sfnt"}, + {".sil", 4, "application/font-sfnt"}, + {".pfr", 4, "application/font-tdpfr"}, + {".woff", 5, "application/font-woff"}, + + /* audio */ + {".mp3", 4, "audio/mpeg"}, + {".oga", 4, "audio/ogg"}, + {".ogg", 4, "audio/ogg"}, + + /* image */ + {".gif", 4, "image/gif"}, + {".ief", 4, "image/ief"}, + {".jpeg", 5, "image/jpeg"}, + {".jpg", 4, "image/jpeg"}, + {".jpm", 4, "image/jpm"}, + {".jpx", 4, "image/jpx"}, + {".png", 4, "image/png"}, + {".svg", 4, "image/svg+xml"}, + {".tif", 4, "image/tiff"}, + {".tiff", 5, "image/tiff"}, + + /* model */ + {".wrl", 4, "model/vrml"}, + + /* text */ + {".css", 4, "text/css"}, + {".csv", 4, "text/csv"}, + {".htm", 4, "text/html"}, + {".html", 5, "text/html"}, + {".sgm", 4, "text/sgml"}, + {".shtm", 5, "text/html"}, + {".shtml", 6, "text/html"}, + {".txt", 4, "text/plain"}, + {".xml", 4, "text/xml"}, + + /* video */ + {".mov", 4, "video/quicktime"}, + {".mp4", 4, "video/mp4"}, + {".mpeg", 5, "video/mpeg"}, + {".mpg", 4, "video/mpeg"}, + {".ogv", 4, "video/ogg"}, + {".qt", 3, "video/quicktime"}, + + /* not registered types + * (http://reference.sitepoint.com/html/mime-types-full, + * http://www.hansenb.pdx.edu/DMKB/dict/tutorials/mime_typ.php, ..) */ + {".arj", 4, "application/x-arj-compressed"}, + {".gz", 3, "application/x-gunzip"}, + {".rar", 4, "application/x-arj-compressed"}, + {".swf", 4, "application/x-shockwave-flash"}, + {".tar", 4, "application/x-tar"}, + {".tgz", 4, "application/x-tar-gz"}, + {".torrent", 8, "application/x-bittorrent"}, + {".ppt", 4, "application/x-mspowerpoint"}, + {".xls", 4, "application/x-msexcel"}, + {".zip", 4, "application/x-zip-compressed"}, + {".aac", + 4, + "audio/aac"}, /* http://en.wikipedia.org/wiki/Advanced_Audio_Coding */ + {".aif", 4, "audio/x-aif"}, + {".m3u", 4, "audio/x-mpegurl"}, + {".mid", 4, "audio/x-midi"}, + {".ra", 3, "audio/x-pn-realaudio"}, + {".ram", 4, "audio/x-pn-realaudio"}, + {".wav", 4, "audio/x-wav"}, + {".bmp", 4, "image/bmp"}, + {".ico", 4, "image/x-icon"}, + {".pct", 4, "image/x-pct"}, + {".pict", 5, "image/pict"}, + {".rgb", 4, "image/x-rgb"}, + {".webm", 5, "video/webm"}, /* http://en.wikipedia.org/wiki/WebM */ + {".asf", 4, "video/x-ms-asf"}, + {".avi", 4, "video/x-msvideo"}, + {".m4v", 4, "video/x-m4v"}, + {NULL, 0, NULL}}; + + +const char * +mg_get_builtin_mime_type(const char *path) +{ + const char *ext; + size_t i, path_len; + + path_len = strlen(path); + + for (i = 0; builtin_mime_types[i].extension != NULL; i++) { + ext = path + (path_len - builtin_mime_types[i].ext_len); + if (path_len > builtin_mime_types[i].ext_len + && mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { + return builtin_mime_types[i].mime_type; + } + } + + return "text/plain"; +} + + +/* Look at the "path" extension and figure what mime type it has. + * Store mime type in the vector. */ +static void +get_mime_type(struct mg_context *ctx, const char *path, struct vec *vec) +{ + struct vec ext_vec, mime_vec; + const char *list, *ext; + size_t path_len; + + path_len = strlen(path); + + if (ctx == NULL || vec == NULL) { + return; + } + + /* Scan user-defined mime types first, in case user wants to + * override default mime types. */ + list = ctx->config[EXTRA_MIME_TYPES]; + while ((list = next_option(list, &ext_vec, &mime_vec)) != NULL) { + /* ext now points to the path suffix */ + ext = path + path_len - ext_vec.len; + if (mg_strncasecmp(ext, ext_vec.ptr, ext_vec.len) == 0) { + *vec = mime_vec; + return; + } + } + + vec->ptr = mg_get_builtin_mime_type(path); + vec->len = strlen(vec->ptr); +} + + +/* Stringify binary data. Output buffer must be twice as big as input, + * because each byte takes 2 bytes in string representation */ +static void +bin2str(char *to, const unsigned char *p, size_t len) +{ + static const char *hex = "0123456789abcdef"; + + for (; len--; p++) { + *to++ = hex[p[0] >> 4]; + *to++ = hex[p[0] & 0x0f]; + } + *to = '\0'; +} + + +/* Return stringified MD5 hash for list of strings. Buffer must be 33 bytes. */ +char * +mg_md5(char buf[33], ...) +{ + md5_byte_t hash[16]; + const char *p; + va_list ap; + md5_state_t ctx; + + md5_init(&ctx); + + va_start(ap, buf); + while ((p = va_arg(ap, const char *)) != NULL) { + md5_append(&ctx, (const md5_byte_t *)p, strlen(p)); + } + va_end(ap); + + md5_finish(&ctx, hash); + bin2str(buf, hash, sizeof(hash)); + return buf; +} + + +/* Check the user's password, return 1 if OK */ +static int +check_password(const char *method, + const char *ha1, + const char *uri, + const char *nonce, + const char *nc, + const char *cnonce, + const char *qop, + const char *response) +{ + char ha2[32 + 1], expected_response[32 + 1]; + + /* Some of the parameters may be NULL */ + if (method == NULL || nonce == NULL || nc == NULL || cnonce == NULL + || qop == NULL + || response == NULL) { + return 0; + } + + /* NOTE(lsm): due to a bug in MSIE, we do not compare the URI */ + if (strlen(response) != 32) { + return 0; + } + + mg_md5(ha2, method, ":", uri, NULL); + mg_md5(expected_response, + ha1, + ":", + nonce, + ":", + nc, + ":", + cnonce, + ":", + qop, + ":", + ha2, + NULL); + + return mg_strcasecmp(response, expected_response) == 0; +} + + +/* Use the global passwords file, if specified by auth_gpass option, + * or search for .htpasswd in the requested directory. */ +static void +open_auth_file(struct mg_connection *conn, const char *path, struct file *filep) +{ + if (conn != NULL && conn->ctx != NULL) { + char name[PATH_MAX]; + const char *p, *e, *gpass = conn->ctx->config[GLOBAL_PASSWORDS_FILE]; + struct file file = STRUCT_FILE_INITIALIZER; + int truncated; + + if (gpass != NULL) { + /* Use global passwords file */ + if (!mg_fopen(conn, gpass, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", gpass, strerror(ERRNO)); +#endif + } + /* Important: using local struct file to test path for is_directory + * flag. If filep is used, mg_stat() makes it appear as if auth file + * was opened. */ + } else if (mg_stat(conn, path, &file) && file.is_directory) { + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%s/%s", + path, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } else { + /* Try to find .htpasswd in requested directory. */ + for (p = path, e = p + strlen(p) - 1; e > p; e--) { + if (e[0] == '/') { + break; + } + } + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%.*s/%s", + (int)(e - p), + p, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } + } +} + + +/* Parsed Authorization header */ +struct ah { + char *user, *uri, *cnonce, *response, *qop, *nc, *nonce; +}; + + +/* Return 1 on success. Always initializes the ah structure. */ +static int +parse_auth_header(struct mg_connection *conn, + char *buf, + size_t buf_size, + struct ah *ah) +{ + char *name, *value, *s; + const char *auth_header; + uint64_t nonce; + + if (!ah || !conn) { + return 0; + } + + (void)memset(ah, 0, sizeof(*ah)); + if ((auth_header = mg_get_header(conn, "Authorization")) == NULL + || mg_strncasecmp(auth_header, "Digest ", 7) != 0) { + return 0; + } + + /* Make modifiable copy of the auth header */ + (void)mg_strlcpy(buf, auth_header + 7, buf_size); + s = buf; + + /* Parse authorization header */ + for (;;) { + /* Gobble initial spaces */ + while (isspace(*(unsigned char *)s)) { + s++; + } + name = skip_quoted(&s, "=", " ", 0); + /* Value is either quote-delimited, or ends at first comma or space. */ + if (s[0] == '\"') { + s++; + value = skip_quoted(&s, "\"", " ", '\\'); + if (s[0] == ',') { + s++; + } + } else { + value = skip_quoted(&s, ", ", " ", 0); /* IE uses commas, FF uses + * spaces */ + } + if (*name == '\0') { + break; + } + + if (!strcmp(name, "username")) { + ah->user = value; + } else if (!strcmp(name, "cnonce")) { + ah->cnonce = value; + } else if (!strcmp(name, "response")) { + ah->response = value; + } else if (!strcmp(name, "uri")) { + ah->uri = value; + } else if (!strcmp(name, "qop")) { + ah->qop = value; + } else if (!strcmp(name, "nc")) { + ah->nc = value; + } else if (!strcmp(name, "nonce")) { + ah->nonce = value; + } + } + +#ifndef NO_NONCE_CHECK + /* Read the nonce from the response. */ + if (ah->nonce == NULL) { + return 0; + } + s = NULL; + nonce = strtoull(ah->nonce, &s, 10); + if ((s == NULL) || (*s != 0)) { + return 0; + } + + /* Convert the nonce from the client to a number. */ + nonce ^= conn->ctx->auth_nonce_mask; + + /* The converted number corresponds to the time the nounce has been + * created. This should not be earlier than the server start. */ + /* Server side nonce check is valuable in all situations but one: + * if the server restarts frequently, but the client should not see + * that, so the server should accept nonces from previous starts. */ + /* However, the reasonable default is to not accept a nonce from a + * previous start, so if anyone changed the access rights between + * two restarts, a new login is required. */ + if (nonce < (uint64_t)conn->ctx->start_time) { + /* nonce is from a previous start of the server and no longer valid + * (replay attack?) */ + return 0; + } + /* Check if the nonce is too high, so it has not (yet) been used by the + * server. */ + if (nonce >= ((uint64_t)conn->ctx->start_time + conn->ctx->nonce_count)) { + return 0; + } +#endif + + /* CGI needs it as REMOTE_USER */ + if (ah->user != NULL) { + conn->request_info.remote_user = mg_strdup(ah->user); + } else { + return 0; + } + + return 1; +} + + +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p) +{ + const char *eof; + size_t len; + const char *memend; + + if (!filep) { + return NULL; + } + + if (filep->membuf != NULL && *p != NULL) { + memend = (const char *)&filep->membuf[filep->size]; + /* Search for \n from p till the end of stream */ + eof = (char *)memchr(*p, '\n', (size_t)(memend - *p)); + if (eof != NULL) { + eof += 1; /* Include \n */ + } else { + eof = memend; /* Copy remaining data */ + } + len = (size_t)(eof - *p) > size - 1 ? size - 1 : (size_t)(eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p += len; + return len ? eof : NULL; + } else if (filep->fp != NULL) { + return fgets(buf, (int)size, filep->fp); + } else { + return NULL; + } +} + +struct read_auth_file_struct { + struct mg_connection *conn; + struct ah ah; + char *domain; + char buf[256 + 256 + 40]; + char *f_user; + char *f_domain; + char *f_ha1; +}; + + +static int +read_auth_file(struct file *filep, struct read_auth_file_struct *workdata) +{ + char *p; + int is_authorized = 0; + struct file fp; + size_t l; + + if (!filep || !workdata) { + return 0; + } + + /* Loop over passwords file */ + p = (char *)filep->membuf; + while (mg_fgets(workdata->buf, sizeof(workdata->buf), filep, &p) != NULL) { + l = strlen(workdata->buf); + while (l > 0) { + if (isspace(workdata->buf[l - 1]) + || iscntrl(workdata->buf[l - 1])) { + l--; + workdata->buf[l] = 0; + } else + break; + } + if (l < 1) { + continue; + } + + workdata->f_user = workdata->buf; + + if (workdata->f_user[0] == ':') { + /* user names may not contain a ':' and may not be empty, + * so lines starting with ':' may be used for a special purpose */ + if (workdata->f_user[1] == '#') { + /* :# is a comment */ + continue; + } else if (!strncmp(workdata->f_user + 1, "include=", 8)) { + if (mg_fopen(workdata->conn, workdata->f_user + 9, "r", &fp)) { + is_authorized = read_auth_file(&fp, workdata); + mg_fclose(&fp); + } else { + mg_cry(workdata->conn, + "%s: cannot open authorization file: %s", + __func__, + workdata->buf); + } + continue; + } + /* everything is invalid for the moment (might change in the + * future) */ + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + + workdata->f_domain = strchr(workdata->f_user, ':'); + if (workdata->f_domain == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_domain) = 0; + (workdata->f_domain)++; + + workdata->f_ha1 = strchr(workdata->f_domain, ':'); + if (workdata->f_ha1 == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_ha1) = 0; + (workdata->f_ha1)++; + + if (!strcmp(workdata->ah.user, workdata->f_user) + && !strcmp(workdata->domain, workdata->f_domain)) { + return check_password(workdata->conn->request_info.request_method, + workdata->f_ha1, + workdata->ah.uri, + workdata->ah.nonce, + workdata->ah.nc, + workdata->ah.cnonce, + workdata->ah.qop, + workdata->ah.response); + } + } + + return is_authorized; +} + + +/* Authorize against the opened passwords file. Return 1 if authorized. */ +static int +authorize(struct mg_connection *conn, struct file *filep) +{ + struct read_auth_file_struct workdata; + char buf[MG_BUF_LEN]; + + if (!conn || !conn->ctx) { + return 0; + } + + memset(&workdata, 0, sizeof(workdata)); + workdata.conn = conn; + + if (!parse_auth_header(conn, buf, sizeof(buf), &workdata.ah)) { + return 0; + } + workdata.domain = conn->ctx->config[AUTHENTICATION_DOMAIN]; + + return read_auth_file(filep, &workdata); +} + + +/* Return 1 if request is authorised, 0 otherwise. */ +static int +check_authorization(struct mg_connection *conn, const char *path) +{ + char fname[PATH_MAX]; + struct vec uri_vec, filename_vec; + const char *list; + struct file file = STRUCT_FILE_INITIALIZER; + int authorized = 1, truncated; + + if (!conn || !conn->ctx) { + return 0; + } + + list = conn->ctx->config[PROTECT_URI]; + while ((list = next_option(list, &uri_vec, &filename_vec)) != NULL) { + if (!memcmp(conn->request_info.local_uri, uri_vec.ptr, uri_vec.len)) { + mg_snprintf(conn, + &truncated, + fname, + sizeof(fname), + "%.*s", + (int)filename_vec.len, + filename_vec.ptr); + + if (truncated || !mg_fopen(conn, fname, "r", &file)) { + mg_cry(conn, + "%s: cannot open %s: %s", + __func__, + fname, + strerror(errno)); + } + break; + } + } + + if (!is_file_opened(&file)) { + open_auth_file(conn, path, &file); + } + + if (is_file_opened(&file)) { + authorized = authorize(conn, &file); + mg_fclose(&file); + } + + return authorized; +} + + +static void +send_authorization_request(struct mg_connection *conn) +{ + char date[64]; + time_t curtime = time(NULL); + + if (conn && conn->ctx) { + uint64_t nonce = (uint64_t)(conn->ctx->start_time); + + (void)pthread_mutex_lock(&conn->ctx->nonce_mutex); + nonce += conn->ctx->nonce_count; + ++conn->ctx->nonce_count; + (void)pthread_mutex_unlock(&conn->ctx->nonce_mutex); + + nonce ^= conn->ctx->auth_nonce_mask; + conn->status_code = 401; + conn->must_close = 1; + + gmt_time_string(date, sizeof(date), &curtime); + + mg_printf(conn, "HTTP/1.1 401 Unauthorized\r\n"); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: %s\r\n" + "Content-Length: 0\r\n" + "WWW-Authenticate: Digest qop=\"auth\", realm=\"%s\", " + "nonce=\"%" UINT64_FMT "\"\r\n\r\n", + date, + suggest_connection_header(conn), + conn->ctx->config[AUTHENTICATION_DOMAIN], + nonce); + } +} + + +#if !defined(NO_FILES) +static int +is_authorized_for_put(struct mg_connection *conn) +{ + if (conn) { + struct file file = STRUCT_FILE_INITIALIZER; + const char *passfile = conn->ctx->config[PUT_DELETE_PASSWORDS_FILE]; + int ret = 0; + + if (passfile != NULL && mg_fopen(conn, passfile, "r", &file)) { + ret = authorize(conn, &file); + mg_fclose(&file); + } + + return ret; + } + return 0; +} +#endif + + +int +mg_modify_passwords_file(const char *fname, + const char *domain, + const char *user, + const char *pass) +{ + int found, i; + char line[512], u[512] = "", d[512] = "", ha1[33], tmp[PATH_MAX + 8]; + FILE *fp, *fp2; + + found = 0; + fp = fp2 = NULL; + + /* Regard empty password as no password - remove user record. */ + if (pass != NULL && pass[0] == '\0') { + pass = NULL; + } + + /* Other arguments must not be empty */ + if (fname == NULL || domain == NULL || user == NULL) { + return 0; + } + + /* Using the given file format, user name and domain must not contain ':' + */ + if (strchr(user, ':') != NULL) { + return 0; + } + if (strchr(domain, ':') != NULL) { + return 0; + } + + /* Do not allow control characters like newline in user name and domain. + * Do not allow excessively long names either. */ + for (i = 0; i < 255 && user[i] != 0; i++) { + if (iscntrl(user[i])) { + return 0; + } + } + if (user[i]) { + return 0; + } + for (i = 0; i < 255 && domain[i] != 0; i++) { + if (iscntrl(domain[i])) { + return 0; + } + } + if (domain[i]) { + return 0; + } + + /* The maximum length of the path to the password file is limited */ + if ((strlen(fname) + 4) >= PATH_MAX) { + return 0; + } + + /* Create a temporary file name. Length has been checked before. */ + strcpy(tmp, fname); + strcat(tmp, ".tmp"); + + /* Create the file if does not exist */ + /* Use of fopen here is OK, since fname is only ASCII */ + if ((fp = fopen(fname, "a+")) != NULL) { + (void)fclose(fp); + } + + /* Open the given file and temporary file */ + if ((fp = fopen(fname, "r")) == NULL) { + return 0; + } else if ((fp2 = fopen(tmp, "w+")) == NULL) { + fclose(fp); + return 0; + } + + /* Copy the stuff to temporary file */ + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%255[^:]:%255[^:]:%*s", u, d) != 2) { + continue; + } + u[255] = 0; + d[255] = 0; + + if (!strcmp(u, user) && !strcmp(d, domain)) { + found++; + if (pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + } else { + fprintf(fp2, "%s", line); + } + } + + /* If new user, just add it */ + if (!found && pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + + /* Close files */ + fclose(fp); + fclose(fp2); + + /* Put the temp file in place of real file */ + IGNORE_UNUSED_RESULT(remove(fname)); + IGNORE_UNUSED_RESULT(rename(tmp, fname)); + + return 1; +} + + +static int +is_valid_port(unsigned long port) +{ + return port < 0xffff; +} + + +static int +mg_inet_pton(int af, const char *src, void *dst, size_t dstlen) +{ + struct addrinfo hints, *res, *ressave; + int func_ret = 0; + int gai_ret; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = af; + + gai_ret = getaddrinfo(src, NULL, &hints, &res); + if (gai_ret != 0) { + /* gai_strerror could be used to convert gai_ret to a string */ + /* POSIX return values: see + * http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html + */ + /* Windows return values: see + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx + */ + return 0; + } + + ressave = res; + + while (res) { + if (dstlen >= res->ai_addrlen) { + memcpy(dst, res->ai_addr, res->ai_addrlen); + func_ret = 1; + } + res = res->ai_next; + } + + freeaddrinfo(ressave); + return func_ret; +} + + +static int +connect_socket(struct mg_context *ctx /* may be NULL */, + const char *host, + int port, + int use_ssl, + char *ebuf, + size_t ebuf_len, + SOCKET *sock /* output: socket, must not be NULL */, + union usa *sa /* output: socket address, must not be NULL */ + ) +{ + int ip_ver = 0; + *sock = INVALID_SOCKET; + memset(sa, 0, sizeof(*sa)); + + if (ebuf_len > 0) { + *ebuf = 0; + } + + if (host == NULL) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "NULL host"); + return 0; + } + + if (port < 0 || !is_valid_port((unsigned)port)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "invalid port"); + return 0; + } + + if (use_ssl && (SSLv23_client_method == NULL)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "SSL is not initialized"); + return 0; + } + + if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) { + sa->sin.sin_port = htons((uint16_t)port); + ip_ver = 4; +#ifdef USE_IPV6 + } else if (mg_inet_pton(AF_INET6, host, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } else if (host[0] == '[') { + /* While getaddrinfo on Windows will work with [::1], + * getaddrinfo on Linux only works with ::1 (without []). */ + size_t l = strlen(host + 1); + char *h = l > 1 ? mg_strdup(host + 1) : NULL; + if (h) { + h[l - 1] = 0; + if (mg_inet_pton(AF_INET6, h, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } + mg_free(h); + } +#endif + } + + if (ip_ver == 0) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "host not found"); + return 0; + } + + if (ip_ver == 4) { + *sock = socket(PF_INET, SOCK_STREAM, 0); + } +#ifdef USE_IPV6 + else if (ip_ver == 6) { + *sock = socket(PF_INET6, SOCK_STREAM, 0); + } +#endif + + if (*sock == INVALID_SOCKET) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "socket(): %s", + strerror(ERRNO)); + return 0; + } + + set_close_on_exec(*sock, fc(ctx)); + + if ((ip_ver == 4) + && (connect(*sock, (struct sockaddr *)&sa->sin, sizeof(sa->sin)) + == 0)) { + /* connected with IPv4 */ + return 1; + } + +#ifdef USE_IPV6 + if ((ip_ver == 6) + && (connect(*sock, (struct sockaddr *)&sa->sin6, sizeof(sa->sin6)) + == 0)) { + /* connected with IPv6 */ + return 1; + } +#endif + + /* Not connected */ + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "connect(%s:%d): %s", + host, + port, + strerror(ERRNO)); + closesocket(*sock); + *sock = INVALID_SOCKET; + return 0; +} + + +int +mg_url_encode(const char *src, char *dst, size_t dst_len) +{ + static const char *dont_escape = "._-$,;~()"; + static const char *hex = "0123456789abcdef"; + char *pos = dst; + const char *end = dst + dst_len - 1; + + for (; *src != '\0' && pos < end; src++, pos++) { + if (isalnum(*(const unsigned char *)src) + || strchr(dont_escape, *(const unsigned char *)src) != NULL) { + *pos = *src; + } else if (pos + 2 < end) { + pos[0] = '%'; + pos[1] = hex[(*(const unsigned char *)src) >> 4]; + pos[2] = hex[(*(const unsigned char *)src) & 0xf]; + pos += 2; + } else { + break; + } + } + + *pos = '\0'; + return (*src == '\0') ? (int)(pos - dst) : -1; +} + + +static void +print_dir_entry(struct de *de) +{ + char size[64], mod[64], href[PATH_MAX]; + struct tm *tm; + + if (de->file.is_directory) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%s", + "[DIRECTORY]"); + } else { + /* We use (signed) cast below because MSVC 6 compiler cannot + * convert unsigned __int64 to double. Sigh. */ + if (de->file.size < 1024) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%d", + (int)de->file.size); + } else if (de->file.size < 0x100000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fk", + (double)de->file.size / 1024.0); + } else if (de->file.size < 0x40000000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fM", + (double)de->file.size / 1048576); + } else { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fG", + (double)de->file.size / 1073741824); + } + } + + /* Note: mg_snprintf will not cause a buffer overflow above. + * So, string truncation checks are not required here. */ + + tm = localtime(&de->file.last_modified); + if (tm != NULL) { + strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", tm); + } else { + mg_strlcpy(mod, "01-Jan-1970 00:00", sizeof(mod)); + mod[sizeof(mod) - 1] = '\0'; + } + mg_url_encode(de->file_name, href, sizeof(href)); + de->conn->num_bytes_sent += + mg_printf(de->conn, + "%s%s" + " %s  %s\n", + de->conn->request_info.local_uri, + href, + de->file.is_directory ? "/" : "", + de->file_name, + de->file.is_directory ? "/" : "", + mod, + size); +} + + +/* This function is called from send_directory() and used for + * sorting directory entries by size, or name, or modification time. + * On windows, __cdecl specification is needed in case if project is built + * with __stdcall convention. qsort always requires __cdels callback. */ +static int WINCDECL +compare_dir_entries(const void *p1, const void *p2) +{ + if (p1 && p2) { + const struct de *a = (const struct de *)p1, *b = (const struct de *)p2; + const char *query_string = a->conn->request_info.query_string; + int cmp_result = 0; + + if (query_string == NULL) { + query_string = "na"; + } + + if (a->file.is_directory && !b->file.is_directory) { + return -1; /* Always put directories on top */ + } else if (!a->file.is_directory && b->file.is_directory) { + return 1; /* Always put directories on top */ + } else if (*query_string == 'n') { + cmp_result = strcmp(a->file_name, b->file_name); + } else if (*query_string == 's') { + cmp_result = a->file.size == b->file.size + ? 0 + : a->file.size > b->file.size ? 1 : -1; + } else if (*query_string == 'd') { + cmp_result = + (a->file.last_modified == b->file.last_modified) + ? 0 + : ((a->file.last_modified > b->file.last_modified) ? 1 + : -1); + } + + return query_string[1] == 'd' ? -cmp_result : cmp_result; + } + return 0; +} + + +static int +must_hide_file(struct mg_connection *conn, const char *path) +{ + if (conn && conn->ctx) { + const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; + const char *pattern = conn->ctx->config[HIDE_FILES]; + return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 + || (pattern != NULL + && match_prefix(pattern, strlen(pattern), path) > 0); + } + return 0; +} + + +static int +scan_directory(struct mg_connection *conn, + const char *dir, + void *data, + void (*cb)(struct de *, void *)) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir and hidden files */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") + || must_hide_file(conn, dp->d_name)) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* If the path is not complete, skip processing. */ + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + de.file_name = dp->d_name; + cb(&de, data); + } + (void)mg_closedir(dirp); + } + return 1; +} + + +#if !defined(NO_FILES) +static int +remove_directory(struct mg_connection *conn, const char *dir) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + int ok = 1; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir (but show hidden files as they will + * also be removed) */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* Do not delete anything shorter */ + ok = 0; + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + ok = 0; + } + if (de.file.membuf == NULL) { + /* file is not in memory */ + if (de.file.is_directory) { + if (remove_directory(conn, path) == 0) { + ok = 0; + } + } else { + if (mg_remove(conn, path) == 0) { + ok = 0; + } + } + } else { + /* file is in memory. It can not be deleted. */ + ok = 0; + } + } + (void)mg_closedir(dirp); + + IGNORE_UNUSED_RESULT(rmdir(dir)); + } + + return ok; +} +#endif + + +struct dir_scan_data { + struct de *entries; + unsigned int num_entries; + unsigned int arr_size; +}; + + +/* Behaves like realloc(), but frees original pointer on failure */ +static void * +realloc2(void *ptr, size_t size) +{ + void *new_ptr = mg_realloc(ptr, size); + if (new_ptr == NULL) { + mg_free(ptr); + } + return new_ptr; +} + + +static void +dir_scan_callback(struct de *de, void *data) +{ + struct dir_scan_data *dsd = (struct dir_scan_data *)data; + + if (dsd->entries == NULL || dsd->num_entries >= dsd->arr_size) { + dsd->arr_size *= 2; + dsd->entries = + (struct de *)realloc2(dsd->entries, + dsd->arr_size * sizeof(dsd->entries[0])); + } + if (dsd->entries == NULL) { + /* TODO(lsm, low): propagate an error to the caller */ + dsd->num_entries = 0; + } else { + dsd->entries[dsd->num_entries].file_name = mg_strdup(de->file_name); + dsd->entries[dsd->num_entries].file = de->file; + dsd->entries[dsd->num_entries].conn = de->conn; + dsd->num_entries++; + } +} + + +static void +handle_directory_request(struct mg_connection *conn, const char *dir) +{ + unsigned int i; + int sort_direction; + struct dir_scan_data data = {NULL, 0, 128}; + char date[64]; + time_t curtime = time(NULL); + + if (!scan_directory(conn, dir, &data, dir_scan_callback)) { + send_http_error(conn, + 500, + "Error: Cannot open directory\nopendir(%s): %s", + dir, + strerror(ERRNO)); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + + if (!conn) { + return; + } + + sort_direction = conn->request_info.query_string != NULL + && conn->request_info.query_string[1] == 'd' + ? 'a' + : 'd'; + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 200 OK\r\n"); + send_static_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n" + "Content-Type: text/html; charset=utf-8\r\n\r\n", + date); + + conn->num_bytes_sent += + mg_printf(conn, + "Index of %s" + "" + "

Index of %s

"
+	              ""
+	              ""
+	              ""
+	              "",
+	              conn->request_info.local_uri,
+	              conn->request_info.local_uri,
+	              sort_direction,
+	              sort_direction,
+	              sort_direction);
+
+	/* Print first entry - link to a parent directory */
+	conn->num_bytes_sent +=
+	    mg_printf(conn,
+	              ""
+	              "\n",
+	              conn->request_info.local_uri,
+	              "..",
+	              "Parent directory",
+	              "-",
+	              "-");
+
+	/* Sort and print directory entries */
+	if (data.entries != NULL) {
+		qsort(data.entries,
+		      (size_t)data.num_entries,
+		      sizeof(data.entries[0]),
+		      compare_dir_entries);
+		for (i = 0; i < data.num_entries; i++) {
+			print_dir_entry(&data.entries[i]);
+			mg_free(data.entries[i].file_name);
+		}
+		mg_free(data.entries);
+	}
+
+	conn->num_bytes_sent += mg_printf(conn, "%s", "
NameModifiedSize

%s %s  %s
"); + conn->status_code = 200; +} + + +/* Send len bytes from the opened file to the client. */ +static void +send_file_data(struct mg_connection *conn, + struct file *filep, + int64_t offset, + int64_t len) +{ + char buf[MG_BUF_LEN]; + int to_read, num_read, num_written; + int64_t size; + + if (!filep || !conn) { + return; + } + + /* Sanity check the offset */ + size = filep->size > INT64_MAX ? INT64_MAX : (int64_t)(filep->size); + offset = offset < 0 ? 0 : offset > size ? size : offset; + + if (len > 0 && filep->membuf != NULL && size > 0) { + /* file stored in memory */ + if (len > size - offset) { + len = size - offset; + } + mg_write(conn, filep->membuf + offset, (size_t)len); + } else if (len > 0 && filep->fp != NULL) { +/* file stored on disk */ +#if defined(__linux__) + /* sendfile is only available for Linux */ + if (conn->throttle == 0 && conn->ssl == 0) { + off_t sf_offs = (off_t)offset; + ssize_t sf_sent; + int sf_file = fileno(filep->fp); + int loop_cnt = 0; + + do { + /* 2147479552 (0x7FFFF000) is a limit found by experiment on + * 64 bit Linux (2^31 minus one memory page of 4k?). */ + size_t sf_tosend = + (size_t)((len < 0x7FFFF000) ? len : 0x7FFFF000); + sf_sent = + sendfile(conn->client.sock, sf_file, &sf_offs, sf_tosend); + if (sf_sent > 0) { + conn->num_bytes_sent += sf_sent; + len -= sf_sent; + offset += sf_sent; + } else if (loop_cnt == 0) { + /* This file can not be sent using sendfile. + * This might be the case for pseudo-files in the + * /sys/ and /proc/ file system. + * Use the regular user mode copy code instead. */ + break; + } else if (sf_sent == 0) { + /* No error, but 0 bytes sent. May be EOF? */ + return; + } + loop_cnt++; + + } while ((len > 0) && (sf_sent >= 0)); + + if (sf_sent > 0) { + return; /* OK */ + } + + /* sf_sent<0 means error, thus fall back to the classic way */ + /* This is always the case, if sf_file is not a "normal" file, + * e.g., for sending data from the output of a CGI process. */ + offset = (int64_t)sf_offs; + } +#endif + if ((offset > 0) && (fseeko(filep->fp, offset, SEEK_SET) != 0)) { + mg_cry(conn, "%s: fseeko() failed: %s", __func__, strerror(ERRNO)); + send_http_error( + conn, + 500, + "%s", + "Error: Unable to access file at requested position."); + } else { + while (len > 0) { + /* Calculate how much to read from the file in the buffer */ + to_read = sizeof(buf); + if ((int64_t)to_read > len) { + to_read = (int)len; + } + + /* Read from file, exit the loop on error */ + if ((num_read = (int)fread(buf, 1, (size_t)to_read, filep->fp)) + <= 0) { + break; + } + + /* Send read bytes to the client, exit the loop on error */ + if ((num_written = mg_write(conn, buf, (size_t)num_read)) + != num_read) { + break; + } + + /* Both read and were successful, adjust counters */ + conn->num_bytes_sent += num_written; + len -= num_written; + } + } + } +} + + +static int +parse_range_header(const char *header, int64_t *a, int64_t *b) +{ + return sscanf(header, "bytes=%" INT64_FMT "-%" INT64_FMT, a, b); +} + + +static void +construct_etag(char *buf, size_t buf_len, const struct file *filep) +{ + if (filep != NULL && buf != NULL) { + mg_snprintf(NULL, + NULL, /* All calls to construct_etag use 64 byte buffer */ + buf, + buf_len, + "\"%lx.%" INT64_FMT "\"", + (unsigned long)filep->last_modified, + filep->size); + } +} + + +static void +fclose_on_exec(struct file *filep, struct mg_connection *conn) +{ + if (filep != NULL && filep->fp != NULL) { +#ifdef _WIN32 + (void)conn; /* Unused. */ +#else + if (fcntl(fileno(filep->fp), F_SETFD, FD_CLOEXEC) != 0) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } +#endif + } +} + + +static void +handle_static_file_request(struct mg_connection *conn, + const char *path, + struct file *filep, + const char *mime_type) +{ + char date[64], lm[64], etag[64]; + char range[128]; /* large enough, so there will be no overflow */ + const char *msg = "OK", *hdr; + time_t curtime = time(NULL); + int64_t cl, r1, r2; + struct vec mime_vec; + int n, truncated; + char gz_path[PATH_MAX]; + const char *encoding = ""; + const char *cors1, *cors2, *cors3; + + if (conn == NULL || conn->ctx == NULL || filep == NULL) { + return; + } + + if (mime_type == NULL) { + get_mime_type(conn->ctx, path, &mime_vec); + } else { + mime_vec.ptr = mime_type; + mime_vec.len = strlen(mime_type); + } + if (filep->size > INT64_MAX) { + send_http_error(conn, + 500, + "Error: File size is too large to send\n%" INT64_FMT, + filep->size); + } + cl = (int64_t)filep->size; + conn->status_code = 200; + range[0] = '\0'; + + /* if this file is in fact a pre-gzipped file, rewrite its filename + * it's important to rewrite the filename after resolving + * the mime type from it, to preserve the actual file's type */ + if (filep->gzipped) { + mg_snprintf(conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", path); + + if (truncated) { + send_http_error(conn, + 500, + "Error: Path of zipped file too long (%s)", + path); + return; + } + + path = gz_path; + encoding = "Content-Encoding: gzip\r\n"; + } + + if (!mg_fopen(conn, path, "rb", filep)) { + send_http_error(conn, + 500, + "Error: Cannot open file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(filep, conn); + + /* If Range: header specified, act accordingly */ + r1 = r2 = 0; + hdr = mg_get_header(conn, "Range"); + if (hdr != NULL && (n = parse_range_header(hdr, &r1, &r2)) > 0 && r1 >= 0 + && r2 >= 0) { + /* actually, range requests don't play well with a pre-gzipped + * file (since the range is specified in the uncompressed space) */ + if (filep->gzipped) { + send_http_error( + conn, + 501, + "%s", + "Error: Range requests in gzipped files are not supported"); + mg_fclose(filep); + return; + } + conn->status_code = 206; + cl = n == 2 ? (r2 > cl ? cl : r2) - r1 + 1 : cl - r1; + mg_snprintf(conn, + NULL, /* range buffer is big enough */ + range, + sizeof(range), + "Content-Range: bytes " + "%" INT64_FMT "-%" INT64_FMT "/%" INT64_FMT "\r\n", + r1, + r1 + cl - 1, + filep->size); + msg = "Partial Content"; + } + + hdr = mg_get_header(conn, "Origin"); + if (hdr) { + /* Cross-origin resource sharing (CORS), see + * http://www.html5rocks.com/en/tutorials/cors/, + * http://www.html5rocks.com/static/images/cors_server_flowchart.png - + * preflight is not supported for files. */ + cors1 = "Access-Control-Allow-Origin: "; + cors2 = conn->ctx->config[ACCESS_CONTROL_ALLOW_ORIGIN]; + cors3 = "\r\n"; + } else { + cors1 = cors2 = cors3 = ""; + } + + /* Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */ + gmt_time_string(date, sizeof(date), &curtime); + gmt_time_string(lm, sizeof(lm), &filep->last_modified); + construct_etag(etag, sizeof(etag), filep); + + (void)mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "%s%s%s" + "Date: %s\r\n", + conn->status_code, + msg, + cors1, + cors2, + cors3, + date); + send_static_cache_header(conn); + (void)mg_printf(conn, + "Last-Modified: %s\r\n" + "Etag: %s\r\n" + "Content-Type: %.*s\r\n" + "Content-Length: %" INT64_FMT "\r\n" + "Connection: %s\r\n" + "Accept-Ranges: bytes\r\n" + "%s%s\r\n", + lm, + etag, + (int)mime_vec.len, + mime_vec.ptr, + cl, + suggest_connection_header(conn), + range, + encoding); + + if (strcmp(conn->request_info.request_method, "HEAD") != 0) { + send_file_data(conn, filep, r1, cl); + } + mg_fclose(filep); +} + + +void +mg_send_file(struct mg_connection *conn, const char *path) +{ + mg_send_mime_file(conn, path, NULL); +} + + +void +mg_send_mime_file(struct mg_connection *conn, + const char *path, + const char *mime_type) +{ + struct file file = STRUCT_FILE_INITIALIZER; + if (mg_stat(conn, path, &file)) { + if (file.is_directory) { + if (!conn) { + return; + } + if (!mg_strcasecmp(conn->ctx->config[ENABLE_DIRECTORY_LISTING], + "yes")) { + handle_directory_request(conn, path); + } else { + send_http_error(conn, + 403, + "%s", + "Error: Directory listing denied"); + } + } else { + handle_static_file_request(conn, path, &file, mime_type); + } + } else { + send_http_error(conn, 404, "%s", "Error: File not found"); + } +} + + +/* For a given PUT path, create all intermediate subdirectories. + * Return 0 if the path itself is a directory. + * Return 1 if the path leads to a file. + * Return -1 for if the path is too long. + * Return -2 if path can not be created. +*/ +static int +put_dir(struct mg_connection *conn, const char *path) +{ + char buf[PATH_MAX]; + const char *s, *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int res = 1; + + for (s = p = path + 2; (p = strchr(s, '/')) != NULL; s = ++p) { + len = (size_t)(p - path); + if (len >= sizeof(buf)) { + /* path too long */ + res = -1; + break; + } + memcpy(buf, path, len); + buf[len] = '\0'; + + /* Try to create intermediate directory */ + DEBUG_TRACE("mkdir(%s)", buf); + if (!mg_stat(conn, buf, &file) && mg_mkdir(conn, buf, 0755) != 0) { + /* path does not exixt and can not be created */ + res = -2; + break; + } + + /* Is path itself a directory? */ + if (p[1] == '\0') { + res = 0; + } + } + + return res; +} + + +static void +remove_bad_file(const struct mg_connection *conn, const char *path) +{ + int r = mg_remove(conn, path); + if (r != 0) { + mg_cry(conn, "%s: Cannot remove invalid file %s", __func__, path); + } +} + + +long long +mg_store_body(struct mg_connection *conn, const char *path) +{ + char buf[MG_BUF_LEN]; + long long len = 0; + int ret, n; + struct file fi; + + if (conn->consumed_content != 0) { + mg_cry(conn, "%s: Contents already consumed", __func__); + return -11; + } + + ret = put_dir(conn, path); + if (ret < 0) { + /* -1 for path too long, + * -2 for path can not be created. */ + return ret; + } + if (ret != 1) { + /* Return 0 means, path itself is a directory. */ + return 0; + } + + if (mg_fopen(conn, path, "w", &fi) == 0) { + return -12; + } + + ret = mg_read(conn, buf, sizeof(buf)); + while (ret > 0) { + n = (int)fwrite(buf, 1, (size_t)ret, fi.fp); + if (n != ret) { + mg_fclose(&fi); + remove_bad_file(conn, path); + return -13; + } + ret = mg_read(conn, buf, sizeof(buf)); + } + + /* TODO: mg_fclose should return an error, + * and every caller should check and handle it. */ + if (fclose(fi.fp) != 0) { + remove_bad_file(conn, path); + return -14; + } + + return len; +} + + +/* Parse HTTP headers from the given buffer, advance buffer to the point + * where parsing stopped. */ +static void +parse_http_headers(char **buf, struct mg_request_info *ri) +{ + int i; + + if (!ri) { + return; + } + + ri->num_headers = 0; + + for (i = 0; i < (int)ARRAY_SIZE(ri->http_headers); i++) { + char *dp = *buf; + while ((*dp != ':') && (*dp != '\r') && (*dp != 0)) { + dp++; + } + if (!*dp) { + /* neither : nor \r\n. This is not a valid field. */ + break; + } + if (*dp == '\r') { + if (dp[1] == '\n') { + /* \r\n */ + ri->http_headers[i].name = *buf; + ri->http_headers[i].value = 0; + *buf = dp; + } else { + /* stray \r. This is not valid. */ + break; + } + } else { + /* (*dp == ':') */ + *dp = 0; + ri->http_headers[i].name = *buf; + do { + dp++; + } while (*dp == ' '); + + ri->http_headers[i].value = dp; + *buf = strstr(dp, "\r\n"); + } + + ri->num_headers = i + 1; + if (*buf) { + (*buf)[0] = 0; + (*buf)[1] = 0; + *buf += 2; + } else { + *buf = dp; + break; + } + + if (*buf[0] == '\r') { + /* This is the end of the header */ + break; + } + } +} + + +static int +is_valid_http_method(const char *method) +{ + return !strcmp(method, "GET") /* HTTP (RFC 2616) */ + || !strcmp(method, "POST") /* HTTP (RFC 2616) */ + || !strcmp(method, "HEAD") /* HTTP (RFC 2616) */ + || !strcmp(method, "PUT") /* HTTP (RFC 2616) */ + || !strcmp(method, "DELETE") /* HTTP (RFC 2616) */ + || !strcmp(method, "OPTIONS") /* HTTP (RFC 2616) */ + /* TRACE method (RFC 2616) is not supported for security reasons */ + || !strcmp(method, "CONNECT") /* HTTP (RFC 2616) */ + + || !strcmp(method, "PROPFIND") /* WEBDAV (RFC 2518) */ + || !strcmp(method, "MKCOL") /* WEBDAV (RFC 2518) */ + + /* Unsupported WEBDAV Methods: */ + /* PROPPATCH, COPY, MOVE, LOCK, UNLOCK (RFC 2518) */ + /* + 11 methods from RFC 3253 */ + /* ORDERPATCH (RFC 3648) */ + /* ACL (RFC 3744) */ + /* SEARCH (RFC 5323) */ + /* + MicroSoft extensions + * https://msdn.microsoft.com/en-us/library/aa142917.aspx */ + + /* PATCH method only allowed for CGI/Lua/LSP and callbacks. */ + || !strcmp(method, "PATCH"); /* PATCH method (RFC 5789) */ +} + + +/* Parse HTTP request, fill in mg_request_info structure. + * This function modifies the buffer by NUL-terminating + * HTTP request components, header names and header values. */ +static int +parse_http_message(char *buf, int len, struct mg_request_info *ri) +{ + int is_request, request_length; + + if (!ri) { + return 0; + } + + request_length = get_request_len(buf, len); + + if (request_length > 0) { + /* Reset attributes. DO NOT TOUCH is_ssl, remote_ip, remote_addr, + * remote_port */ + ri->remote_user = ri->request_method = ri->request_uri = + ri->http_version = NULL; + ri->num_headers = 0; + + buf[request_length - 1] = '\0'; + + /* RFC says that all initial whitespaces should be ingored */ + while (*buf != '\0' && isspace(*(unsigned char *)buf)) { + buf++; + } + ri->request_method = skip(&buf, " "); + ri->request_uri = skip(&buf, " "); + ri->http_version = skip(&buf, "\r\n"); + + /* HTTP message could be either HTTP request or HTTP response, e.g. + * "GET / HTTP/1.0 ...." or "HTTP/1.0 200 OK ..." */ + is_request = is_valid_http_method(ri->request_method); + if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) + || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { + request_length = -1; + } else { + if (is_request) { + ri->http_version += 5; + } + parse_http_headers(&buf, ri); + } + } + return request_length; +} + + +/* Keep reading the input (either opened file descriptor fd, or socket sock, + * or SSL descriptor ssl) into buffer buf, until \r\n\r\n appears in the + * buffer (which marks the end of HTTP request). Buffer buf may already + * have some data. The length of the data is stored in nread. + * Upon every read operation, increase nread by the number of bytes read. */ +static int +read_request(FILE *fp, + struct mg_connection *conn, + char *buf, + int bufsiz, + int *nread) +{ + int request_len, n = 0; + struct timespec last_action_time; + double request_timeout; + + if (!conn) { + return 0; + } + + memset(&last_action_time, 0, sizeof(last_action_time)); + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + /* value of request_timeout is in seconds, config in milliseconds */ + request_timeout = atof(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } else { + request_timeout = -1.0; + } + + request_len = get_request_len(buf, *nread); + + /* first time reading from this connection */ + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + + while ( + (conn->ctx->stop_flag == 0) && (*nread < bufsiz) && (request_len == 0) + && ((mg_difftimespec(&last_action_time, &(conn->req_time)) + <= request_timeout) || (request_timeout < 0)) + && ((n = pull(fp, conn, buf + *nread, bufsiz - *nread, request_timeout)) + > 0)) { + *nread += n; + /* assert(*nread <= bufsiz); */ + if (*nread > bufsiz) { + return -2; + } + request_len = get_request_len(buf, *nread); + if (request_timeout > 0.0) { + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + } + } + + return (request_len <= 0 && n <= 0) ? -1 : request_len; +} + +#if !defined(NO_FILES) +/* For given directory path, substitute it to valid index file. + * Return 1 if index file has been found, 0 if not found. + * If the file is found, it's stats is returned in stp. */ +static int +substitute_index_file(struct mg_connection *conn, + char *path, + size_t path_len, + struct file *filep) +{ + if (conn && conn->ctx) { + const char *list = conn->ctx->config[INDEX_FILES]; + struct file file = STRUCT_FILE_INITIALIZER; + struct vec filename_vec; + size_t n = strlen(path); + int found = 0; + + /* The 'path' given to us points to the directory. Remove all trailing + * directory separator characters from the end of the path, and + * then append single directory separator character. */ + while (n > 0 && path[n - 1] == '/') { + n--; + } + path[n] = '/'; + + /* Traverse index files list. For each entry, append it to the given + * path and see if the file exists. If it exists, break the loop */ + while ((list = next_option(list, &filename_vec, NULL)) != NULL) { + /* Ignore too long entries that may overflow path buffer */ + if (filename_vec.len > path_len - (n + 2)) { + continue; + } + + /* Prepare full path to the index file */ + mg_strlcpy(path + n + 1, filename_vec.ptr, filename_vec.len + 1); + + /* Does it exist? */ + if (mg_stat(conn, path, &file)) { + /* Yes it does, break the loop */ + *filep = file; + found = 1; + break; + } + } + + /* If no index file exists, restore directory path */ + if (!found) { + path[n] = '\0'; + } + + return found; + } + return 0; +} +#endif + + +#if !defined(NO_CACHING) +/* Return True if we should reply 304 Not Modified. */ +static int +is_not_modified(const struct mg_connection *conn, const struct file *filep) +{ + char etag[64]; + const char *ims = mg_get_header(conn, "If-Modified-Since"); + const char *inm = mg_get_header(conn, "If-None-Match"); + construct_etag(etag, sizeof(etag), filep); + if (!filep) { + return 0; + } + return (inm != NULL && !mg_strcasecmp(etag, inm)) + || (ims != NULL && (filep->last_modified <= parse_date_string(ims))); +} +#endif /* !NO_CACHING */ + + +#if !defined(NO_CGI) || !defined(NO_FILES) +static int +forward_body_data(struct mg_connection *conn, FILE *fp, SOCKET sock, SSL *ssl) +{ + const char *expect, *body; + char buf[MG_BUF_LEN]; + int to_read, nread, success = 0; + int64_t buffered_len; + double timeout = -1.0; + + if (!conn) { + return 0; + } + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + expect = mg_get_header(conn, "Expect"); + /* assert(fp != NULL); */ + if (!fp) { + send_http_error(conn, 500, "%s", "Error: NULL File"); + return 0; + } + + if (conn->content_len == -1 && !conn->is_chunked) { + /* Content length is not specified by the client. */ + send_http_error(conn, + 411, + "%s", + "Error: Client did not specify content length"); + } else if ((expect != NULL) + && (mg_strcasecmp(expect, "100-continue") != 0)) { + /* Client sent an "Expect: xyz" header and xyz is not 100-continue. */ + send_http_error(conn, + 417, + "Error: Can not fulfill expectation %s", + expect); + } else { + if (expect != NULL) { + (void)mg_printf(conn, "%s", "HTTP/1.1 100 Continue\r\n\r\n"); + conn->status_code = 100; + } else { + conn->status_code = 200; + } + + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + + /* assert(buffered_len >= 0); */ + /* assert(conn->consumed_content == 0); */ + + if ((buffered_len < 0) || (conn->consumed_content != 0)) { + send_http_error(conn, 500, "%s", "Error: Size mismatch"); + return 0; + } + + if (buffered_len > 0) { + if ((int64_t)buffered_len > conn->content_len) { + buffered_len = (int)conn->content_len; + } + body = conn->buf + conn->request_len + conn->consumed_content; + push_all(conn->ctx, fp, sock, ssl, body, (int64_t)buffered_len); + conn->consumed_content += buffered_len; + } + + nread = 0; + while (conn->consumed_content < conn->content_len) { + to_read = sizeof(buf); + if ((int64_t)to_read > conn->content_len - conn->consumed_content) { + to_read = (int)(conn->content_len - conn->consumed_content); + } + nread = pull(NULL, conn, buf, to_read, timeout); + if (nread <= 0 + || push_all(conn->ctx, fp, sock, ssl, buf, nread) != nread) { + break; + } + conn->consumed_content += nread; + } + + if (conn->consumed_content == conn->content_len) { + success = (nread >= 0); + } + + /* Each error code path in this function must send an error */ + if (!success) { + /* NOTE: Maybe some data has already been sent. */ + /* TODO (low): If some data has been sent, a correct error + * reply can no longer be sent, so just close the connection */ + send_http_error(conn, 500, "%s", ""); + } + } + + return success; +} +#endif + +#if !defined(NO_CGI) +/* This structure helps to create an environment for the spawned CGI program. + * Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings, + * last element must be NULL. + * However, on Windows there is a requirement that all these VARIABLE=VALUE\0 + * strings must reside in a contiguous buffer. The end of the buffer is + * marked by two '\0' characters. + * We satisfy both worlds: we create an envp array (which is vars), all + * entries are actually pointers inside buf. */ +struct cgi_environment { + struct mg_connection *conn; + /* Data block */ + char *buf; /* Environment buffer */ + size_t buflen; /* Space available in buf */ + size_t bufused; /* Space taken in buf */ + /* Index block */ + char **var; /* char **envp */ + size_t varlen; /* Number of variables available in var */ + size_t varused; /* Number of variables stored in var */ +}; + + +static void addenv(struct cgi_environment *env, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* Append VARIABLE=VALUE\0 string to the buffer, and add a respective + * pointer into the vars array. Assumes env != NULL and fmt != NULL. */ +static void +addenv(struct cgi_environment *env, const char *fmt, ...) +{ + size_t n, space; + int truncated; + char *added; + va_list ap; + + /* Calculate how much space is left in the buffer */ + space = (env->buflen - env->bufused); + + /* Calculate an estimate for the required space */ + n = strlen(fmt) + 2 + 128; + + do { + if (space <= n) { + /* Allocate new buffer */ + n = env->buflen + CGI_ENVIRONMENT_SIZE; + added = (char *)mg_realloc(env->buf, n); + if (!added) { + /* Out of memory */ + mg_cry(env->conn, + "%s: Cannot allocate memory for CGI variable [%s]", + __func__, + fmt); + return; + } + env->buf = added; + env->buflen = n; + space = (env->buflen - env->bufused); + } + + /* Make a pointer to the free space int the buffer */ + added = env->buf + env->bufused; + + /* Copy VARIABLE=VALUE\0 string into the free space */ + va_start(ap, fmt); + mg_vsnprintf(env->conn, &truncated, added, (size_t)space, fmt, ap); + va_end(ap); + + /* Do not add truncated strings to the environment */ + if (truncated) { + /* Reallocate the buffer */ + space = 0; + n = 1; + } + } while (truncated); + + /* Calculate number of bytes added to the environment */ + n = strlen(added) + 1; + env->bufused += n; + + /* Now update the variable index */ + space = (env->varlen - env->varused); + if (space < 2) { + mg_cry(env->conn, + "%s: Cannot register CGI variable [%s]", + __func__, + fmt); + return; + } + + /* Append a pointer to the added string into the envp array */ + env->var[env->varused] = added; + env->varused++; +} + + +static void +prepare_cgi_environment(struct mg_connection *conn, + const char *prog, + struct cgi_environment *env) +{ + const char *s; + struct vec var_vec; + char *p, src_addr[IP_ADDR_STR_LEN], http_var_name[128]; + int i, truncated; + + if (conn == NULL || prog == NULL || env == NULL) { + return; + } + + env->conn = conn; + env->buflen = CGI_ENVIRONMENT_SIZE; + env->bufused = 0; + env->buf = (char *)mg_malloc(env->buflen); + env->varlen = MAX_CGI_ENVIR_VARS; + env->varused = 0; + env->var = (char **)mg_malloc(env->buflen * sizeof(char *)); + + addenv(env, "SERVER_NAME=%s", conn->ctx->config[AUTHENTICATION_DOMAIN]); + addenv(env, "SERVER_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "DOCUMENT_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "SERVER_SOFTWARE=%s/%s", "Civetweb", mg_version()); + + /* Prepare the environment block */ + addenv(env, "%s", "GATEWAY_INTERFACE=CGI/1.1"); + addenv(env, "%s", "SERVER_PROTOCOL=HTTP/1.1"); + addenv(env, "%s", "REDIRECT_STATUS=200"); /* For PHP */ + +#if defined(USE_IPV6) + if (conn->client.lsa.sa.sa_family == AF_INET6) { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin6.sin6_port)); + } else +#endif + { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin.sin_port)); + } + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + addenv(env, "REMOTE_ADDR=%s", src_addr); + + addenv(env, "REQUEST_METHOD=%s", conn->request_info.request_method); + addenv(env, "REMOTE_PORT=%d", conn->request_info.remote_port); + + addenv(env, "REQUEST_URI=%s", conn->request_info.request_uri); + addenv(env, "LOCAL_URI=%s", conn->request_info.local_uri); + + /* SCRIPT_NAME */ + addenv(env, + "SCRIPT_NAME=%.*s", + (int)strlen(conn->request_info.local_uri) + - ((conn->path_info == NULL) ? 0 : (int)strlen(conn->path_info)), + conn->request_info.local_uri); + + addenv(env, "SCRIPT_FILENAME=%s", prog); + if (conn->path_info == NULL) { + addenv(env, "PATH_TRANSLATED=%s", conn->ctx->config[DOCUMENT_ROOT]); + } else { + addenv(env, + "PATH_TRANSLATED=%s%s", + conn->ctx->config[DOCUMENT_ROOT], + conn->path_info); + } + + addenv(env, "HTTPS=%s", conn->ssl == NULL ? "off" : "on"); + + if ((s = mg_get_header(conn, "Content-Type")) != NULL) { + addenv(env, "CONTENT_TYPE=%s", s); + } + if (conn->request_info.query_string != NULL) { + addenv(env, "QUERY_STRING=%s", conn->request_info.query_string); + } + if ((s = mg_get_header(conn, "Content-Length")) != NULL) { + addenv(env, "CONTENT_LENGTH=%s", s); + } + if ((s = getenv("PATH")) != NULL) { + addenv(env, "PATH=%s", s); + } + if (conn->path_info != NULL) { + addenv(env, "PATH_INFO=%s", conn->path_info); + } + + if (conn->status_code > 0) { + /* CGI error handler should show the status code */ + addenv(env, "STATUS=%d", conn->status_code); + } + +#if defined(_WIN32) + if ((s = getenv("COMSPEC")) != NULL) { + addenv(env, "COMSPEC=%s", s); + } + if ((s = getenv("SYSTEMROOT")) != NULL) { + addenv(env, "SYSTEMROOT=%s", s); + } + if ((s = getenv("SystemDrive")) != NULL) { + addenv(env, "SystemDrive=%s", s); + } + if ((s = getenv("ProgramFiles")) != NULL) { + addenv(env, "ProgramFiles=%s", s); + } + if ((s = getenv("ProgramFiles(x86)")) != NULL) { + addenv(env, "ProgramFiles(x86)=%s", s); + } +#else + if ((s = getenv("LD_LIBRARY_PATH")) != NULL) { + addenv(env, "LD_LIBRARY_PATH=%s", s); + } +#endif /* _WIN32 */ + + if ((s = getenv("PERLLIB")) != NULL) { + addenv(env, "PERLLIB=%s", s); + } + + if (conn->request_info.remote_user != NULL) { + addenv(env, "REMOTE_USER=%s", conn->request_info.remote_user); + addenv(env, "%s", "AUTH_TYPE=Digest"); + } + + /* Add all headers as HTTP_* variables */ + for (i = 0; i < conn->request_info.num_headers; i++) { + + (void)mg_snprintf(conn, + &truncated, + http_var_name, + sizeof(http_var_name), + "HTTP_%s", + conn->request_info.http_headers[i].name); + + if (truncated) { + mg_cry(conn, + "%s: HTTP header variable too long [%s]", + __func__, + conn->request_info.http_headers[i].name); + continue; + } + + /* Convert variable name into uppercase, and change - to _ */ + for (p = http_var_name; *p != '\0'; p++) { + if (*p == '-') { + *p = '_'; + } + *p = (char)toupper(*(unsigned char *)p); + } + + addenv(env, + "%s=%s", + http_var_name, + conn->request_info.http_headers[i].value); + } + + /* Add user-specified variables */ + s = conn->ctx->config[CGI_ENVIRONMENT]; + while ((s = next_option(s, &var_vec, NULL)) != NULL) { + addenv(env, "%.*s", (int)var_vec.len, var_vec.ptr); + } + + env->var[env->varused] = NULL; + env->buf[env->bufused] = '\0'; +} + + +static void +handle_cgi_request(struct mg_connection *conn, const char *prog) +{ + char *buf; + size_t buflen; + int headers_len, data_len, i, truncated; + int fdin[2] = {-1, -1}, fdout[2] = {-1, -1}, fderr[2] = {-1, -1}; + const char *status, *status_text, *connection_state; + char *pbuf, dir[PATH_MAX], *p; + struct mg_request_info ri; + struct cgi_environment blk; + FILE *in = NULL, *out = NULL, *err = NULL; + struct file fout = STRUCT_FILE_INITIALIZER; + pid_t pid = (pid_t)-1; + + if (conn == NULL) { + return; + } + + buf = NULL; + buflen = 16384; + prepare_cgi_environment(conn, prog, &blk); + + /* CGI must be executed in its own directory. 'dir' must point to the + * directory containing executable program, 'p' must point to the + * executable program name relative to 'dir'. */ + (void)mg_snprintf(conn, &truncated, dir, sizeof(dir), "%s", prog); + + if (truncated) { + mg_cry(conn, "Error: CGI program \"%s\": Path too long", prog); + send_http_error(conn, 500, "Error: %s", "CGI path too long"); + goto done; + } + + if ((p = strrchr(dir, '/')) != NULL) { + *p++ = '\0'; + } else { + dir[0] = '.', dir[1] = '\0'; + p = (char *)prog; + } + + if (pipe(fdin) != 0 || pipe(fdout) != 0 || pipe(fderr) != 0) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not create CGI pipes: %s", + prog, + status); + send_http_error(conn, 500, "Error: Cannot create CGI pipe: %s", status); + goto done; + } + + pid = spawn_process(conn, p, blk.buf, blk.var, fdin, fdout, fderr, dir); + + if (pid == (pid_t)-1) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not spawn CGI process: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: Cannot spawn CGI process [%s]: %s", + prog, + status); + goto done; + } + + /* Make sure child closes all pipe descriptors. It must dup them to 0,1 */ + set_close_on_exec((SOCKET)fdin[0], conn); /* stdin read */ + set_close_on_exec((SOCKET)fdout[1], conn); /* stdout write */ + set_close_on_exec((SOCKET)fderr[1], conn); /* stderr write */ + set_close_on_exec((SOCKET)fdin[1], conn); /* stdin write */ + set_close_on_exec((SOCKET)fdout[0], conn); /* stdout read */ + set_close_on_exec((SOCKET)fderr[0], conn); /* stderr read */ + + /* Parent closes only one side of the pipes. + * If we don't mark them as closed, close() attempt before + * return from this function throws an exception on Windows. + * Windows does not like when closed descriptor is closed again. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + fdin[0] = fdout[1] = fderr[1] = -1; + + if ((in = fdopen(fdin[1], "wb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdin: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdin\nfopen: %s", + status); + goto done; + } + + if ((out = fdopen(fdout[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdout: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + if ((err = fdopen(fderr[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stderr: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + setbuf(in, NULL); + setbuf(out, NULL); + setbuf(err, NULL); + fout.fp = out; + + if ((conn->request_info.content_length > 0) || conn->is_chunked) { + /* This is a POST/PUT request, or another request with body data. */ + if (!forward_body_data(conn, in, INVALID_SOCKET, NULL)) { + /* Error sending the body data */ + mg_cry(conn, + "Error: CGI program \"%s\": Forward body data failed", + prog); + goto done; + } + } + + /* Close so child gets an EOF. */ + fclose(in); + in = NULL; + fdin[1] = -1; + + /* Now read CGI reply into a buffer. We need to set correct + * status code, thus we need to see all HTTP headers first. + * Do not send anything back to client, until we buffer in all + * HTTP headers. */ + data_len = 0; + buf = (char *)mg_malloc(buflen); + if (buf == NULL) { + send_http_error(conn, + 500, + "Error: Not enough memory for CGI buffer (%u bytes)", + (unsigned int)buflen); + mg_cry(conn, + "Error: CGI program \"%s\": Not enough memory for buffer (%u " + "bytes)", + prog, + (unsigned int)buflen); + goto done; + } + headers_len = read_request(out, conn, buf, (int)buflen, &data_len); + if (headers_len <= 0) { + + /* Could not parse the CGI response. Check if some error message on + * stderr. */ + i = pull_all(err, conn, buf, (int)buflen); + if (i > 0) { + mg_cry(conn, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + send_http_error(conn, + 500, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + } else { + mg_cry(conn, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + + send_http_error(conn, + 500, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + } + + goto done; + } + pbuf = buf; + buf[headers_len - 1] = '\0'; + parse_http_headers(&pbuf, &ri); + + /* Make up and send the status line */ + status_text = "OK"; + if ((status = get_header(&ri, "Status")) != NULL) { + conn->status_code = atoi(status); + status_text = status; + while (isdigit(*(const unsigned char *)status_text) + || *status_text == ' ') { + status_text++; + } + } else if (get_header(&ri, "Location") != NULL) { + conn->status_code = 302; + } else { + conn->status_code = 200; + } + connection_state = get_header(&ri, "Connection"); + if (!header_has_option(connection_state, "keep-alive")) { + conn->must_close = 1; + } + (void)mg_printf(conn, "HTTP/1.1 %d %s\r\n", conn->status_code, status_text); + + /* Send headers */ + for (i = 0; i < ri.num_headers; i++) { + mg_printf(conn, + "%s: %s\r\n", + ri.http_headers[i].name, + ri.http_headers[i].value); + } + mg_write(conn, "\r\n", 2); + + /* Send chunk of data that may have been read after the headers */ + conn->num_bytes_sent += + mg_write(conn, buf + headers_len, (size_t)(data_len - headers_len)); + + /* Read the rest of CGI output and send to the client */ + send_file_data(conn, &fout, 0, INT64_MAX); + +done: + mg_free(blk.var); + mg_free(blk.buf); + + if (pid != (pid_t)-1) { + kill(pid, SIGKILL); +#if !defined(_WIN32) + { + int st; + while (waitpid(pid, &st, 0) != -1) + ; /* clean zombies */ + } +#endif + } + if (fdin[0] != -1) { + close(fdin[0]); + } + if (fdout[1] != -1) { + close(fdout[1]); + } + + if (in != NULL) { + fclose(in); + } else if (fdin[1] != -1) { + close(fdin[1]); + } + + if (out != NULL) { + fclose(out); + } else if (fdout[0] != -1) { + close(fdout[0]); + } + + if (err != NULL) { + fclose(err); + } else if (fderr[0] != -1) { + close(fderr[0]); + } + + if (buf != NULL) { + mg_free(buf); + } +} +#endif /* !NO_CGI */ + + +#if !defined(NO_FILES) +static void +mkcol(struct mg_connection *conn, const char *path) +{ + int rc, body_len; + struct de de; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + /* TODO (mid): Check the send_http_error situations in this function */ + + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + + if (de.file.last_modified) { + /* TODO (high): This check does not seem to make any sense ! */ + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + body_len = conn->data_len - conn->request_len; + if (body_len > 0) { + send_http_error( + conn, 415, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + rc = mg_mkdir(conn, path, 0755); + + if (rc == 0) { + conn->status_code = 201; + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d Created\r\n" + "Date: %s\r\n", + conn->status_code, + date); + send_static_cache_header(conn); + mg_printf(conn, + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + suggest_connection_header(conn)); + } else if (rc == -1) { + if (errno == EEXIST) { + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == EACCES) { + send_http_error( + conn, 403, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == ENOENT) { + send_http_error( + conn, 409, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else { + send_http_error(conn, 500, "fopen(%s): %s", path, strerror(ERRNO)); + } + } +} + + +static void +put_file(struct mg_connection *conn, const char *path) +{ + struct file file = STRUCT_FILE_INITIALIZER; + const char *range; + int64_t r1, r2; + int rc; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + if (mg_stat(conn, path, &file)) { + /* File already exists */ + conn->status_code = 200; + + if (file.is_directory) { + /* This is an already existing directory, + * so there is nothing to do for the server. */ + rc = 0; + + } else { + /* File exists and is not a directory. */ + /* Can it be replaced? */ + + if (file.membuf != NULL) { + /* This is an "in-memory" file, that can not be replaced */ + send_http_error( + conn, + 405, + "Error: Put not possible\nReplacing %s is not supported", + path); + return; + } + + /* Check if the server may write this file */ + if (access(path, W_OK) == 0) { + /* Access granted */ + conn->status_code = 200; + rc = 1; + } else { + send_http_error( + conn, + 403, + "Error: Put not possible\nReplacing %s is not allowed", + path); + return; + } + } + } else { + /* File should be created */ + conn->status_code = 201; + rc = put_dir(conn, path); + } + + if (rc == 0) { + /* put_dir returns 0 if path is a directory */ + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + /* Request to create a directory has been fulfilled successfully. + * No need to put a file. */ + return; + } + + if (rc == -1) { + /* put_dir returns -1 if the path is too long */ + send_http_error(conn, + 414, + "Error: Path too long\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + if (rc == -2) { + /* put_dir returns -2 if the directory can not be created */ + send_http_error(conn, + 500, + "Error: Can not create directory\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + /* A file should be created or overwritten. */ + if (!mg_fopen(conn, path, "wb+", &file) || file.fp == NULL) { + mg_fclose(&file); + send_http_error(conn, + 500, + "Error: Can not create file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(&file, conn); + range = mg_get_header(conn, "Content-Range"); + r1 = r2 = 0; + if (range != NULL && parse_range_header(range, &r1, &r2) > 0) { + conn->status_code = 206; /* Partial content */ + fseeko(file.fp, r1, SEEK_SET); + } + + if (!forward_body_data(conn, file.fp, INVALID_SOCKET, NULL)) { + /* forward_body_data failed. + * The error code has already been sent to the client, + * and conn->status_code is already set. */ + mg_fclose(&file); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + mg_fclose(&file); +} + + +static void +delete_file(struct mg_connection *conn, const char *path) +{ + struct de de; + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + /* mg_stat returns 0 if the file does not exist */ + send_http_error(conn, + 404, + "Error: Cannot delete file\nFile %s not found", + path); + return; + } + + if (de.file.membuf != NULL) { + /* the file is cached in memory */ + send_http_error( + conn, + 405, + "Error: Delete not possible\nDeleting %s is not supported", + path); + return; + } + + if (de.file.is_directory) { + if (remove_directory(conn, path)) { + /* Delete is successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete is not successful: Return 500 (Server error). */ + send_http_error(conn, 500, "Error: Could not delete %s", path); + } + return; + } + + /* This is an existing file (not a directory). + * Check if write permission is granted. */ + if (access(path, W_OK) != 0) { + /* File is read only */ + send_http_error( + conn, + 403, + "Error: Delete not possible\nDeleting %s is not allowed", + path); + return; + } + + /* Try to delete it. */ + if (mg_remove(conn, path) == 0) { + /* Delete was successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete not successful (file locked). */ + send_http_error(conn, + 423, + "Error: Cannot delete file\nremove(%s): %s", + path, + strerror(ERRNO)); + } +} +#endif /* !NO_FILES */ + + +static void +send_ssi_file(struct mg_connection *, const char *, struct file *, int); + + +static void +do_ssi_include(struct mg_connection *conn, + const char *ssi, + char *tag, + int include_level) +{ + char file_name[MG_BUF_LEN], path[512], *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int truncated = 0; + + if (conn == NULL) { + return; + } + + /* sscanf() is safe here, since send_ssi_file() also uses buffer + * of size MG_BUF_LEN to get the tag. So strlen(tag) is + * always < MG_BUF_LEN. */ + if (sscanf(tag, " virtual=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver root */ + file_name[511] = 0; + (void)mg_snprintf(conn, + &truncated, + path, + sizeof(path), + "%s/%s", + conn->ctx->config[DOCUMENT_ROOT], + file_name); + + } else if (sscanf(tag, " abspath=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver working directory + * or it is absolute system path */ + file_name[511] = 0; + (void) + mg_snprintf(conn, &truncated, path, sizeof(path), "%s", file_name); + + } else if (sscanf(tag, " file=\"%511[^\"]\"", file_name) == 1 + || sscanf(tag, " \"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the currect document */ + file_name[511] = 0; + (void)mg_snprintf(conn, &truncated, path, sizeof(path), "%s", ssi); + + if (!truncated) { + if ((p = strrchr(path, '/')) != NULL) { + p[1] = '\0'; + } + len = strlen(path); + (void)mg_snprintf(conn, + &truncated, + path + len, + sizeof(path) - len, + "%s", + file_name); + } + + } else { + mg_cry(conn, "Bad SSI #include: [%s]", tag); + return; + } + + if (truncated) { + mg_cry(conn, "SSI #include path length overflow: [%s]", tag); + return; + } + + if (!mg_fopen(conn, path, "rb", &file)) { + mg_cry(conn, + "Cannot open SSI #include: [%s]: fopen(%s): %s", + tag, + path, + strerror(ERRNO)); + } else { + fclose_on_exec(&file, conn); + if (match_prefix(conn->ctx->config[SSI_EXTENSIONS], + strlen(conn->ctx->config[SSI_EXTENSIONS]), + path) > 0) { + send_ssi_file(conn, path, &file, include_level + 1); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + } + mg_fclose(&file); + } +} + + +#if !defined(NO_POPEN) +static void +do_ssi_exec(struct mg_connection *conn, char *tag) +{ + char cmd[1024] = ""; + struct file file = STRUCT_FILE_INITIALIZER; + + if (sscanf(tag, " \"%1023[^\"]\"", cmd) != 1) { + mg_cry(conn, "Bad SSI #exec: [%s]", tag); + } else { + cmd[1023] = 0; + if ((file.fp = popen(cmd, "r")) == NULL) { + mg_cry(conn, "Cannot SSI #exec: [%s]: %s", cmd, strerror(ERRNO)); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + pclose(file.fp); + } + } +} +#endif /* !NO_POPEN */ + + +static int +mg_fgetc(struct file *filep, int offset) +{ + if (filep == NULL) { + return EOF; + } + if (filep->membuf != NULL && offset >= 0 + && ((unsigned int)(offset)) < filep->size) { + return ((const unsigned char *)filep->membuf)[offset]; + } else if (filep->fp != NULL) { + return fgetc(filep->fp); + } else { + return EOF; + } +} + + +static void +send_ssi_file(struct mg_connection *conn, + const char *path, + struct file *filep, + int include_level) +{ + char buf[MG_BUF_LEN]; + int ch, offset, len, in_ssi_tag; + + if (include_level > 10) { + mg_cry(conn, "SSI #include level is too deep (%s)", path); + return; + } + + in_ssi_tag = len = offset = 0; + while ((ch = mg_fgetc(filep, offset)) != EOF) { + if (in_ssi_tag && ch == '>') { + in_ssi_tag = 0; + buf[len++] = (char)ch; + buf[len] = '\0'; + /* assert(len <= (int) sizeof(buf)); */ + if (len > (int)sizeof(buf)) { + break; + } + if (len < 6 || memcmp(buf, "<%s>\n", Path, "ventoy"); + if (MoveFileA(Path, "ventoy")) + { + vlog("Rename <%s>--><%s> success\n", Path, "ventoy"); + } + else + { + vlog("Rename <%s>--><%s> failed %u\n", Path, "ventoy", LASTERR); + MessageBoxW(NULL, g_msg_lang[MSGID_RENAME_VENTOY], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + return 1; + } + } + } + else + { + vlog("ventoy directory already exist, no need to check case sensitive.\n"); + } + } + else + { + if (CreateDirectoryA("ventoy", NULL)) + { + vlog("Create ventoy directory success.\n"); + } + else + { + vlog("Create ventoy directory failed %u.\n", LASTERR); + MessageBoxW(NULL, g_msg_lang[MSGID_NEW_DIR_FAIL], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + return 1; + } + } + + return ventoy_http_start(g_sysinfo.ip, g_sysinfo.port); +} + +INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + int rc; + int nCurSel; + WORD NotifyCode; + WORD CtrlID; + + switch (Message) + { + case WM_NOTIFY: + { + UINT code = 0; + UINT_PTR idFrom = 0; + + if (lParam) + { + code = ((LPNMHDR)lParam)->code; + idFrom = ((LPNMHDR)lParam)->idFrom; + } + + if (idFrom == IDC_SYSLINK1 && (NM_CLICK == code || NM_RETURN == code)) + { + OpenURL(); + } + break; + } + case WM_COMMAND: + { + NotifyCode = HIWORD(wParam); + CtrlID = LOWORD(wParam); + + if (NotifyCode == BN_CLICKED) + { + if (CtrlID == IDC_BUTTON1) + { + if (!g_running) + { + //refresh + ventoy_disk_exit(); + ventoy_disk_init(); + FillCombox(hWnd); + } + } + else if (CtrlID == IDC_BUTTON2) + { + if (g_running) + { + if (IDYES == MessageBoxW(NULL, g_msg_lang[MSGID_BTN_STOP_TIP], g_msg_lang[MSGID_INFO], MB_YESNO | MB_ICONINFORMATION)) + { + VentoyStopService(); + + g_running = FALSE; + SetWindowTextW(g_start_button, g_msg_lang[MSGID_BTN_START]); + EnableWindow(g_ComboxHwnd, TRUE); + EnableWindow(g_refresh_button, TRUE); + EnableWindow(g_openlink_button, FALSE); + } + } + else + { + nCurSel = (int)SendMessage(g_ComboxHwnd, CB_GETCURSEL, 0, 0); + if (CB_ERR != nCurSel) + { + rc = VentoyStartService(nCurSel); + if (rc) + { + vlog("Ventoy failed to start http server, check %s for detail\n", g_log_file); + MessageBoxW(NULL, g_msg_lang[MSGID_INTERNAL_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + } + else + { + g_running = TRUE; + SetWindowTextW(g_start_button, g_msg_lang[MSGID_BTN_STOP]); + + EnableWindow(g_ComboxHwnd, FALSE); + EnableWindow(g_refresh_button, FALSE); + EnableWindow(g_openlink_button, TRUE); + + OpenURL(); + } + } + } + } + else if (CtrlID == IDC_BUTTON3) + { + if (g_running) + { + OpenURL(); + } + } + else if (CtrlID == IDC_BUTTON4) + { + if (g_running) + { + if (IDYES != MessageBoxW(NULL, g_msg_lang[MSGID_BTN_EXIT_TIP], g_msg_lang[MSGID_INFO], MB_YESNO | MB_ICONINFORMATION)) + { + return 0; + } + + ventoy_http_stop(); + } + + OnDestroyDialog(); + EndDialog(hWnd, 0); + } + } + break; + } + case WM_INITDIALOG: + { + InitDialog(hWnd, wParam, lParam); + break; + } + case WM_CLOSE: + { + if (g_running) + { + if (IDYES != MessageBoxW(NULL, g_msg_lang[MSGID_BTN_EXIT_TIP], g_msg_lang[MSGID_INFO], MB_YESNO | MB_ICONINFORMATION)) + { + return 0; + } + + VentoyStopService(); + } + + OnDestroyDialog(); + EndDialog(hWnd, 0); + } + } + + return 0; +} + +static int ParseCmdLine(LPSTR lpCmdLine, char *ip, char *port) +{ + int portnum; + char *ipstart = ip; + char *pos; + + + if (!lpCmdLine) + { + return 0; + } + + pos = strstr(lpCmdLine, "-H"); + if (!pos) + { + pos = strstr(lpCmdLine, "-h"); + } + + if (pos) + { + pos += 2; + while (*pos == ' ' || *pos == '\t') + { + pos++; + } + + while (isdigit(*pos) || *pos == '.') + { + *ipstart++ = *pos++; + } + } + + + pos = strstr(lpCmdLine, "-P"); + if (!pos) + { + pos = strstr(lpCmdLine, "-p"); + } + + if (pos) + { + portnum = (int)strtol(pos + 3, NULL, 10); + sprintf_s(port, 16, "%d", portnum); + } + + return 0; +} + +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) +{ + int rc; + HANDLE hMutex; + WCHAR CurDir[MAX_PATH]; + + UNREFERENCED_PARAMETER(hPrevInstance); + + if (GetUserDefaultUILanguage() == 0x0804) + { + g_sysinfo.language = LANGUAGE_CN; + g_msg_lang = g_msg_cn; + } + else + { + g_sysinfo.language = LANGUAGE_EN; + g_msg_lang = g_msg_en; + } + + hMutex = CreateMutexA(NULL, TRUE, "PlugsonMUTEX"); + if ((hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) + { + MessageBoxW(NULL, g_msg_lang[MSGID_RUNNING_TIP], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + return 1; + } + + GetCurrentDirectoryW(MAX_PATH, CurDir); + WideCharToMultiByte(CP_UTF8, 0, CurDir, -1, g_cur_dir, MAX_PATH, NULL, 0); + + sprintf_s(g_ventoy_dir, sizeof(g_ventoy_dir), "%s", g_cur_dir); + sprintf_s(g_log_file, sizeof(g_log_file), "%s\\%s", g_cur_dir, LOG_FILE); + ventoy_log_init(); + + if (!ventoy_is_file_exist("%s\\ventoy\\%s", g_ventoy_dir, PLUGSON_TXZ)) + { + MessageBoxW(NULL, g_msg_lang[MSGID_NO_TARXZ_TIP], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + return 1; + } + + ParseCmdLine(lpCmdLine, g_sysinfo.ip, g_sysinfo.port); + if (g_sysinfo.ip[0] == 0) + { + strlcpy(g_sysinfo.ip, "127.0.0.1"); + } + if (g_sysinfo.port[0] == 0) + { + strlcpy(g_sysinfo.port, "24681"); + } + + vlog("===============================================\n"); + vlog("===== Ventoy Plugson %s:%s =====\n", g_sysinfo.ip, g_sysinfo.port); + vlog("===============================================\n"); + + + ventoy_disk_init(); +#ifndef VENTOY_SIM + rc = ventoy_www_init(); + if (rc) + { + vlog("Failed to init www\n"); + MessageBoxW(NULL, g_msg_lang[MSGID_INTERNAL_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + + ventoy_disk_exit(); + ventoy_log_exit(); + return 1; + } +#endif + ventoy_http_init(); + + g_hInst = hInstance; + DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); + + return 0; +} + diff --git a/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe b/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe new file mode 100644 index 00000000..79fbbbef Binary files /dev/null and b/Plugson/vs/VentoyPlugson/Release/VentoyPlugson.exe differ diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson.sln b/Plugson/vs/VentoyPlugson/VentoyPlugson.sln new file mode 100644 index 00000000..f4e7ca1a --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VentoyPlugson", "VentoyPlugson\VentoyPlugson.vcxproj", "{321D6EE2-2AB3-4103-9F05-EC4EC67A75E1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {321D6EE2-2AB3-4103-9F05-EC4EC67A75E1}.Debug|Win32.ActiveCfg = Debug|Win32 + {321D6EE2-2AB3-4103-9F05-EC4EC67A75E1}.Debug|Win32.Build.0 = Debug|Win32 + {321D6EE2-2AB3-4103-9F05-EC4EC67A75E1}.Release|Win32.ActiveCfg = Release|Win32 + {321D6EE2-2AB3-4103-9F05-EC4EC67A75E1}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson32.manifest b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson32.manifest new file mode 100644 index 00000000..ba90274a --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson32.manifest @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson64.manifest b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson64.manifest new file mode 100644 index 00000000..a0559d75 --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/Plugson64.manifest @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm.manifest b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm.manifest new file mode 100644 index 00000000..18561788 --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm.manifest @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm64.manifest b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm64.manifest new file mode 100644 index 00000000..067e7f6d --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/PlugsonArm64.manifest @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/plugson.ico b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/plugson.ico new file mode 100644 index 00000000..4fd9e2b0 Binary files /dev/null and b/Plugson/vs/VentoyPlugson/VentoyPlugson/Res/plugson.ico differ diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.rc b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.rc new file mode 100644 index 00000000..c10c56df Binary files /dev/null and b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.rc differ diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj new file mode 100644 index 00000000..382d989a --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj @@ -0,0 +1,160 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {321D6EE2-2AB3-4103-9F05-EC4EC67A75E1} + Win32Proj + VentoyPlugson + + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + true + ..\..\..\src\Core;..\..\..\src\Web;..\..\..\src\Include;..\..\..\src\Lib\xz-embedded\linux\include;..\..\..\src\Lib\xz-embedded\linux\include\linux;..\..\..\src\Lib\xz-embedded\userspace;..\..\..\src\Lib\fat_io_lib;..\..\..\src\Lib\libhttp\include;$(ProjectDir);$(IncludePath) + + + false + ..\..\..\src\Core;..\..\..\src\Web;..\..\..\src\Include;..\..\..\src\Lib\xz-embedded\linux\include;..\..\..\src\Lib\xz-embedded\linux\include\linux;..\..\..\src\Lib\xz-embedded\userspace;..\..\..\src\Lib\fat_io_lib;..\..\..\src\Lib\libhttp\include;$(ProjectDir);$(IncludePath);$(VC_IncludePath);$(WindowsSDK_IncludePath) + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;INIT;STATIC=static;%(PreprocessorDefinitions) + true + MultiThreadedDebug + + + Windows + true + RequireAdministrator + + + $(ProjectDir)\Res\Plugson32.manifest %(AdditionalManifestFiles) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;INIT;STATIC=static;%(PreprocessorDefinitions) + true + MultiThreaded + + + Windows + true + true + true + RequireAdministrator + + + $(ProjectDir)\Res\Plugson32.manifest %(AdditionalManifestFiles) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.filters b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.filters new file mode 100644 index 00000000..9f778661 --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.filters @@ -0,0 +1,174 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + + + + + + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 资æºæ–‡ä»¶ + + + + + 资æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.user b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.user new file mode 100644 index 00000000..de064567 --- /dev/null +++ b/Plugson/vs/VentoyPlugson/VentoyPlugson/VentoyPlugson.vcxproj.user @@ -0,0 +1,13 @@ + + + + E:\ + WindowsLocalDebugger + + + + + E:\ + WindowsLocalDebugger + + \ No newline at end of file diff --git a/Plugson/vs/VentoyPlugson/VentoyPlugson/resource.h b/Plugson/vs/VentoyPlugson/VentoyPlugson/resource.h new file mode 100644 index 00000000..515bd706 Binary files /dev/null and b/Plugson/vs/VentoyPlugson/VentoyPlugson/resource.h differ diff --git a/Plugson/www/buildtime b/Plugson/www/buildtime new file mode 100644 index 00000000..483a8bfc --- /dev/null +++ b/Plugson/www/buildtime @@ -0,0 +1 @@ +20211203 17:44:10 \ No newline at end of file diff --git a/Plugson/www/favicon.ico b/Plugson/www/favicon.ico new file mode 100644 index 00000000..9c4273b1 Binary files /dev/null and b/Plugson/www/favicon.ico differ diff --git a/Plugson/www/helplist b/Plugson/www/helplist new file mode 100644 index 00000000..3cd79e60 --- /dev/null +++ b/Plugson/www/helplist @@ -0,0 +1 @@ +de_DEen_USfr_FRhr_HRid_IDja_JPpt_PTsr_CYsr_SRtr_TRzh_CN \ No newline at end of file diff --git a/Plugson/www/index.html b/Plugson/www/index.html new file mode 100644 index 00000000..ed601cda --- /dev/null +++ b/Plugson/www/index.html @@ -0,0 +1,897 @@ + + + + + + + + + Ventoy Plugson + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugson/www/plugson_auto_install.html b/Plugson/www/plugson_auto_install.html new file mode 100644 index 00000000..a8137bf6 --- /dev/null +++ b/Plugson/www/plugson_auto_install.html @@ -0,0 +1,544 @@ +
+
+
+    +

x

+
+ + +
+ + + +
+ diff --git a/Plugson/www/plugson_auto_memdisk.html b/Plugson/www/plugson_auto_memdisk.html new file mode 100644 index 00000000..82b07356 --- /dev/null +++ b/Plugson/www/plugson_auto_memdisk.html @@ -0,0 +1,180 @@ +
+
+
+    +

+
+ + +
+ + + +
+ diff --git a/Plugson/www/plugson_conf_replace.html b/Plugson/www/plugson_conf_replace.html new file mode 100644 index 00000000..0561849f --- /dev/null +++ b/Plugson/www/plugson_conf_replace.html @@ -0,0 +1,276 @@ +
+
+
+    +

èœå•åˆ«åæ’件

+
+ + +
+ + + +
+ diff --git a/Plugson/www/plugson_control.html b/Plugson/www/plugson_control.html new file mode 100644 index 00000000..6c39190a --- /dev/null +++ b/Plugson/www/plugson_control.html @@ -0,0 +1,1176 @@ +
+
+
+    +

全局控制æ’件

+
+ +
+ + +
+ + +
+ + +
+ + + +
+
+

VTOY_DEFAULT_SEARCH_ROOT + —— 指定æœç´¢ç›®å½•

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +
+ +
+
+ 有效 + 无效 +
+
+ +
+
+ +
+
选项说明 + 指定æœç´¢ISO文件的根目录。默认Ventoy会æœç´¢U盘上的所有目录和å­ç›®å½•ï¼Œå½“ä½ U盘上有海é‡çš„文件时,这个过程会很慢。
+ è¿™ç§æƒ…况下你å¯ä»¥æŠŠISO文件å•ç‹¬æ”¾åœ¨æŸä¸ªç›®å½•ä¸‹ï¼Œç„¶åŽé€šè¿‡è¿™ä¸ªå˜é‡æ¥æŒ‡å®šæœç´¢è·¯å¾„,此时Ventoyå°±åªä¼šæœç´¢è¯¥ç›®å½•åŠå…¶å­ç›®å½•ã€‚ +
Option Description + The root path where to search the image files. By default, Ventoy will search all the directories and subdirectories in the USB. This will be very slow when you have huge number of files in the USB. + In this case, you can put all the image files in one directory and use this to specify the search path. + After that Ventoy will only search this directory and its subdirectories for image files. +
+
+
+ + +
+
+

VTOY_WIN11_BYPASS_CHECK + —— 绕过Windows 11硬件检查

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸ç»•è¿‡Windows 11安装时的硬件检查。
+ 1 绕过Windows 11安装时的硬件检查。

+ 该选项åªå¯¹æ ‡å‡†Windows 11 ISO文件有效,对于其他镜åƒæ–‡ä»¶æ— æ•ˆã€‚ + 当设置为1时,Ventoy 会在安装时创建以下几个注册表项用æ¥ç»•è¿‡ Windows 11 安装程åºçš„硬件检查。
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassRAMCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassTPMCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassSecureBootCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassCPUCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassStorageCheck
+
Option Description + 0 Don not bypass Windows 11 hardware check.
+ 1 Bypass Windows 11 hardware check.

+ This option only avaliable for standard Windows 11 ISO files. + When set to 1, Ventoy will create the following registries to bypass Windows 11 hardware check when install.
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassRAMCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassTPMCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassSecureBootCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassCPUCheck
+ HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig\BypassStorageCheck
+
+
+
+ + + + + + +
+
+

VTOY_DEFAULT_MENU_MODE + —— èœå•æ˜¾ç¤ºæ¨¡å¼

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明å¯åŠ¨èœå•é»˜è®¤æ˜¾ç¤ºæ¨¡å¼ï¼Œ + 0 åˆ—è¡¨æ¨¡å¼    + 1 TreeView(目录树) 模å¼
Option Description + Default boot menu display mode. + 0 ListView Mode    + 1 TreeView Mode +
+
+
+ + + + + + + +
+
+

VTOY_MENU_TIMEOUT + —— å¯åŠ¨å€’计时

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +
+ +
+
选项说明 + èœå•å€’计时(秒)。默认为0(å³æ²¡æœ‰è¶…时时间),设置之åŽï¼Œæ¯”如设置为10,则在倒计时10秒之åŽï¼Œä¼šè‡ªåŠ¨å¯åŠ¨é€‰ä¸­çš„é•œåƒæ–‡ä»¶ã€‚在倒计时的过程中按任æ„键会åœæ­¢å€’计时,等待用户æ“作。 +
Option Description + Menu timeout (seconds). Default value is 0 (no timeout is set).
+ When you set it to 10 for example, the selected image will be booted automatically after 10 seconds. + During the countdown, pressing any key will stop the countdown and wait for user operation. +
+
+
+ + + +
+
+

VTOY_DEFAULT_IMAGE + —— 默认选中的镜åƒæ–‡ä»¶

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +
+ +
+
+ 有效 + 无效 +
+
+ +
+
+ +
+
选项说明 + 正常情况下默认选中的是第1个镜åƒæ–‡ä»¶ã€‚通过这个选项å¯ä»¥è®¾ç½®é»˜è®¤é€‰ä¸­çš„é•œåƒæ–‡ä»¶ï¼Œä¸€èˆ¬å’Œ VTOY_MENU_TIMEOUT 一起使用。
+ å¯ä»¥è®¾ç½®ä¸º WIM/VHD/IMG 等支æŒçš„文件,必须是以 / 开始的全路径,ListView模å¼å’ŒTreeView模å¼éƒ½æ”¯æŒã€‚
+ 注æ„,当åŒæ—¶è®¾ç½®äº† VTOY_DEFAULT_SEARCH_ROOT 以åŽï¼ŒVTOY_DEFAULT_IMAGE 对应的文件必须ä½äºŽ VTOY_DEFAULT_SEARCH_ROOT 对应的目录下,å¦åˆ™ä¸ä¼šç”Ÿæ•ˆã€‚ +
Option Description + Default selected image path. Normally used with VTOY_MENU_TIMEOUT.
It can be ISO/WIM/VHD/IMG ... and supported in both ListView mode and TreeView mode.
+ Attention that, when VTOY_DEFAULT_SEARCH_ROOT is set, VTOY_DEFAULT_IMAGE must be in the directory (or sub-directory) of VTOY_DEFAULT_SEARCH_ROOT, otherwise it will not take effect. +
+
+
+ + + + + + + + +
+
+

VTOY_MAX_SEARCH_LEVEL + —— 最大æœç´¢ç›®å½•æ·±åº¦

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + +
选项说明 + 最大æœç´¢å­ç›®å½•çš„层数,å–值为:max 0 1 2 3 ... +    é»˜è®¤å€¼ä¸ºï¼šmax
+ 默认Ventoy会递归æœç´¢ç£ç›˜ä¸Šçš„所有目录和å­ç›®å½•ï¼Œä¸ç®¡ç›®å½•ç»“构有多深都会æœç´¢åˆ°åº•ã€‚ä½ å¯ä»¥é€šè¿‡è¿™ä¸ªå‚æ•°æ¥æŽ§åˆ¶æœç´¢æ—¶çš„路径深度。

+ max : 最大层数,也就是æœç´¢æ‰€æœ‰å­ç›®å½•çš„æ„æ€ã€‚这也是 Ventoy 的默认值。
+ 0 : æœç´¢0层å­ç›®å½•ï¼Œåªåˆ—出根目录下的文件,ä¸åŽ»æœç´¢ä»»ä½•ä¸€ä¸ªå­ç›®å½•ã€‚
+ 1 : æœç´¢1层å­ç›®å½•ï¼Œé™¤äº†æ ¹ç›®å½•ä¸‹çš„文件以外,å†æœç´¢æ ¹ç›®å½•ä¸‹çš„1级å­ç›®å½•ã€‚但是ä¸å†æœç´¢1级å­ç›®å½•ä¸‹çš„å­ç›®å½•ï¼ˆ2级å­ç›®å½•ï¼‰ã€‚
+ 2 : æœç´¢2层å­ç›®å½•ï¼Œé™¤äº†æ ¹ç›®å½•ä¸‹çš„文件以外,å†æœç´¢æ ¹ç›®å½•ä¸‹çš„1级å­ç›®å½•ä»¥åŠ1级å­ç›®å½•ä¸‹çš„å­ç›®å½•ï¼ˆ2级å­ç›®å½•ï¼‰ã€‚
+ 3 : æœç´¢3层å­ç›®å½•ï¼Œ......
+ ...

+ 注æ„,如果 VTOY_DEFAULT_SEARCH_ROOT å‚数也åŒæ—¶è®¾ç½®äº†çš„è¯ï¼Œåˆ™å°±ä»¥ VTOY_DEFAULT_SEARCH_ROOT 指定的目录作为根目录开始计算。 +
Option Description + Max subdirectory level when search for image files. It's value can be: max 0 1 2 3 ... +    default is : max
+ By default, Ventoy will search all the directories and sub directories recursively no matter how deep the directory level is.
+ You can use this parameter to set a max-depth for the search path.

+ max : Maximum, search all the directories and subdirectories. This is Ventoy's default value.
+ 0 : Only search files in the root and don't search any subdirectories.
+ 1 : Search up to level 1 of subdirectories.
+ 2 : Search up to level 2 of subdirectories.
+ 3 : Search up to level 3 of subdirectories.
+ ...

+ If VTOY_DEFAULT_SEARCH_ROOT is set at the same time. Then the level is counted from VTOY_DEFAULT_SEARCH_ROOT . +
+
+
+ + + + +
+
+

VTOY_DEFAULT_KBD_LAYOUT + —— 默认键盘布局

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + +
选项说明 + 键盘布局 +
Option Description + Keyboard Layout +
+
+
+ + + + +
+
+

VTOY_TREE_VIEW_MENU_STYLE + —— TreeView模å¼æ˜¾ç¤ºé£Žæ ¼

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明TreeView模å¼ä¸‹çš„èœå•é£Žæ ¼ã€‚ + 0 显示DIRå’Œæ–‡ä»¶å¤§å°     + 1 ä¸æ˜¾ç¤ºDIR和文件大å°ã€‚åªåœ¨ VTOY_DEFAULT_MENU_MODE 为1æ—¶æ‰æœ‰æ•ˆã€‚ +
Option Description + Menu style in TreeView mode. + 0 with DIR and file size prefix     + 1 No DIR and file size. Default is 0. +
+
+
+ + +
+
+

VTOY_FILT_DOT_UNDERSCORE_FILE + —— 过滤以 ._ 开头的文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明过滤以 ._ 开头的文件。当使用苹果系统时,有时拷è´æ–‡ä»¶ä¼šäº§ç”Ÿä¸€äº› ._ 开头的文件,å¯ä»¥é€šè¿‡æ­¤é€‰é¡¹è¿‡æ»¤æŽ‰ã€‚ + 0 ä¸è¿‡æ»¤    + 1 过滤 +
Option Description + Filter for files with prefix ._ in name. This will be useful when you use macOS (a lot of ._xxx file generated when you copy files). + 0 Don't filt     + 1 Filt +
+
+
+ + + +
+
+

VTOY_SORT_CASE_SENSITIVE + —— èœå•æŽ’åºæ—¶æ˜¯å¦åŒºåˆ†å¤§å°å†™

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明在èœå•æŽ’åºæ—¶æ˜¯å¦å¤§å°å†™æ•æ„Ÿã€‚ + 0 ä¸åŒºåˆ†å¤§å°å†™     1 区分大å°å†™ +
Option Description + Case sensitive when sort the ISO files or directories.     + 0 case insensitive    1 case sensitive +
+
+
+ + + +
+
+

VTOY_VHD_NO_WARNING

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 å¯åŠ¨Windows VHD(x)时,如果U盘分区ä¸æ˜¯NTFSæ ¼å¼ï¼Œåˆ™æ˜¾ç¤ºå‘Šè­¦ä¿¡æ¯ã€‚       + 1 ä¸æ˜¾ç¤ºå‘Šè­¦ä¿¡æ¯ã€‚ +
Option Description + 0 Show a warning message if the partition is not NTFS when booting VHD(x) file.       + 1 No warning message. +
+
+
+ + + + + + +
+
+

VTOY_FILE_FLT_ISO + —— 过滤 .iso 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .iso 文件       + 1 过滤掉 .iso 文件。      + è¿‡æ»¤ä¹‹åŽ .iso 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .iso files.      + 1 Filter .iso files.      + The iso files will not be shown in the boot menu if set to 1. +
+
+
+ + +
+
+

VTOY_FILE_FLT_WIM + —— 过滤 .wim 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .wim 文件       + 1 过滤掉 .wim 文件。      + è¿‡æ»¤ä¹‹åŽ .wim 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .wim files.      + 1 Filter .wim files.      + The wim files will not be shown in the boot menu if set to 1. +
+
+
+ + + +
+
+

VTOY_FILE_FLT_EFI + —— 过滤 .efi 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .efi 文件       + 1 过滤掉 .efi 文件。      + è¿‡æ»¤ä¹‹åŽ .efi 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .efi files.      + 1 Filter .efi files.      + The efi files will not be shown in the boot menu if set to 1. +
+
+
+ + + +
+
+

VTOY_FILE_FLT_IMG + —— 过滤 .img 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .img 文件       + 1 过滤掉 .img 文件。      + è¿‡æ»¤ä¹‹åŽ .img 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .img files.      + 1 Filter .img files.      + The img files will not be shown in the boot menu if set to 1. +
+
+
+ + + +
+
+

VTOY_FILE_FLT_VHD + —— 过滤 .vhd(x) 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .vhd(x) 文件       + 1 过滤掉 .vhd(x) 文件。      + è¿‡æ»¤ä¹‹åŽ .vhd(x) 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .vhd(x) files.      + 1 Filter .vhd(x) files.      + The vhd(x) files will not be shown in the boot menu if set to 1. +
+
+
+ + + +
+
+

VTOY_FILE_FLT_VTOY + —— 过滤 .vtoy 文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 +      + +
选项说明 + 0 ä¸è¿‡æ»¤ .vtoy 文件       + 1 过滤掉 .vtoy 文件。      + è¿‡æ»¤ä¹‹åŽ .vtoy 文件就ä¸ä¼šæ˜¾ç¤ºåœ¨å¯åŠ¨èœå•ä¸­ã€‚ +
Option Description + 0 List .vtoy files.      + 1 Filter .vtoy files.      + The vtoy files will not be shown in the boot menu if set to 1. +
+
+
+ + +
+
+

VTOY_HELP_TXT_LANGUAGE + —— 帮助信æ¯è¯­è¨€

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + +
选项说明 + å¿«æ·é”® h 显示的帮助信æ¯çš„语言版本。默认是 "en_US"。 + 具体请å‚考 Ventoy å¸®åŠ©ä¿¡æ¯ +
Option Description + The language of the help text when press h. Default is "en_US", + refer Ventoy Help Text for details. +
+
+
+ + + +
+ +
+ diff --git a/Plugson/www/plugson_donation.html b/Plugson/www/plugson_donation.html new file mode 100644 index 00000000..568133aa --- /dev/null +++ b/Plugson/www/plugson_donation.html @@ -0,0 +1,57 @@ +
+
+
+    +

æ助

+
+
+ +
+ +
+

+ Ventoy是开æºå…费的,如果你愿æ„æ助æ¥æ”¯æŒè¿™ä¸ªå·¥å…·ä»¥åŠæˆ‘的工作,我会éžå¸¸æ„Ÿæ¿€ã€‚ +

+

+ ä½ å¯ä»¥é€‰æ‹©ä½¿ç”¨æ”¯ä»˜å®æˆ–微信进行æ助。 +

+
+
+
+
+
+ +
+

+ It would be much appreciated if you want to make a small donation to support Ventoy! +

+

+ PayPal and Bitcoin are avaliable for donation. You can chose any of them.

+ PayPal Link  https://www.paypal.me/ventoy

+ PayPal Account   admin@ventoy.net

+ Bitcoin Address  19mZDWzZgzkHCi9YX9H3fYCUuCHq3W6wfT
+

+
+ +
+
+ diff --git a/Plugson/www/plugson_dud.html b/Plugson/www/plugson_dud.html new file mode 100644 index 00000000..943343df --- /dev/null +++ b/Plugson/www/plugson_dud.html @@ -0,0 +1,363 @@ +
+
+
+    +

x

+
+ + +
+ + +
+ + + + + + + + + + + + +
#
+
+
+ diff --git a/Plugson/www/plugson_image_list.html b/Plugson/www/plugson_image_list.html new file mode 100644 index 00000000..4fc770fe --- /dev/null +++ b/Plugson/www/plugson_image_list.html @@ -0,0 +1,270 @@ +
+
+
+    +

+
+ + +
+ + +
+ + + +
+
+

Mode

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + + +
选项说明 + 白åå•æ¨¡å¼
+ 由用户自己列出文件列表,Ventoy ä¸å†æœç´¢è€Œæ˜¯ç›´æŽ¥ä½¿ç”¨ä½ ç»™å‡ºçš„文件列表。 åŒæ—¶ Ventoy 也ä¸å†å¯¹æ–‡ä»¶è¿›è¡ŒæŽ’åºï¼Œè€Œæ˜¯ç›´æŽ¥æŒ‰ç…§åˆ—表给出的文件顺åºæ¥æ˜¾ç¤ºå¯åŠ¨èœå•ã€‚
+ 黑åå•æ¨¡å¼
+ Ventoy 首先还是åƒåŽŸæ¥ä¸€æ ·æœç´¢ï¼Œæœ€åŽå†ä»Žæœç´¢ç»“果中剔除这个列表中的文件。
+
Option Description + Permit Mode
+ Ventoy will no longer search for the files but just use your file list. Also, Ventoy will NOT sort these files anymore, but directly display the boot menu according to the order given in the list.
+ Deny Mode
+ Firstly, Ventoy will search as normal. And then remove the files in the blacklist from the search result.
+
+
+
+ + +
+
+

List

+
+ +
+
+
+ + + + + + + + + + + +
#
+
+
+ + +
+
+ diff --git a/Plugson/www/plugson_injection.html b/Plugson/www/plugson_injection.html new file mode 100644 index 00000000..ce67093f --- /dev/null +++ b/Plugson/www/plugson_injection.html @@ -0,0 +1,245 @@ +
+
+
+    +

x

+
+ + +
+ + +
+ + + + + + + + + + + + + + + + +
#
+
+
+ diff --git a/Plugson/www/plugson_main.html b/Plugson/www/plugson_main.html new file mode 100644 index 00000000..408c4f55 --- /dev/null +++ b/Plugson/www/plugson_main.html @@ -0,0 +1,127 @@ +
+
+ +

设备信æ¯

+
+
+ +
+
+
+

设备硬件信æ¯

+
+ +
+
+
+ + + + + + + + + + + + + + +
+ +
+
+
+ + + +
+
+
+

设备内 Ventoy ä¿¡æ¯

+
+ +
+
+
+ + + + + + + + + + + + + + + +
Ventoy
å¼€å¯
+ +
+
+
+ +
+ +
+ diff --git a/Plugson/www/plugson_menu_alias.html b/Plugson/www/plugson_menu_alias.html new file mode 100644 index 00000000..5c75e155 --- /dev/null +++ b/Plugson/www/plugson_menu_alias.html @@ -0,0 +1,239 @@ +
+
+
+    +

èœå•åˆ«åæ’件

+
+ + +
+ + +
+ + + + + + + + + + + + + + + +
#
+
+
+ diff --git a/Plugson/www/plugson_menu_class.html b/Plugson/www/plugson_menu_class.html new file mode 100644 index 00000000..c451662c --- /dev/null +++ b/Plugson/www/plugson_menu_class.html @@ -0,0 +1,278 @@ +
+
+
+    +

xx

+
+ + +
+ + +
+ + + + + + + + + + + + + + + +
#
+
+
+ diff --git a/Plugson/www/plugson_menu_tip.html b/Plugson/www/plugson_menu_tip.html new file mode 100644 index 00000000..b68ef4ea --- /dev/null +++ b/Plugson/www/plugson_menu_tip.html @@ -0,0 +1,377 @@ +
+
+
+    +

+
+ + +
+ + +
+ + +
+
+

Menu Tips + —— èœå•æ示信æ¯

+
+ +
+
+
+ + + + + + + + + + + + + +
#
+
+
+

+ +
+
+

Tip Style + —— æ示信æ¯æ˜¾ç¤ºä½ç½®

+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
left + + + æ示信æ¯æ˜¾ç¤ºçš„ X å标百分比(相对于左上角) + X position of the tip message. (Percentage form relative to the upper left corner) +
top + + + æ示信æ¯æ˜¾ç¤ºçš„ Y å标百分比(相对于左上角) + Y position of the tip message. (Percentage form relative to the upper left corner) +
color + + + æ示信æ¯çš„颜色。å¯ä»¥æ˜¯ blue/red/green/... 等这ç§æ ¼å¼ï¼Œä¹Ÿå¯ä»¥è®¾ç½®ä¸º #00ff00 è¿™ç§æ ¼å¼ã€‚ + Color of the tip message. Can be in blue/red/green/... or #00ff00 format. +
+
+
+ + +
+
+ diff --git a/Plugson/www/plugson_password.html b/Plugson/www/plugson_password.html new file mode 100644 index 00000000..0f25bddb --- /dev/null +++ b/Plugson/www/plugson_password.html @@ -0,0 +1,564 @@ +
+
+
+   +

+
+ + +
+ + +
+ + + +
+
+

Common Password + —— 通用密ç 

+
+ +
+
+
+ + + + + + + + + + + +
+
+
+ + +
+
+

Menu Password + —— èœå•å¯†ç 

+
+ +
+
+
+ + + + + + + + + + + + + +
#
+
+
+

+ + +
+
+ diff --git a/Plugson/www/plugson_persistence.html b/Plugson/www/plugson_persistence.html new file mode 100644 index 00000000..97c6ce91 --- /dev/null +++ b/Plugson/www/plugson_persistence.html @@ -0,0 +1,512 @@ +
+
+
+    +

x

+
+ + +
+ + + +
+ diff --git a/Plugson/www/plugson_theme.html b/Plugson/www/plugson_theme.html new file mode 100644 index 00000000..16bc9733 --- /dev/null +++ b/Plugson/www/plugson_theme.html @@ -0,0 +1,520 @@ +
+
+
+    +

主题æ’件

+
+ + +
+ + +
+ + + +
+
+

file + —— 主题é…置文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + + + + + + + + + + + + + +
#文件路径默认状æ€æ“作
+
选项说明 + theme.txt 文件的全路径。å¯ä»¥è®¾ç½®1个或者多个。当设置为多个时,å¯åŠ¨ä¹‹åŽè¿˜å¯ä»¥é€šè¿‡ F5 Tools --> Theme Select èœå•è¿›è¡Œåˆ‡æ¢ã€‚ +
Option Description + The theme.txt file path. You can add one or more files. You can switch between themes with F5 Tools --> Theme Select menu if you set more than one themes. +
+
+
+ + +
+
+

display_mode + —— å±å¹•æ˜¾ç¤ºæ¨¡å¼

+
+ +
+
+
+ + + + + + + + + + + +
选项设置 +
选项说明 + èœå•æ˜¾ç¤ºæ¨¡å¼ï¼Œå¯ä»¥è®¾ç½®ä¸º 默认为 GUI 模å¼ã€‚GUIå’ŒCLI 分别对应图形模å¼å’Œæ–‡æœ¬æ¨¡å¼ã€‚
+ 在有æžä¸ªåˆ«çš„机器上Ventoy的背景èœå•æ— æ³•æ˜¾ç¤ºï¼Œæˆ–者显示åŽèœå•ç§»åŠ¨æžå…¶ç¼“慢,这ç§æƒ…况å¯ä»¥é»˜è®¤è®¾ç½®ä¸ºæ–‡æœ¬æ¨¡å¼ã€‚
+ ä¸è¿‡ï¼Œä¸ç®¡GUI还是CLI都是基于VGA显示设备的,如果你的机器上åªæœ‰ä¸²å£ï¼Œä½ å¯ä»¥è®¾ç½®ä¸º serial
+ 当然,如果既有串å£ä¹Ÿæœ‰VGA设备,则也å¯ä»¥è®¾ç½®ä¸º serial_console
+ 注æ„:如果èœå•å称(文件å)里有中文的è¯ï¼Œåœ¨æ–‡æœ¬æˆ–serial模å¼ä¸‹æ˜¯æ— æ³•æ˜¾ç¤ºçš„。 +
Option Description + Boot menu display mode, default is GUI. GUI or CLI corresponding to the GUI mode and TEXT mode respectively.
+ On very few machines Ventoy's menu can't be shown or the cursor moves extremely slow. In this case you can set the default mode to "CLI".
+ However, both "GUI" and "CLI" need a VGA device, if your machine only has serial, you can use serial
+ Also you can use serial_console if you have both serial and VGA device.
+ Attention: Unicode characters will NOT be displayed normally in CLI or serial mode. +
+
+
+ + +
+
+

gfxmode + —— å±å¹•åˆ†è¾¨çŽ‡

+
+ +
+
+
+ + + + + + + + + + + +
选项设置 +
选项说明 + 默认使用的å±å¹•åˆ†è¾¨çŽ‡ï¼Œé»˜è®¤ä¸º "1024x768"。åªæœ‰åœ¨ä¸Šé¢çš„ display_mode 选项设置为 GUI æ—¶æ‰æœ‰æ•ˆã€‚ +
Option Description + Default screen resolution, default is "1024x768". Only take effect when display_mode option is GUI. +
+
+
+ + +
+
+

fonts + —— 字体文件

+
+ +
+
+
+ + + + + + + + + + + + + +
选项设置 + + + + + + + + + + + +
#文件路径状æ€æ“作
+
选项说明 + 字体文件的全路径。Ventoy在å¯åŠ¨æ—¶ä¼šä¾æ¬¡åŠ è½½è¿™äº›å­—体文件。 +
Option Description + Full path of fonts file. Ventoy will load each of them when boot. +
+
+
+ + +
+ +
+ diff --git a/Plugson/www/static/AdminLTE/css/AdminLTE.css b/Plugson/www/static/AdminLTE/css/AdminLTE.css new file mode 100644 index 00000000..12964d9b --- /dev/null +++ b/Plugson/www/static/AdminLTE/css/AdminLTE.css @@ -0,0 +1,4729 @@ +/*@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);*/ +/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + min-height: 100%; +} +.layout-boxed html, +.layout-boxed body { + height: 100%; +} +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} +/* Layout */ +.wrapper { + min-height: 100%; + position: static; + overflow: hidden; +} +.wrapper:before, +.wrapper:after { + content: " "; + display: table; +} +.wrapper:after { + clear: both; +} +.layout-boxed .wrapper { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; +} +.layout-boxed { + background: url('../img/boxed-bg.jpg') repeat fixed; +} +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; + margin-left: 230px; + z-index: 820; +} +.layout-top-nav .content-wrapper, +.layout-top-nav .right-side, +.layout-top-nav .main-footer { + margin-left: 0; +} +@media (max-width: 767px) { + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0; + } +} +@media (min-width: 768px) { + .sidebar-collapse .content-wrapper, + .sidebar-collapse .right-side, + .sidebar-collapse .main-footer { + margin-left: 0; + } +} +@media (max-width: 767px) { + .sidebar-open .content-wrapper, + .sidebar-open .right-side, + .sidebar-open .main-footer { + -webkit-transform: translate(230px, 0); + -ms-transform: translate(230px, 0); + -o-transform: translate(230px, 0); + transform: translate(230px, 0); + } +} +.content-wrapper, +.right-side { + min-height: 100%; + background-color: #ecf0f5; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid #d2d6de; +} +/* Fixed layout */ +.fixed .main-header, +.fixed .main-sidebar, +.fixed .left-side { + position: fixed; +} +.fixed .main-header { + top: 0; + right: 0; + left: 0; +} +.fixed .content-wrapper, +.fixed .right-side { + padding-top: 50px; +} +@media (max-width: 767px) { + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 100px; + } +} +.fixed.layout-boxed .wrapper { + max-width: 100%; +} +body.hold-transition .content-wrapper, +body.hold-transition .right-side, +body.hold-transition .main-footer, +body.hold-transition .main-sidebar, +body.hold-transition .left-side, +body.hold-transition .main-header > .navbar, +body.hold-transition .main-header .logo { + /* Fix for IE */ + -webkit-transition: none; + -o-transition: none; + transition: none; +} +/* Content */ +.content { + min-height: 250px; + padding: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: #3c8dbc; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: #72afd2; +} +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; +} +.page-header > small { + color: #666; + display: block; + margin-top: 5px; +} +/* + * Component: Main Header + * ---------------------- + */ +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; +} +.main-header > .navbar { + -webkit-transition: margin-left 0.3s ease-in-out; + -o-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + margin-bottom: 0; + margin-left: 230px; + border: none; + min-height: 50px; + border-radius: 0; +} +.layout-top-nav .main-header > .navbar { + margin-left: 0; +} +.main-header #navbar-search-input.form-control { + background: rgba(255, 255, 255, 0.2); + border-color: transparent; +} +.main-header #navbar-search-input.form-control:focus, +.main-header #navbar-search-input.form-control:active { + border-color: rgba(0, 0, 0, 0.1); + background: rgba(255, 255, 255, 0.9); +} +.main-header #navbar-search-input.form-control::-moz-placeholder { + color: #ccc; + opacity: 1; +} +.main-header #navbar-search-input.form-control:-ms-input-placeholder { + color: #ccc; +} +.main-header #navbar-search-input.form-control::-webkit-input-placeholder { + color: #ccc; +} +.main-header .navbar-custom-menu, +.main-header .navbar-right { + float: right; +} +@media (max-width: 991px) { + .main-header .navbar-custom-menu a, + .main-header .navbar-right a { + color: inherit; + background: transparent; + } +} +@media (max-width: 767px) { + .main-header .navbar-right { + float: none; + } + .navbar-collapse .main-header .navbar-right { + margin: 7.5px -15px; + } + .main-header .navbar-right > li { + color: inherit; + border: 0; + } +} +.main-header .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: 15px 15px; + font-family: fontAwesome; +} +.main-header .sidebar-toggle:before { + content: "\f0c9"; +} +.main-header .sidebar-toggle:hover { + color: #fff; +} +.main-header .sidebar-toggle:focus, +.main-header .sidebar-toggle:active { + background: transparent; +} +.main-header .sidebar-toggle .icon-bar { + display: none; +} +.main-header .navbar .nav > li.user > a > .fa, +.main-header .navbar .nav > li.user > a > .glyphicon, +.main-header .navbar .nav > li.user > a > .ion { + margin-right: 5px; +} +.main-header .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; +} +.main-header .logo { + -webkit-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + display: block; + float: left; + height: 50px; + font-size: 20px; + line-height: 50px; + text-align: center; + width: 230px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; +} +.main-header .logo .logo-lg { + display: block; +} +.main-header .logo .logo-mini { + display: none; +} +.main-header .navbar-brand { + color: #fff; +} +.content-header { + position: relative; + padding: 15px 15px 0 15px; +} +.content-header > h1 { + margin: 0; + font-size: 24px; +} +.content-header > h1 > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; +} +.content-header > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + border-radius: 2px; +} +.content-header > .breadcrumb > li > a { + color: #444; + text-decoration: none; + display: inline-block; +} +.content-header > .breadcrumb > li > a > .fa, +.content-header > .breadcrumb > li > a > .glyphicon, +.content-header > .breadcrumb > li > a > .ion { + margin-right: 5px; +} +.content-header > .breadcrumb > li + li:before { + content: '>\00a0'; +} +@media (max-width: 991px) { + .content-header > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: #d2d6de; + padding-left: 10px; + } + .content-header > .breadcrumb li:before { + color: #97a0b3; + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: 15px 15px; +} +@media (max-width: 991px) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} +@media (max-width: 767px) { + .main-header { + position: relative; + } + .main-header .logo, + .main-header .navbar { + width: 100%; + float: none; + } + .main-header .navbar { + margin: 0; + } + .main-header .navbar-custom-menu { + float: right; + } +} +@media (max-width: 991px) { + .navbar-collapse.pull-left { + float: none!important; + } + .navbar-collapse.pull-left + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } +} +/* + * Component: Sidebar + * ------------------ + */ +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: 230px; + z-index: 810; + -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + padding-top: 100px; + } +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (min-width: 768px) { + .sidebar-collapse .main-sidebar, + .sidebar-collapse .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (max-width: 767px) { + .sidebar-open .main-sidebar, + .sidebar-open .left-side { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } +} +.sidebar { + padding-bottom: 10px; +} +.sidebar-form input:focus { + border-color: transparent; +} +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; +} +.user-panel:before, +.user-panel:after { + content: " "; + display: table; +} +.user-panel:after { + clear: both; +} +.user-panel > .image > img { + width: 100%; + max-width: 45px; + height: auto; +} +.user-panel > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; +} +.user-panel > .info > p { + font-weight: 600; + margin-bottom: 9px; +} +.user-panel > .info > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; +} +.user-panel > .info > a > .fa, +.user-panel > .info > a > .ion, +.user-panel > .info > a > .glyphicon { + margin-right: 3px; +} +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-menu > li { + position: relative; + margin: 0; + padding: 0; +} +.sidebar-menu > li > a { + padding: 12px 5px 12px 15px; + display: block; +} +.sidebar-menu > li > a > .fa, +.sidebar-menu > li > a > .glyphicon, +.sidebar-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu > li .label, +.sidebar-menu > li .badge { + margin-top: 3px; + margin-right: 5px; +} +.sidebar-menu li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; +} +.sidebar-menu li > a > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + margin-top: 3px; +} +.sidebar-menu li.active > a > .fa-angle-left { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.sidebar-menu li.active > .treeview-menu { + display: block; +} +.sidebar-menu .treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; +} +.sidebar-menu .treeview-menu .treeview-menu { + padding-left: 20px; +} +.sidebar-menu .treeview-menu > li { + margin: 0; +} +.sidebar-menu .treeview-menu > li > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; +} +.sidebar-menu .treeview-menu > li > a > .fa, +.sidebar-menu .treeview-menu > li > a > .glyphicon, +.sidebar-menu .treeview-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu .treeview-menu > li > a > .fa-angle-left, +.sidebar-menu .treeview-menu > li > a > .fa-angle-down { + width: auto; +} +/* + * Component: Sidebar Mini + */ +@media (min-width: 768px) { + .sidebar-mini.sidebar-collapse .content-wrapper, + .sidebar-mini.sidebar-collapse .right-side, + .sidebar-mini.sidebar-collapse .main-footer { + margin-left: 50px!important; + z-index: 840; + } + .sidebar-mini.sidebar-collapse .main-sidebar { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + width: 50px!important; + z-index: 850; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li { + position: relative; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { + margin-right: 0; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { + border-top-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + display: block!important; + position: absolute; + width: 180px; + left: 50px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + top: 44px; + margin-left: 0; + } + .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, + .sidebar-mini.sidebar-collapse .sidebar-form, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, + .sidebar-mini.sidebar-collapse .sidebar-menu li.header { + display: none!important; + -webkit-transform: translateZ(0); + } + .sidebar-mini.sidebar-collapse .main-header .logo { + width: 50px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { + display: none; + } + .sidebar-mini.sidebar-collapse .main-header .navbar { + margin-left: 50px; + } +} +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; +} +.sidebar-menu li > a > .pull-right { + position: absolute; + top: 50%; + right: 10px; + margin-top: -7px; +} +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -230px; + width: 230px; + -webkit-transition: right 0.3s ease-in-out; + -o-transition: right 0.3s ease-in-out; + transition: right 0.3s ease-in-out; +} +.control-sidebar { + position: absolute; + padding-top: 50px; + z-index: 1010; +} +@media (max-width: 768px) { + .control-sidebar { + padding-top: 100px; + } +} +.control-sidebar > .tab-content { + padding: 10px 15px; +} +.control-sidebar.control-sidebar-open, +.control-sidebar.control-sidebar-open + .control-sidebar-bg { + right: 0; +} +.control-sidebar-open .control-sidebar-bg, +.control-sidebar-open .control-sidebar { + right: 0; +} +@media (min-width: 768px) { + .control-sidebar-open .content-wrapper, + .control-sidebar-open .right-side, + .control-sidebar-open .main-footer { + margin-right: 230px; + } +} +.nav-tabs.control-sidebar-tabs > li:first-of-type > a, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { + border-left-width: 0; +} +.nav-tabs.control-sidebar-tabs > li > a { + border-radius: 0; +} +.nav-tabs.control-sidebar-tabs > li > a, +.nav-tabs.control-sidebar-tabs > li > a:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} +.nav-tabs.control-sidebar-tabs > li > a .icon { + font-size: 16px; +} +.nav-tabs.control-sidebar-tabs > li.active > a, +.nav-tabs.control-sidebar-tabs > li.active > a:hover, +.nav-tabs.control-sidebar-tabs > li.active > a:focus, +.nav-tabs.control-sidebar-tabs > li.active > a:active { + border-top: none; + border-right: none; + border-bottom: none; +} +@media (max-width: 768px) { + .nav-tabs.control-sidebar-tabs { + display: table; + } + .nav-tabs.control-sidebar-tabs > li { + display: table-cell; + } +} +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; +} +.control-sidebar-menu > li > a { + display: block; + padding: 10px 15px; +} +.control-sidebar-menu > li > a:before, +.control-sidebar-menu > li > a:after { + content: " "; + display: table; +} +.control-sidebar-menu > li > a:after { + clear: both; +} +.control-sidebar-menu > li > a > .control-sidebar-subheading { + margin-top: 0; +} +.control-sidebar-menu .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; +} +.control-sidebar-menu .menu-info { + margin-left: 45px; + margin-top: 3px; +} +.control-sidebar-menu .menu-info > .control-sidebar-subheading { + margin: 0; +} +.control-sidebar-menu .menu-info > p { + margin: 0; + font-size: 11px; +} +.control-sidebar-menu .progress { + margin: 0; +} +.control-sidebar-dark { + color: #b8c7ce; +} +.control-sidebar-dark, +.control-sidebar-dark + .control-sidebar-bg { + background: #222d32; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs { + border-bottom: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { + background: #181f23; + color: #b8c7ce; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #141a1d; + border-bottom-color: #141a1d; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { + background: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { + color: #fff; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #222d32; + color: #fff; +} +.control-sidebar-dark .control-sidebar-heading, +.control-sidebar-dark .control-sidebar-subheading { + color: #fff; +} +.control-sidebar-dark .control-sidebar-menu > li > a:hover { + background: #1e282c; +} +.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { + color: #b8c7ce; +} +.control-sidebar-light { + color: #5e5e5e; +} +.control-sidebar-light, +.control-sidebar-light + .control-sidebar-bg { + background: #f9fafc; + border-left: 1px solid #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs { + border-bottom: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { + background: #e8ecf4; + color: #444444; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #d2d6de; + border-bottom-color: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { + background: #eff1f7; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #f9fafc; + color: #111; +} +.control-sidebar-light .control-sidebar-heading, +.control-sidebar-light .control-sidebar-subheading { + color: #111; +} +.control-sidebar-light .control-sidebar-menu { + margin-left: -14px; +} +.control-sidebar-light .control-sidebar-menu > li > a:hover { + background: #f4f4f5; +} +.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { + color: #5e5e5e; +} +/* + * Component: Dropdown menus + * ------------------------- + */ +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; +} +.dropdown-menu > li > a { + color: #777; +} +.dropdown-menu > li > a > .glyphicon, +.dropdown-menu > li > a > .fa, +.dropdown-menu > li > a > .ion { + margin-right: 10px; +} +.dropdown-menu > li > a:hover { + background-color: #e1e3e9; + color: #333; +} +.dropdown-menu > .divider { + background-color: #eee; +} +.navbar-nav > .notifications-menu > .dropdown-menu, +.navbar-nav > .messages-menu > .dropdown-menu, +.navbar-nav > .tasks-menu > .dropdown-menu { + width: 280px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li, +.navbar-nav > .messages-menu > .dropdown-menu > li, +.navbar-nav > .tasks-menu > .dropdown-menu > li { + position: relative; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.header, +.navbar-nav > .messages-menu > .dropdown-menu > li.header, +.navbar-nav > .tasks-menu > .dropdown-menu > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444!important; + text-align: center; +} +@media (max-width: 991px) { + .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + background: #fff!important; + color: #444!important; + } +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { + text-decoration: none; + font-weight: normal; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + display: block; + white-space: nowrap; + /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 10px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { + width: 20px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { + margin: 0; + padding: 10px 10px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + content: " "; + display: table; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + clear: both; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + padding: 10px; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { + padding: 0; + margin: 0; +} +.navbar-nav > .user-menu > .dropdown-menu { + border-top-right-radius: 0; + border-top-left-radius: 0; + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; +} +.navbar-nav > .user-menu > .dropdown-menu, +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header { + height: 175px; + padding: 10px; + text-align: center; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + margin-top: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { + display: block; + font-size: 12px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body a { + color: #444 !important; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-body a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer { + background-color: #f9f9f9; + padding: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { + color: #666666; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { + background-color: #f9f9f9; + } +} +.navbar-nav > .user-menu .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} +@media (max-width: 767px) { + .navbar-nav > .user-menu .user-image { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } +} +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + -webkit-animation: flipInX 0.7s both; + -o-animation: flipInX 0.7s both; + animation: flipInX 0.7s both; +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + -webkit-transform: perspective(400px); + } +} +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav > li { + position: relative; +} +.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 0; + left: auto; +} +@media (max-width: 991px) { + .navbar-custom-menu > .navbar-nav { + float: right; + } + .navbar-custom-menu > .navbar-nav > li { + position: static; + } + .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } +} +/* + * Component: Form + * --------------- + */ +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de; +} +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none; +} +.form-control::-moz-placeholder, +.form-control:-ms-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1; +} +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-group.has-success label { + color: #00a65a; +} +.form-group.has-success .form-control { + border-color: #00a65a; + box-shadow: none; +} +.form-group.has-warning label { + color: #f39c12; +} +.form-group.has-warning .form-control { + border-color: #f39c12; + box-shadow: none; +} +.form-group.has-error label { + color: #dd4b39; +} +.form-group.has-error .form-control { + border-color: #dd4b39; + box-shadow: none; +} +/* Input group */ +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; +} +/* button groups */ +.btn-group-vertical .btn.btn-flat:first-of-type, +.btn-group-vertical .btn.btn-flat:last-of-type { + border-radius: 0; +} +.icheck > label { + padding-left: 0; +} +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: 34px; +} +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: 46px; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: 30px; +} +/* + * Component: Progress Bar + * ----------------------- + */ +.progress, +.progress > .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress, +.progress > .progress-bar, +.progress .progress-bar, +.progress > .progress-bar .progress-bar { + border-radius: 1px; +} +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; +} +.progress.sm, +.progress-sm, +.progress.sm .progress-bar, +.progress-sm .progress-bar { + border-radius: 1px; +} +.progress.xs, +.progress-xs { + height: 7px; +} +.progress.xs, +.progress-xs, +.progress.xs .progress-bar, +.progress-xs .progress-bar { + border-radius: 1px; +} +.progress.xxs, +.progress-xxs { + height: 3px; +} +.progress.xxs, +.progress-xxs, +.progress.xxs .progress-bar, +.progress-xxs .progress-bar { + border-radius: 1px; +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; +} +.progress.vertical > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; +} +.progress.vertical.sm, +.progress.vertical.progress-sm { + width: 20px; +} +.progress.vertical.xs, +.progress.vertical.progress-xs { + width: 10px; +} +.progress.vertical.xxs, +.progress.vertical.progress-xxs { + width: 3px; +} +.progress-group .progress-text { + font-weight: 600; +} +.progress-group .progress-number { + float: right; +} +/* Remove margins from progress bars when put in a table */ +.table tr > td .progress { + margin: 0; +} +.progress-bar-light-blue, +.progress-bar-primary { + background-color: #3c8dbc; +} +.progress-striped .progress-bar-light-blue, +.progress-striped .progress-bar-primary { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-green, +.progress-bar-success { + background-color: #00a65a; +} +.progress-striped .progress-bar-green, +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-aqua, +.progress-bar-info { + background-color: #00c0ef; +} +.progress-striped .progress-bar-aqua, +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-yellow, +.progress-bar-warning { + background-color: #f39c12; +} +.progress-striped .progress-bar-yellow, +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-red, +.progress-bar-danger { + background-color: #dd4b39; +} +.progress-striped .progress-bar-red, +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +/* + * Component: Small Box + * -------------------- + */ +.small-box { + border-radius: 2px; + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.small-box > .inner { + padding: 10px; +} +.small-box > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} +.small-box > .small-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} +.small-box h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; +} +.small-box p { + font-size: 15px; +} +.small-box p > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; +} +.small-box h3, +.small-box p { + z-index: 5px; +} +.small-box .icon { + -webkit-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); +} +.small-box:hover { + text-decoration: none; + color: #f9f9f9; +} +.small-box:hover .icon { + font-size: 95px; +} +@media (max-width: 767px) { + .small-box { + text-align: center; + } + .small-box .icon { + display: none; + } + .small-box p { + font-size: 12px; + } +} +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + border-radius: 3px; + background: #ffffff; + border-top: 3px solid #d2d6de; + margin-bottom: 20px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.box.box-primary { + border-top-color: #3c8dbc; +} +.box.box-info { + border-top-color: #00c0ef; +} +.box.box-danger { + border-top-color: #dd4b39; +} +.box.box-warning { + border-top-color: #f39c12; +} +.box.box-success { + border-top-color: #00a65a; +} +.box.box-default { + border-top-color: #d2d6de; +} +.box.collapsed-box .box-body, +.box.collapsed-box .box-footer { + display: none; +} +.box .nav-stacked > li { + border-bottom: 1px solid #f4f4f4; + margin: 0; +} +.box .nav-stacked > li:last-of-type { + border-bottom: none; +} +.box.height-control .box-body { + max-height: 300px; + overflow: auto; +} +.box .border-right { + border-right: 1px solid #f4f4f4; +} +.box .border-left { + border-left: 1px solid #f4f4f4; +} +.box.box-solid { + border-top: 0; +} +.box.box-solid > .box-header .btn.btn-default { + background: transparent; +} +.box.box-solid > .box-header .btn:hover, +.box.box-solid > .box-header a:hover { + background: rgba(0, 0, 0, 0.1); +} +.box.box-solid.box-default { + border: 1px solid #d2d6de; +} +.box.box-solid.box-default > .box-header { + color: #444444; + background: #d2d6de; + background-color: #d2d6de; +} +.box.box-solid.box-default > .box-header a, +.box.box-solid.box-default > .box-header .btn { + color: #444444; +} +.box.box-solid.box-primary { + border: 1px solid #3c8dbc; +} +.box.box-solid.box-primary > .box-header { + color: #ffffff; + background: #3c8dbc; + background-color: #3c8dbc; +} +.box.box-solid.box-primary > .box-header a, +.box.box-solid.box-primary > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-info { + border: 1px solid #00c0ef; +} +.box.box-solid.box-info > .box-header { + color: #ffffff; + background: #00c0ef; + background-color: #00c0ef; +} +.box.box-solid.box-info > .box-header a, +.box.box-solid.box-info > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-danger { + border: 1px solid #dd4b39; +} +.box.box-solid.box-danger > .box-header { + color: #ffffff; + background: #dd4b39; + background-color: #dd4b39; +} +.box.box-solid.box-danger > .box-header a, +.box.box-solid.box-danger > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-warning { + border: 1px solid #f39c12; +} +.box.box-solid.box-warning > .box-header { + color: #ffffff; + background: #f39c12; + background-color: #f39c12; +} +.box.box-solid.box-warning > .box-header a, +.box.box-solid.box-warning > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-success { + border: 1px solid #00a65a; +} +.box.box-solid.box-success > .box-header { + color: #ffffff; + background: #00a65a; + background-color: #00a65a; +} +.box.box-solid.box-success > .box-header a, +.box.box-solid.box-success > .box-header .btn { + color: #ffffff; +} +.box.box-solid > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; +} +.box.box-solid[class*='bg'] > .box-header { + color: #fff; +} +.box .box-group > .box { + margin-bottom: 5px; +} +.box .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; +} +.box > .overlay, +.overlay-wrapper > .overlay, +.box > .loading-img, +.overlay-wrapper > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.box .overlay, +.overlay-wrapper .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} +.box .overlay > .fa, +.overlay-wrapper .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} +.box .overlay.dark, +.overlay-wrapper .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} +.box-header:before, +.box-body:before, +.box-footer:before, +.box-header:after, +.box-body:after, +.box-footer:after { + content: " "; + display: table; +} +.box-header:after, +.box-body:after, +.box-footer:after { + clear: both; +} +.box-header { + color: #444; + display: block; + padding: 10px; + position: relative; +} +.box-header.with-border { + border-bottom: 1px solid #f4f4f4; +} +.collapsed-box .box-header.with-border { + border-bottom: none; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion, +.box-header .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion { + margin-right: 5px; +} +.box-header > .box-tools { + position: absolute; + right: 10px; + top: 5px; +} +.box-header > .box-tools [data-toggle="tooltip"] { + position: relative; +} +.box-header > .box-tools.pull-right .dropdown-menu { + right: 0; + left: auto; +} +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: #97a0b3; +} +.open .btn-box-tool, +.btn-box-tool:hover { + color: #606c84; +} +.btn-box-tool.btn:active { + box-shadow: none; +} +.box-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + padding: 10px; +} +.no-header .box-body { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.box-body > .table { + margin-bottom: 0; +} +.box-body .fc { + margin-top: 5px; +} +.box-body .full-width-chart { + margin: -19px; +} +.box-body.no-padding .full-width-chart { + margin: -9px; +} +.box-body .box-pane { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} +.box-body .box-pane-right { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} +.box-footer { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #ffffff; +} +.chart-legend { + margin: 10px 0; +} +@media (max-width: 991px) { + .chart-legend > li { + float: left; + margin-right: 10px; + } +} +.box-comments { + background: #f7f7f7; +} +.box-comments .box-comment { + padding: 8px 0; + border-bottom: 1px solid #eee; +} +.box-comments .box-comment:before, +.box-comments .box-comment:after { + content: " "; + display: table; +} +.box-comments .box-comment:after { + clear: both; +} +.box-comments .box-comment:last-of-type { + border-bottom: 0; +} +.box-comments .box-comment:first-of-type { + padding-top: 0; +} +.box-comments .box-comment img { + float: left; +} +.box-comments .comment-text { + margin-left: 40px; + color: #555; +} +.box-comments .username { + color: #444; + display: block; + font-weight: 600; +} +.box-comments .text-muted { + font-weight: 400; + font-size: 12px; +} +/* Widget: TODO LIST */ +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} +.todo-list > li { + border-radius: 2px; + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; +} +.todo-list > li:last-of-type { + margin-bottom: 0; +} +.todo-list > li > input[type='checkbox'] { + margin: 0 10px 0 5px; +} +.todo-list > li .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; +} +.todo-list > li .label { + margin-left: 10px; + font-size: 9px; +} +.todo-list > li .tools { + display: none; + float: right; + color: #dd4b39; +} +.todo-list > li .tools > .fa, +.todo-list > li .tools > .glyphicon, +.todo-list > li .tools > .ion { + margin-right: 5px; + cursor: pointer; +} +.todo-list > li:hover .tools { + display: inline-block; +} +.todo-list > li.done { + color: #999; +} +.todo-list > li.done .text { + text-decoration: line-through; + font-weight: 500; +} +.todo-list > li.done .label { + background: #d2d6de !important; +} +.todo-list .danger { + border-left-color: #dd4b39; +} +.todo-list .warning { + border-left-color: #f39c12; +} +.todo-list .info { + border-left-color: #00c0ef; +} +.todo-list .success { + border-left-color: #00a65a; +} +.todo-list .primary { + border-left-color: #3c8dbc; +} +.todo-list .handle { + display: inline-block; + cursor: move; + margin: 0 5px; +} +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; +} +.chat .item { + margin-bottom: 10px; +} +.chat .item:before, +.chat .item:after { + content: " "; + display: table; +} +.chat .item:after { + clear: both; +} +.chat .item > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + border-radius: 50%; +} +.chat .item > .online { + border: 2px solid #00a65a; +} +.chat .item > .offline { + border: 2px solid #dd4b39; +} +.chat .item > .message { + margin-left: 55px; + margin-top: -40px; +} +.chat .item > .message > .name { + display: block; + font-weight: 600; +} +.chat .item > .attachment { + border-radius: 3px; + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; +} +.chat .item > .attachment > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; +} +.chat .item > .attachment > p, +.chat .item > .attachment > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; +} +.chat .item > .attachment:before, +.chat .item > .attachment:after { + content: " "; + display: table; +} +.chat .item > .attachment:after { + clear: both; +} +.box-input { + max-width: 200px; +} +.modal .panel-body { + color: #444; +} +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 2px; + margin-bottom: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, 0.2); + margin: 5px -10px 5px -10px; + height: 2px; +} +.info-box .progress, +.info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); +} +.info-box-icon > img { + max-width: 100%; +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} +.progress-description { + margin: 0; +} +/* + * Component: Timeline + * ------------------- + */ +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; +} +.timeline:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + border-radius: 2px; +} +.timeline > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; +} +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} +.timeline > li:after { + clear: both; +} +.timeline > li > .timeline-item { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; +} +.timeline > li > .timeline-item > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; +} +.timeline > li > .timeline-item > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid #f4f4f4; + padding: 10px; + font-size: 16px; + line-height: 1.1; +} +.timeline > li > .timeline-item > .timeline-header > a { + font-weight: 600; +} +.timeline > li > .timeline-item > .timeline-body, +.timeline > li > .timeline-item > .timeline-footer { + padding: 10px; +} +.timeline > li > .fa, +.timeline > li > .glyphicon, +.timeline > li > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: #d2d6de; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; +} +.timeline > .time-label > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + border-radius: 4px; +} +.timeline-inverse > li > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; +} +.timeline-inverse > li > .timeline-item > .timeline-header { + border-bottom-color: #ddd; +} +/* + * Component: Button + * ----------------- + */ +.btn { + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; +} +.btn.uppercase { + text-transform: uppercase; +} +.btn.btn-flat { + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; +} +.btn:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn:focus { + outline: none; +} +.btn.btn-file { + position: relative; + overflow: hidden; +} +.btn.btn-file > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + opacity: 0; + filter: alpha(opacity=0); + outline: none; + background: white; + cursor: inherit; + display: block; +} +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; +} +.btn-default:hover, +.btn-default:active, +.btn-default.hover { + background-color: #e7e7e7; +} +.btn-primary { + background-color: #3c8dbc; + border-color: #367fa9; +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.hover { + background-color: #367fa9; +} +.btn-success { + background-color: #00a65a; + border-color: #008d4c; +} +.btn-success:hover, +.btn-success:active, +.btn-success.hover { + background-color: #008d4c; +} +.btn-info { + background-color: #00c0ef; + border-color: #00acd6; +} +.btn-info:hover, +.btn-info:active, +.btn-info.hover { + background-color: #00acd6; +} +.btn-danger { + background-color: #dd4b39; + border-color: #d73925; +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.hover { + background-color: #d73925; +} +.btn-warning { + background-color: #f39c12; + border-color: #e08e0b; +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.hover { + background-color: #e08e0b; +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: rgba(255, 255, 255, 0.7); + border-color: rgba(255, 255, 255, 0.7); +} +.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn[class*='bg-']:hover { + -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); +} +.btn-app { + border-radius: 3px; + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; +} +.btn-app > .fa, +.btn-app > .glyphicon, +.btn-app > .ion { + font-size: 20px; + display: block; +} +.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} +.btn-app:active, +.btn-app:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} +/* + * Component: Callout + * ------------------ + */ +.callout { + border-radius: 3px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.callout a { + color: #fff; + text-decoration: underline; +} +.callout a:hover { + color: #eee; +} +.callout h4 { + margin-top: 0; + font-weight: 600; +} +.callout p:last-child { + margin-bottom: 0; +} +.callout code, +.callout .highlight { + background-color: #fff; +} +.callout.callout-danger { + border-color: #c23321; +} +.callout.callout-warning { + border-color: #c87f0a; +} +.callout.callout-info { + border-color: #0097bc; +} +.callout.callout-success { + border-color: #00733e; +} +/* + * Component: alert + * ---------------- + */ +.alert { + border-radius: 3px; +} +.alert h4 { + font-weight: 600; +} +.alert .icon { + margin-right: 10px; +} +.alert .close { + color: #000; + opacity: 0.2; + filter: alpha(opacity=20); +} +.alert .close:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-success { + border-color: #008d4c; +} +.alert-danger, +.alert-error { + border-color: #d73925; +} +.alert-warning { + border-color: #e08e0b; +} +.alert-info { + border-color: #00acd6; +} +/* + * Component: Nav + * -------------- + */ +.nav > li > a:hover, +.nav > li > a:active, +.nav > li > a:focus { + color: #444; + background: #f7f7f7; +} +/* NAV PILLS */ +.nav-pills > li > a { + border-radius: 0; + border-top: 3px solid transparent; + color: #444; +} +.nav-pills > li > a > .fa, +.nav-pills > li > a > .glyphicon, +.nav-pills > li > a > .ion { + margin-right: 5px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + border-top-color: #3c8dbc; +} +.nav-pills > li.active > a { + font-weight: 600; +} +/* NAV STACKED */ +.nav-stacked > li > a { + border-radius: 0; + border-top: 0; + border-left: 3px solid transparent; + color: #444; +} +.nav-stacked > li.active > a, +.nav-stacked > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: #3c8dbc; +} +.nav-stacked > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; +} +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.nav-tabs-custom > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.nav-tabs-custom > .nav-tabs > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + margin-right: 5px; +} +.nav-tabs-custom > .nav-tabs > li > a { + color: #444; + border-radius: 0; +} +.nav-tabs-custom > .nav-tabs > li > a.text-muted { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li > a, +.nav-tabs-custom > .nav-tabs > li > a:hover { + background: transparent; + margin: 0; +} +.nav-tabs-custom > .nav-tabs > li > a:hover { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { + border-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom > .nav-tabs > li.active > a, +.nav-tabs-custom > .nav-tabs > li.active:hover > a { + background-color: #fff; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.active > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type { + margin-left: 0; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { + border-left-color: transparent; +} +.nav-tabs-custom > .nav-tabs.pull-right { + float: none!important; +} +.nav-tabs-custom > .nav-tabs.pull-right > li { + float: right; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { + margin-right: 0; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { + border-left-width: 1px; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { + border-left-color: #f4f4f4; + border-right-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.header > .fa, +.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, +.nav-tabs-custom > .nav-tabs > li.header > .ion { + margin-right: 5px; +} +.nav-tabs-custom > .tab-content { + background: #fff; + padding: 10px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.nav-tabs-custom .dropdown.open > a:active, +.nav-tabs-custom .dropdown.open > a:focus { + background: transparent; + color: #999; +} +/* PAGINATION */ +.pagination > li > a { + background: #fafafa; + color: #666; +} +.pagination.pagination-flat > li > a { + border-radius: 0 !important; +} +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; +} +.products-list > .item { + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 10px 0; + background: #fff; +} +.products-list > .item:before, +.products-list > .item:after { + content: " "; + display: table; +} +.products-list > .item:after { + clear: both; +} +.products-list .product-img { + float: left; +} +.products-list .product-img img { + width: 50px; + height: 50px; +} +.products-list .product-info { + margin-left: 60px; +} +.products-list .product-title { + font-weight: 600; +} +.products-list .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.product-list-in-box > .item { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-bottom: 1px solid #f4f4f4; +} +.product-list-in-box > .item:last-of-type { + border-bottom-width: 0; +} +/* + * Component: Table + * ---------------- + */ +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #f4f4f4; +} +.table > thead > tr > th { + border-bottom: 2px solid #f4f4f4; +} +.table tr td .progress { + margin-top: 5px; +} +.table-bordered { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table.no-border, +.table.no-border td, +.table.no-border th { + border: 0; +} +/* .text-center in tables */ +table.text-center, +table.text-center td, +table.text-center th { + text-align: center; +} +.table.align th { + text-align: left; +} +.table.align td { + text-align: right; +} +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: #d2d6de; + color: #444; +} +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat .box-body { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + position: relative; + overflow-x: hidden; + padding: 0; +} +.direct-chat.chat-pane-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-messages { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + margin-bottom: 10px; +} +.direct-chat-msg:before, +.direct-chat-msg:after { + content: " "; + display: table; +} +.direct-chat-msg:after { + clear: both; +} +.direct-chat-messages, +.direct-chat-contacts { + -webkit-transition: -webkit-transform 0.5s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out; + transition: transform 0.5s ease-in-out; +} +.direct-chat-text { + border-radius: 5px; + position: relative; + padding: 5px 10px; + background: #d2d6de; + border: 1px solid #d2d6de; + margin: 5px 0 0 50px; + color: #444444; +} +.direct-chat-text:after, +.direct-chat-text:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: #d2d6de; + content: ' '; + height: 0; + width: 0; + pointer-events: none; +} +.direct-chat-text:after { + border-width: 5px; + margin-top: -5px; +} +.direct-chat-text:before { + border-width: 6px; + margin-top: -6px; +} +.right .direct-chat-text { + margin-right: 50px; + margin-left: 0; +} +.right .direct-chat-text:after, +.right .direct-chat-text:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: #d2d6de; +} +.direct-chat-img { + border-radius: 50%; + float: left; + width: 40px; + height: 40px; +} +.right .direct-chat-img { + float: right; +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +.direct-chat-contacts-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-contacts { + -webkit-transform: translate(101%, 0); + -ms-transform: translate(101%, 0); + -o-transform: translate(101%, 0); + transform: translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} +.contacts-list > li { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; +} +.contacts-list > li:before, +.contacts-list > li:after { + content: " "; + display: table; +} +.contacts-list > li:after { + clear: both; +} +.contacts-list > li:last-of-type { + border-bottom: none; +} +.contacts-list-img { + border-radius: 50%; + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} +.direct-chat-danger .right > .direct-chat-text { + background: #dd4b39; + border-color: #dd4b39; + color: #ffffff; +} +.direct-chat-danger .right > .direct-chat-text:after, +.direct-chat-danger .right > .direct-chat-text:before { + border-left-color: #dd4b39; +} +.direct-chat-primary .right > .direct-chat-text { + background: #3c8dbc; + border-color: #3c8dbc; + color: #ffffff; +} +.direct-chat-primary .right > .direct-chat-text:after, +.direct-chat-primary .right > .direct-chat-text:before { + border-left-color: #3c8dbc; +} +.direct-chat-warning .right > .direct-chat-text { + background: #f39c12; + border-color: #f39c12; + color: #ffffff; +} +.direct-chat-warning .right > .direct-chat-text:after, +.direct-chat-warning .right > .direct-chat-text:before { + border-left-color: #f39c12; +} +.direct-chat-info .right > .direct-chat-text { + background: #00c0ef; + border-color: #00c0ef; + color: #ffffff; +} +.direct-chat-info .right > .direct-chat-text:after, +.direct-chat-info .right > .direct-chat-text:before { + border-left-color: #00c0ef; +} +.direct-chat-success .right > .direct-chat-text { + background: #00a65a; + border-color: #00a65a; + color: #ffffff; +} +.direct-chat-success .right > .direct-chat-text:after, +.direct-chat-success .right > .direct-chat-text:before { + border-left-color: #00a65a; +} +/* + * Component: Users List + * --------------------- + */ +.users-list > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; +} +.users-list > li img { + border-radius: 50%; + max-width: 100%; + height: auto; +} +.users-list > li > a:hover, +.users-list > li > a:hover .users-list-name { + color: #999; +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} +/* + * Component: Carousel + * ------------------- + */ +.carousel-control.left, +.carousel-control.right { + background-image: none; +} +.carousel-control > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; +} +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, 0.3); +} +.modal-content { + border-radius: 0; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + border: 0; +} +@media (min-width: 768px) { + .modal-content { + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + } +} +.modal-header { + border-bottom-color: #f4f4f4; +} +.modal-footer { + border-top-color: #f4f4f4; +} +.modal-primary .modal-header, +.modal-primary .modal-footer { + border-color: #307095; +} +.modal-warning .modal-header, +.modal-warning .modal-footer { + border-color: #c87f0a; +} +.modal-info .modal-header, +.modal-info .modal-footer { + border-color: #0097bc; +} +.modal-success .modal-header, +.modal-success .modal-footer { + border-color: #00733e; +} +.modal-danger .modal-header, +.modal-danger .modal-footer { + border-color: #c23321; +} +/* + * Component: Social Widgets + * ------------------------- + */ +.box-widget { + border: none; + position: relative; +} +.widget-user .widget-user-header { + padding: 20px; + height: 120px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.widget-user .widget-user-desc { + margin-top: 0; +} +.widget-user .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; +} +.widget-user .widget-user-image > img { + width: 90px; + height: auto; + border: 3px solid #fff; +} +.widget-user .box-footer { + padding-top: 30px; +} +.widget-user-2 .widget-user-header { + padding: 20px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user-2 .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; +} +.widget-user-2 .widget-user-desc { + margin-top: 0; +} +.widget-user-2 .widget-user-username, +.widget-user-2 .widget-user-desc { + margin-left: 75px; +} +.widget-user-2 .widget-user-image > img { + width: 65px; + height: auto; + float: left; +} +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages > .table { + margin: 0; +} +.mailbox-controls { + padding: 5px; +} +.mailbox-controls.with-border { + border-bottom: 1px solid #f4f4f4; +} +.mailbox-read-info { + border-bottom: 1px solid #f4f4f4; + padding: 10px; +} +.mailbox-read-info h3 { + font-size: 20px; + margin: 0; +} +.mailbox-read-info h5 { + margin: 0; + padding: 5px 0 0 0; +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; +} +.mailbox-attachment-icon.has-img { + padding: 0; +} +.mailbox-attachment-icon.has-img > img { + max-width: 100%; + height: auto; +} +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE TAG */ +.lockscreen { + background: #d2d6de; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.lockscreen-logo a { + color: #444; +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + border-radius: 4px; + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + border-radius: 50%; + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; +} +.lockscreen-image > img { + border-radius: 50%; + width: 70px; + height: 70px; +} +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; +} +.lockscreen-credentials .form-control { + border: 0; +} +.lockscreen-credentials .btn { + background-color: #fff; + border: 0; + padding: 0 10px; +} +.lockscreen-footer { + margin-top: 10px; +} +/* + * Page: Login & Register + * ---------------------- + */ +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.login-logo a, +.register-logo a { + color: #444; +} +.login-page, +.register-page { + background: #d2d6de; +} +.login-box, +.register-box { + width: 360px; + margin: 7% auto; +} +@media (max-width: 768px) { + .login-box, + .register-box { + width: 90%; + margin-top: 20px; + } +} +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; +} +.login-box-body .form-control-feedback, +.register-box-body .form-control-feedback { + color: #777; +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; +} +@media (max-width: 991px) { + .error-page { + width: 100%; + } +} +.error-page > .headline { + float: left; + font-size: 100px; + font-weight: 300; +} +@media (max-width: 991px) { + .error-page > .headline { + float: none; + text-align: center; + } +} +.error-page > .error-content { + margin-left: 190px; + display: block; +} +@media (max-width: 991px) { + .error-page > .error-content { + margin-left: 0; + } +} +.error-page > .error-content > h3 { + font-weight: 300; + font-size: 25px; +} +@media (max-width: 991px) { + .error-page > .error-content > h3 { + text-align: center; + } +} +/* + * Page: Invoice + * ------------- + */ +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} +.invoice-title { + margin-top: 0; +} +/* + * Page: Profile + * ------------- + */ +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid #d2d6de; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; +} +.post:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; +} +.post .user-block { + margin-bottom: 15px; +} +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ +.btn-social { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.btn-social > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social.btn-lg { + padding-left: 61px; +} +.btn-social.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social.btn-sm { + padding-left: 38px; +} +.btn-social.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social.btn-xs { + padding-left: 30px; +} +.btn-social.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 34px; + width: 34px; + padding: 0; +} +.btn-social-icon > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social-icon.btn-lg { + padding-left: 61px; +} +.btn-social-icon.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social-icon.btn-sm { + padding-left: 38px; +} +.btn-social-icon.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social-icon.btn-xs { + padding-left: 30px; +} +.btn-social-icon.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon > :first-child { + border: none; + text-align: center; + width: 100%; +} +.btn-social-icon.btn-lg { + height: 45px; + width: 45px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-sm { + height: 30px; + width: 30px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-xs { + height: 22px; + width: 22px; + padding-left: 0; + padding-right: 0; +} +.btn-adn { + color: #ffffff; + background-color: #d87a68; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:hover, +.btn-adn:focus, +.btn-adn.focus, +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + background-image: none; +} +.btn-adn .badge { + color: #d87a68; + background-color: #ffffff; +} +.btn-bitbucket { + color: #ffffff; + background-color: #205081; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:hover, +.btn-bitbucket:focus, +.btn-bitbucket.focus, +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + background-image: none; +} +.btn-bitbucket .badge { + color: #205081; + background-color: #ffffff; +} +.btn-dropbox { + color: #ffffff; + background-color: #1087dd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:hover, +.btn-dropbox:focus, +.btn-dropbox.focus, +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + background-image: none; +} +.btn-dropbox .badge { + color: #1087dd; + background-color: #ffffff; +} +.btn-facebook { + color: #ffffff; + background-color: #3b5998; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:hover, +.btn-facebook:focus, +.btn-facebook.focus, +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + background-image: none; +} +.btn-facebook .badge { + color: #3b5998; + background-color: #ffffff; +} +.btn-flickr { + color: #ffffff; + background-color: #ff0084; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:hover, +.btn-flickr:focus, +.btn-flickr.focus, +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + background-image: none; +} +.btn-flickr .badge { + color: #ff0084; + background-color: #ffffff; +} +.btn-foursquare { + color: #ffffff; + background-color: #f94877; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:hover, +.btn-foursquare:focus, +.btn-foursquare.focus, +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + background-image: none; +} +.btn-foursquare .badge { + color: #f94877; + background-color: #ffffff; +} +.btn-github { + color: #ffffff; + background-color: #444444; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:hover, +.btn-github:focus, +.btn-github.focus, +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + background-image: none; +} +.btn-github .badge { + color: #444444; + background-color: #ffffff; +} +.btn-google { + color: #ffffff; + background-color: #dd4b39; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:hover, +.btn-google:focus, +.btn-google.focus, +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + background-image: none; +} +.btn-google .badge { + color: #dd4b39; + background-color: #ffffff; +} +.btn-instagram { + color: #ffffff; + background-color: #3f729b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:hover, +.btn-instagram:focus, +.btn-instagram.focus, +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + background-image: none; +} +.btn-instagram .badge { + color: #3f729b; + background-color: #ffffff; +} +.btn-linkedin { + color: #ffffff; + background-color: #007bb6; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:hover, +.btn-linkedin:focus, +.btn-linkedin.focus, +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + background-image: none; +} +.btn-linkedin .badge { + color: #007bb6; + background-color: #ffffff; +} +.btn-microsoft { + color: #ffffff; + background-color: #2672ec; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:hover, +.btn-microsoft:focus, +.btn-microsoft.focus, +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + background-image: none; +} +.btn-microsoft .badge { + color: #2672ec; + background-color: #ffffff; +} +.btn-openid { + color: #ffffff; + background-color: #f7931e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:hover, +.btn-openid:focus, +.btn-openid.focus, +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + background-image: none; +} +.btn-openid .badge { + color: #f7931e; + background-color: #ffffff; +} +.btn-pinterest { + color: #ffffff; + background-color: #cb2027; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:hover, +.btn-pinterest:focus, +.btn-pinterest.focus, +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + background-image: none; +} +.btn-pinterest .badge { + color: #cb2027; + background-color: #ffffff; +} +.btn-reddit { + color: #000000; + background-color: #eff7ff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:hover, +.btn-reddit:focus, +.btn-reddit.focus, +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + background-image: none; +} +.btn-reddit .badge { + color: #eff7ff; + background-color: #000000; +} +.btn-soundcloud { + color: #ffffff; + background-color: #ff5500; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:hover, +.btn-soundcloud:focus, +.btn-soundcloud.focus, +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + background-image: none; +} +.btn-soundcloud .badge { + color: #ff5500; + background-color: #ffffff; +} +.btn-tumblr { + color: #ffffff; + background-color: #2c4762; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:hover, +.btn-tumblr:focus, +.btn-tumblr.focus, +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + background-image: none; +} +.btn-tumblr .badge { + color: #2c4762; + background-color: #ffffff; +} +.btn-twitter { + color: #ffffff; + background-color: #55acee; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:hover, +.btn-twitter:focus, +.btn-twitter.focus, +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + background-image: none; +} +.btn-twitter .badge { + color: #55acee; + background-color: #ffffff; +} +.btn-vimeo { + color: #ffffff; + background-color: #1ab7ea; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:hover, +.btn-vimeo:focus, +.btn-vimeo.focus, +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + background-image: none; +} +.btn-vimeo .badge { + color: #1ab7ea; + background-color: #ffffff; +} +.btn-vk { + color: #ffffff; + background-color: #587ea3; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:hover, +.btn-vk:focus, +.btn-vk.focus, +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + background-image: none; +} +.btn-vk .badge { + color: #587ea3; + background-color: #ffffff; +} +.btn-yahoo { + color: #ffffff; + background-color: #720e9e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:hover, +.btn-yahoo:focus, +.btn-yahoo.focus, +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + background-image: none; +} +.btn-yahoo .badge { + color: #720e9e; + background-color: #ffffff; +} +/* + * Plugin: Full Calendar + * --------------------- + */ +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; +} +.fc-button:hover, +.fc-button:active, +.fc-button.hover { + background-color: #e9e9e9; +} +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: 10px; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; +} +.fc-color-picker > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; +} +.fc-color-picker > li .fa { + -webkit-transition: -webkit-transform linear 0.3s; + -moz-transition: -moz-transform linear 0.3s; + -o-transition: -o-transform linear 0.3s; + transition: transform linear 0.3s; +} +.fc-color-picker > li .fa:hover { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -o-transform: rotate(30deg); + transform: rotate(30deg); +} +#add-new-event { + -webkit-transition: all linear 0.3s; + -o-transition: all linear 0.3s; + transition: all linear 0.3s; +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + cursor: move; +} +.external-event:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); +} +/* + * Plugin: Select2 + * --------------- + */ +.select2-container--default.select2-container--focus, +.select2-selection.select2-container--focus, +.select2-container--default:focus, +.select2-selection:focus, +.select2-container--default:active, +.select2-selection:active { + outline: none; +} +.select2-container--default .select2-selection--single, +.select2-selection .select2-selection--single { + border: 1px solid #d2d6de; + border-radius: 0; + padding: 6px 12px; + height: 34px; +} +.select2-container--default.select2-container--open { + border-color: #3c8dbc; +} +.select2-dropdown { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3c8dbc; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown .select2-search__field, +.select2-search--inline .select2-search__field { + border: 1px solid #d2d6de; +} +.select2-dropdown .select2-search__field:focus, +.select2-search--inline .select2-search__field:focus { + outline: none; + border: 1px solid #3c8dbc; +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} +.select2-container--default .select2-results__option[aria-selected=true], +.select2-container--default .select2-results__option[aria-selected=true]:hover { + color: #444; +} +.select2-container--default .select2-selection--multiple { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-selection--multiple:focus { + border-color: #3c8dbc; +} +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-color: #d2d6de; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #3c8dbc; + border-color: #367fa9; + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, 0.7); +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #fff; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} +/* + * General: Miscellaneous + * ---------------------- + */ +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +.inline { + display: inline; +} +.description-block { + display: block; + margin: 10px 0; + text-align: center; +} +.description-block.margin-bottom { + margin-bottom: 25px; +} +.description-block > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; +} +.description-block > .description-text { + text-transform: uppercase; +} +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active, +.callout.callout-danger, +.callout.callout-warning, +.callout.callout-info, +.callout.callout-success, +.alert-success, +.alert-danger, +.alert-error, +.alert-warning, +.alert-info, +.label-danger, +.label-info, +.label-warning, +.label-primary, +.label-success, +.modal-primary .modal-body, +.modal-primary .modal-header, +.modal-primary .modal-footer, +.modal-warning .modal-body, +.modal-warning .modal-header, +.modal-warning .modal-footer, +.modal-info .modal-body, +.modal-info .modal-header, +.modal-info .modal-footer, +.modal-success .modal-body, +.modal-success .modal-header, +.modal-success .modal-footer, +.modal-danger .modal-body, +.modal-danger .modal-header, +.modal-danger .modal-footer { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: #d2d6de !important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: #111111 !important; +} +.bg-red, +.callout.callout-danger, +.alert-danger, +.alert-error, +.label-danger, +.modal-danger .modal-body { + background-color: #dd4b39 !important; +} +.bg-yellow, +.callout.callout-warning, +.alert-warning, +.label-warning, +.modal-warning .modal-body { + background-color: #f39c12 !important; +} +.bg-aqua, +.callout.callout-info, +.alert-info, +.label-info, +.modal-info .modal-body { + background-color: #00c0ef !important; +} +.bg-blue { + background-color: #0073b7 !important; +} +.bg-light-blue, +.label-primary, +.modal-primary .modal-body { + background-color: #3c8dbc !important; +} +.bg-green, +.callout.callout-success, +.alert-success, +.label-success, +.modal-success .modal-body { + background-color: #00a65a !important; +} +.bg-navy { + background-color: #001f3f !important; +} +.bg-teal { + background-color: #39cccc !important; +} +.bg-olive { + background-color: #3d9970 !important; +} +.bg-lime { + background-color: #01ff70 !important; +} +.bg-orange { + background-color: #ff851b !important; +} +.bg-fuchsia { + background-color: #f012be !important; +} +.bg-purple { + background-color: #605ca8 !important; +} +.bg-maroon { + background-color: #d81b60 !important; +} +.bg-gray-active { + color: #000; + background-color: #b5bbc8 !important; +} +.bg-black-active { + background-color: #000000 !important; +} +.bg-red-active, +.modal-danger .modal-header, +.modal-danger .modal-footer { + background-color: #d33724 !important; +} +.bg-yellow-active, +.modal-warning .modal-header, +.modal-warning .modal-footer { + background-color: #db8b0b !important; +} +.bg-aqua-active, +.modal-info .modal-header, +.modal-info .modal-footer { + background-color: #00a7d0 !important; +} +.bg-blue-active { + background-color: #005384 !important; +} +.bg-light-blue-active, +.modal-primary .modal-header, +.modal-primary .modal-footer { + background-color: #357ca5 !important; +} +.bg-green-active, +.modal-success .modal-header, +.modal-success .modal-footer { + background-color: #008d4c !important; +} +.bg-navy-active { + background-color: #001a35 !important; +} +.bg-teal-active { + background-color: #30bbbb !important; +} +.bg-olive-active { + background-color: #368763 !important; +} +.bg-lime-active { + background-color: #00e765 !important; +} +.bg-orange-active { + background-color: #ff7701 !important; +} +.bg-fuchsia-active { + background-color: #db0ead !important; +} +.bg-purple-active { + background-color: #555299 !important; +} +.bg-maroon-active { + background-color: #ca195a !important; +} +[class^="bg-"].disabled { + opacity: 0.65; + filter: alpha(opacity=65); +} +.text-red { + color: #dd4b39 !important; +} +.text-yellow { + color: #f39c12 !important; +} +.text-aqua { + color: #00c0ef !important; +} +.text-blue { + color: #0073b7 !important; +} +.text-black { + color: #111111 !important; +} +.text-light-blue { + color: #3c8dbc !important; +} +.text-green { + color: #00a65a !important; +} +.text-gray { + color: #d2d6de !important; +} +.text-navy { + color: #001f3f !important; +} +.text-teal { + color: #39cccc !important; +} +.text-olive { + color: #3d9970 !important; +} +.text-lime { + color: #01ff70 !important; +} +.text-orange { + color: #ff851b !important; +} +.text-fuchsia { + color: #f012be !important; +} +.text-purple { + color: #605ca8 !important; +} +.text-maroon { + color: #d81b60 !important; +} +.link-muted { + color: #7a869d; +} +.link-muted:hover, +.link-muted:focus { + color: #606c84; +} +.link-black { + color: #666; +} +.link-black:hover, +.link-black:focus { + color: #999; +} +.hide { + display: none !important; +} +.no-border { + border: 0 !important; +} +.no-padding { + padding: 0 !important; +} +.no-margin { + margin: 0 !important; +} +.no-shadow { + box-shadow: none!important; +} +.list-unstyled, +.chart-legend, +.contacts-list, +.users-list, +.mailbox-attachments { + list-style: none; + margin: 0; + padding: 0; +} +.list-group-unbordered > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} +.flat { + border-radius: 0 !important; +} +.text-bold, +.text-bold.table td, +.text-bold.table th { + font-weight: 700; +} +.text-sm { + font-size: 12px; +} +.jqstooltip { + padding: 5px!important; + width: auto!important; + height: auto!important; +} +.bg-teal-gradient { + background: #39cccc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; + background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; + background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; + background: -o-linear-gradient(#7adddd, #39cccc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; + color: #fff; +} +.bg-light-blue-gradient { + background: #3c8dbc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; + background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; + background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; + background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; + color: #fff; +} +.bg-blue-gradient { + background: #0073b7 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; + background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; + background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; + background: -o-linear-gradient(#0089db, #0073b7) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; + color: #fff; +} +.bg-aqua-gradient { + background: #00c0ef !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; + background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; + background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; + background: -o-linear-gradient(#14d1ff, #00c0ef) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; + color: #fff; +} +.bg-yellow-gradient { + background: #f39c12 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; + background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; + background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; + background: -o-linear-gradient(#f7bc60, #f39c12) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; + color: #fff; +} +.bg-purple-gradient { + background: #605ca8 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; + background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; + background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; + background: -o-linear-gradient(#9491c4, #605ca8) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; + color: #fff; +} +.bg-green-gradient { + background: #00a65a !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; + background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; + background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; + background: -o-linear-gradient(#00ca6d, #00a65a) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; + color: #fff; +} +.bg-red-gradient { + background: #dd4b39 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; + background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; + background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; + background: -o-linear-gradient(#e47365, #dd4b39) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; + color: #fff; +} +.bg-black-gradient { + background: #111111 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; + background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; + background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; + background: -o-linear-gradient(#2b2b2b, #111111) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; + color: #fff; +} +.bg-maroon-gradient { + background: #d81b60 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; + background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; + background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; + background: -o-linear-gradient(#e73f7c, #d81b60) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; + color: #fff; +} +.description-block .description-icon { + font-size: 16px; +} +.no-pad-top { + padding-top: 0; +} +.position-static { + position: static!important; +} +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: #f4f4f4; + margin: 15px 0 9px 0; +} +.list-link > a { + padding: 4px; + color: #777; +} +.list-link > a:hover { + color: #222; +} +.font-light { + font-weight: 300; +} +.user-block:before, +.user-block:after { + content: " "; + display: table; +} +.user-block:after { + clear: both; +} +.user-block img { + width: 40px; + height: 40px; + float: left; +} +.user-block .username, +.user-block .description, +.user-block .comment { + display: block; + margin-left: 50px; +} +.user-block .username { + font-size: 16px; + font-weight: 600; +} +.user-block .description { + color: #999; + font-size: 13px; +} +.user-block.user-block-sm .username, +.user-block.user-block-sm .description, +.user-block.user-block-sm .comment { + margin-left: 40px; +} +.user-block.user-block-sm .username { + font-size: 14px; +} +.img-sm, +.img-md, +.img-lg, +.box-comments .box-comment img, +.user-block.user-block-sm img { + float: left; +} +.img-sm, +.box-comments .box-comment img, +.user-block.user-block-sm img { + width: 30px!important; + height: 30px!important; +} +.img-sm + .img-push { + margin-left: 40px; +} +.img-md { + width: 60px; + height: 60px; +} +.img-md + .img-push { + margin-left: 70px; +} +.img-lg { + width: 100px; + height: 100px; +} +.img-lg + .img-push { + margin-left: 110px; +} +.img-bordered { + border: 3px solid #d2d6de; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid #d2d6de; + padding: 2px; +} +.attachment-block { + border: 1px solid #f4f4f4; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; +} +.attachment-block .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; +} +.attachment-block .attachment-pushed { + margin-left: 110px; +} +.attachment-block .attachment-heading { + margin: 0; +} +.attachment-block .attachment-text { + color: #555; +} +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + opacity: 0.65; + filter: alpha(opacity=65); +} +.full-opacity-hover:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.chart { + position: relative; + overflow: hidden; + width: 100%; +} +.chart svg, +.chart canvas { + width: 100%!important; +} +/* + * Misc: print + * ----------- + */ +@media print { + .no-print, + .main-sidebar, + .left-side, + .main-header, + .content-header { + display: none!important; + } + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0!important; + min-height: 0!important; + -webkit-transform: translate(0, 0) !important; + -ms-transform: translate(0, 0) !important; + -o-transform: translate(0, 0) !important; + transform: translate(0, 0) !important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0!important; + } + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + .table-responsive { + overflow: auto; + } + .table-responsive > .table tr th, + .table-responsive > .table tr td { + white-space: normal!important; + } +} diff --git a/Plugson/www/static/AdminLTE/css/AdminLTE.min.css b/Plugson/www/static/AdminLTE/css/AdminLTE.min.css new file mode 100644 index 00000000..fd35437f --- /dev/null +++ b/Plugson/www/static/AdminLTE/css/AdminLTE.min.css @@ -0,0 +1,8 @@ +/**@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); **/ +/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/html,body{/*min-height:100%*/}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Arial','Microsoft YaHei','ºÚÌå','ËÎÌå',sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:static;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header>.navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Arial','Microsoft YaHei','ºÚÌå','ËÎÌå',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header>.navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:'Arial','Microsoft YaHei','ºÚÌå','ËÎÌå',sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;/* border-bottom-color: #3C8DBC /*#f4f4f4*/; */border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;/*margin-bottom:-2px;*/margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top:1px solid #3C8DBC;border-left:1px solid #3C8DBC;border-right:1px solid #3C8DBC;}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:hover,.btn-adn:focus,.btn-adn.focus,.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook.focus,.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr.focus,.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover,.btn-foursquare:focus,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github.focus,.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:hover,.btn-google:focus,.btn-google.focus,.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram.focus,.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover,.btn-microsoft:focus,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:hover,.btn-openid:focus,.btn-openid.focus,.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover,.btn-reddit:focus,.btn-reddit.focus,.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover,.btn-soundcloud:focus,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter.focus,.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover,.btn-vimeo:focus,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk.focus,.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover,.btn-yahoo:focus,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}} \ No newline at end of file diff --git a/Plugson/www/static/AdminLTE/css/skins/skin-blue.css b/Plugson/www/static/AdminLTE/css/skins/skin-blue.css new file mode 100644 index 00000000..1bc543fd --- /dev/null +++ b/Plugson/www/static/AdminLTE/css/skins/skin-blue.css @@ -0,0 +1,142 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .treeview-menu > li.active > a, +.skin-blue .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/Plugson/www/static/AdminLTE/css/skins/skin-blue.min.css b/Plugson/www/static/AdminLTE/css/skins/skin-blue.min.css new file mode 100644 index 00000000..123c04f4 --- /dev/null +++ b/Plugson/www/static/AdminLTE/css/skins/skin-blue.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/Plugson/www/static/AdminLTE/js/app.js b/Plugson/www/static/AdminLTE/js/app.js new file mode 100644 index 00000000..561d4483 --- /dev/null +++ b/Plugson/www/static/AdminLTE/js/app.js @@ -0,0 +1,746 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support + * @Email + * @version 2.3.0 + * @license MIT + */ + +//Make sure jQuery has been loaded before app.js +if (typeof jQuery === "undefined") { + throw new Error("AdminLTE requires jQuery"); +} + +/* AdminLTE + * + * @type Object + * @description $.AdminLTE is the main object for the template's app. + * It's used for implementing functions and options related + * to the template. Keeping everything wrapped in an object + * prevents conflict with other plugins and is a better + * way to organize our code. + */ +$.AdminLTE = {}; + +/* -------------------- + * - AdminLTE Options - + * -------------------- + * Modify these options to suit your implementation + */ +$.AdminLTE.options = { + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This options accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}; + +/* ------------------ + * - Implementation - + * ------------------ + * The next block of code implements AdminLTE's + * functions and plugins as specified by the + * options above. + */ +$(function () { + "use strict"; + + //Fix for IE page transitions + $("body").removeClass("hold-transition"); + + //Extend options if external options exist + if (typeof AdminLTEOptions !== "undefined") { + $.extend(true, + $.AdminLTE.options, + AdminLTEOptions); + } + + //Easy access to options + var o = $.AdminLTE.options; + + //Set up the object + _init(); + + //Activate the layout maker + $.AdminLTE.layout.activate(); + + //Enable sidebar tree view controls + $.AdminLTE.tree('.sidebar'); + + //Enable control sidebar + if (o.enableControlSidebar) { + $.AdminLTE.controlSidebar.activate(); + } + + //Add slimscroll to navbar dropdown + if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') { + $(".navbar .menu").slimscroll({ + height: o.navbarMenuHeight, + alwaysVisible: false, + size: o.navbarMenuSlimscrollWidth + }).css("width", "100%"); + } + + //Activate sidebar push menu + if (o.sidebarPushMenu) { + $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector); + } + + //Activate Bootstrap tooltip + if (o.enableBSToppltip) { + $('body').tooltip({ + selector: o.BSTooltipSelector + }); + } + + //Activate box widget + if (o.enableBoxWidget) { + $.AdminLTE.boxWidget.activate(); + } + + //Activate fast click + if (o.enableFastclick && typeof FastClick != 'undefined') { + FastClick.attach(document.body); + } + + //Activate direct chat widget + if (o.directChat.enable) { + $(document).on('click', o.directChat.contactToggleSelector, function () { + var box = $(this).parents('.direct-chat').first(); + box.toggleClass('direct-chat-contacts-open'); + }); + } + + /* + * INITIALIZE BUTTON TOGGLE + * ------------------------ + */ + $('.btn-group[data-toggle="btn-toggle"]').each(function () { + var group = $(this); + $(this).find(".btn").on('click', function (e) { + group.find(".btn.active").removeClass("active"); + $(this).addClass("active"); + e.preventDefault(); + }); + + }); +}); + +/* ---------------------------------- + * - Initialize the AdminLTE Object - + * ---------------------------------- + * All AdminLTE functions are implemented below. + */ +function _init() { + 'use strict'; + /* Layout + * ====== + * Fixes the layout height in case min-height fails. + * + * @type Object + * @usage $.AdminLTE.layout.activate() + * $.AdminLTE.layout.fix() + * $.AdminLTE.layout.fixSidebar() + */ + $.AdminLTE.layout = { + activate: function () { + var _this = this; + _this.fix(); + _this.fixSidebar(); + $(window, ".wrapper").resize(function () { + _this.fix(); + _this.fixSidebar(); + }); + }, + fix: function () { + //Get window height and the wrapper height + var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight(); + var window_height = $(window).height(); + var sidebar_height = $(".sidebar").height(); + //Set the min-height of the content and sidebar based on the + //the height of the document. + if ($("body").hasClass("fixed")) { + $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight()); + } else { + var postSetWidth; + if (window_height >= sidebar_height) { + $(".content-wrapper, .right-side").css('min-height', window_height - neg); + postSetWidth = window_height - neg; + } else { + $(".content-wrapper, .right-side").css('min-height', sidebar_height); + postSetWidth = sidebar_height; + } + + //Fix for the control sidebar height + var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector); + if (typeof controlSidebar !== "undefined") { + if (controlSidebar.height() > postSetWidth) + $(".content-wrapper, .right-side").css('min-height', controlSidebar.height()); + } + + } + }, + fixSidebar: function () { + //Make sure the body tag has the .fixed class + if (!$("body").hasClass("fixed")) { + if (typeof $.fn.slimScroll != 'undefined') { + $(".sidebar").slimScroll({destroy: true}).height("auto"); + } + return; + } else if (typeof $.fn.slimScroll == 'undefined' && window.console) { + window.console.error("Error: the fixed layout requires the slimscroll plugin!"); + } + //Enable slimscroll for fixed layout + if ($.AdminLTE.options.sidebarSlimScroll) { + if (typeof $.fn.slimScroll != 'undefined') { + //Destroy if it exists + $(".sidebar").slimScroll({destroy: true}).height("auto"); + //Add slimscroll + $(".sidebar").slimscroll({ + height: ($(window).height() - $(".main-header").height()) + "px", + color: "rgba(0,0,0,0.2)", + size: "3px" + }); + } + } + } + }; + + /* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @type Function + * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']") + */ + $.AdminLTE.pushMenu = { + activate: function (toggleBtn) { + //Get the screen sizes + var screenSizes = $.AdminLTE.options.screenSizes; + + //Enable sidebar toggle + $(toggleBtn).on('click', function (e) { + e.preventDefault(); + + //Enable sidebar push menu + if ($(window).width() > (screenSizes.sm - 1)) { + if ($("body").hasClass('sidebar-collapse')) { + $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu'); + } else { + $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } + } + //Handle sidebar push menu for small screens + else { + if ($("body").hasClass('sidebar-open')) { + $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } else { + $("body").addClass('sidebar-open').trigger('expanded.pushMenu'); + } + } + }); + + $(".content-wrapper").click(function () { + //Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) { + $("body").removeClass('sidebar-open'); + } + }); + + //Enable expand on hover for sidebar mini + if ($.AdminLTE.options.sidebarExpandOnHover + || ($('body').hasClass('fixed') + && $('body').hasClass('sidebar-mini'))) { + this.expandOnHover(); + } + }, + expandOnHover: function () { + var _this = this; + var screenWidth = $.AdminLTE.options.screenSizes.sm - 1; + //Expand sidebar on hover + $('.main-sidebar').hover(function () { + if ($('body').hasClass('sidebar-mini') + && $("body").hasClass('sidebar-collapse') + && $(window).width() > screenWidth) { + _this.expand(); + } + }, function () { + if ($('body').hasClass('sidebar-mini') + && $('body').hasClass('sidebar-expanded-on-hover') + && $(window).width() > screenWidth) { + _this.collapse(); + } + }); + }, + expand: function () { + $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover'); + }, + collapse: function () { + if ($('body').hasClass('sidebar-expanded-on-hover')) { + $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse'); + } + } + }; + + /* Tree() + * ====== + * Converts the sidebar into a multilevel + * tree view menu. + * + * @type Function + * @Usage: $.AdminLTE.tree('.sidebar') + */ + $.AdminLTE.tree = function (menu) { + var _this = this; + var animationSpeed = $.AdminLTE.options.animationSpeed; + $(document).on('click', menu + ' li a', function (e) { + //Get the clicked link and the next element + var $this = $(this); + var checkElement = $this.next(); + + //Check if the next element is a menu and is visible + if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) { + //Close the menu + checkElement.slideUp(animationSpeed, function () { + checkElement.removeClass('menu-open'); + //Fix the layout in case the sidebar stretches over the height of the window + //_this.layout.fix(); + }); + checkElement.parent("li").removeClass("active"); + } + //If the menu is not visible + else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) { + //Get the parent menu + var parent = $this.parents('ul').first(); + //Close all open menus within the parent + var ul = parent.find('ul:visible').slideUp(animationSpeed); + //Remove the menu-open class from the parent + ul.removeClass('menu-open'); + //Get the parent li + var parent_li = $this.parent("li"); + + //Open the target menu and add the menu-open class + checkElement.slideDown(animationSpeed, function () { + //Add the class active to the parent li + checkElement.addClass('menu-open'); + parent.find('li.active').removeClass('active'); + parent_li.addClass('active'); + //Fix the layout in case the sidebar stretches over the height of the window + _this.layout.fix(); + }); + } + //if this isn't a link, prevent the page from being redirected + if (checkElement.is('.treeview-menu')) { + e.preventDefault(); + } + }); + }; + + /* ControlSidebar + * ============== + * Adds functionality to the right sidebar + * + * @type Object + * @usage $.AdminLTE.controlSidebar.activate(options) + */ + $.AdminLTE.controlSidebar = { + //instantiate the object + activate: function () { + //Get the object + var _this = this; + //Update options + var o = $.AdminLTE.options.controlSidebarOptions; + //Get the sidebar + var sidebar = $(o.selector); + //The toggle button + var btn = $(o.toggleBtnSelector); + + //Listen to the click event + btn.on('click', function (e) { + e.preventDefault(); + //If the sidebar is not open + if (!sidebar.hasClass('control-sidebar-open') + && !$('body').hasClass('control-sidebar-open')) { + //Open the sidebar + _this.open(sidebar, o.slide); + } else { + _this.close(sidebar, o.slide); + } + }); + + //If the body has a boxed layout, fix the sidebar bg position + var bg = $(".control-sidebar-bg"); + _this._fix(bg); + + //If the body has a fixed layout, make the control sidebar fixed + if ($('body').hasClass('fixed')) { + _this._fixForFixed(sidebar); + } else { + //If the content height is less than the sidebar's height, force max height + if ($('.content-wrapper, .right-side').height() < sidebar.height()) { + _this._fixForContent(sidebar); + } + } + }, + //Open the control sidebar + open: function (sidebar, slide) { + //Slide over content + if (slide) { + sidebar.addClass('control-sidebar-open'); + } else { + //Push the content by adding the open class to the body instead + //of the sidebar itself + $('body').addClass('control-sidebar-open'); + } + }, + //Close the control sidebar + close: function (sidebar, slide) { + if (slide) { + sidebar.removeClass('control-sidebar-open'); + } else { + $('body').removeClass('control-sidebar-open'); + } + }, + _fix: function (sidebar) { + var _this = this; + if ($("body").hasClass('layout-boxed')) { + sidebar.css('position', 'absolute'); + sidebar.height($(".wrapper").height()); + $(window).resize(function () { + _this._fix(sidebar); + }); + } else { + sidebar.css({ + 'position': 'fixed', + 'height': 'auto' + }); + } + }, + _fixForFixed: function (sidebar) { + sidebar.css({ + 'position': 'fixed', + 'max-height': '100%', + 'overflow': 'auto', + 'padding-bottom': '50px' + }); + }, + _fixForContent: function (sidebar) { + $(".content-wrapper, .right-side").css('min-height', sidebar.height()); + } + }; + + /* BoxWidget + * ========= + * BoxWidget is a plugin to handle collapsing and + * removing boxes from the screen. + * + * @type Object + * @usage $.AdminLTE.boxWidget.activate() + * Set all your options in the main $.AdminLTE.options object + */ + $.AdminLTE.boxWidget = { + selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors, + icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons, + animationSpeed: $.AdminLTE.options.animationSpeed, + activate: function (_box) { + var _this = this; + if (!_box) { + _box = document; // activate all boxes per default + } + //Listen for collapse event triggers + $(_box).on('click', _this.selectors.collapse, function (e) { + e.preventDefault(); + _this.collapse($(this)); + }); + + //Listen for remove event triggers + $(_box).on('click', _this.selectors.remove, function (e) { + e.preventDefault(); + _this.remove($(this)); + }); + }, + collapse: function (element) { + var _this = this; + //Find the box parent + var box = element.parents(".box").first(); + //Find the body and the footer + var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer"); + if (!box.hasClass("collapsed-box")) { + //Convert minus into plus + element.children(":first") + .removeClass(_this.icons.collapse) + .addClass(_this.icons.open); + //Hide the content + box_content.slideUp(_this.animationSpeed, function () { + box.addClass("collapsed-box"); + }); + } else { + //Convert plus into minus + element.children(":first") + .removeClass(_this.icons.open) + .addClass(_this.icons.collapse); + //Show the content + box_content.slideDown(_this.animationSpeed, function () { + box.removeClass("collapsed-box"); + }); + } + }, + remove: function (element) { + //Find the box parent + var box = element.parents(".box").first(); + box.slideUp(this.animationSpeed); + } + }; +} + +/* ------------------ + * - Custom Plugins - + * ------------------ + * All custom plugins are defined below. + */ + +/* + * BOX REFRESH BUTTON + * ------------------ + * This is a custom plugin to use with the component BOX. It allows you to add + * a refresh button to the box. It converts the box's state to a loading state. + * + * @type plugin + * @usage $("#box-widget").boxRefresh( options ); + */ +(function ($) { + + "use strict"; + + $.fn.boxRefresh = function (options) { + + // Render options + var settings = $.extend({ + //Refresh button selector + trigger: ".refresh-btn", + //File source to be loaded (e.g: ajax/src.php) + source: "", + //Callbacks + onLoadStart: function (box) { + return box; + }, //Right after the button has been clicked + onLoadDone: function (box) { + return box; + } //When the source has been loaded + + }, options); + + //The overlay + var overlay = $('
'); + + return this.each(function () { + //if a source is specified + if (settings.source === "") { + if (window.console) { + window.console.log("Please specify a source first - boxRefresh()"); + } + return; + } + //the box + var box = $(this); + //the button + var rBtn = box.find(settings.trigger).first(); + + //On trigger click + rBtn.on('click', function (e) { + e.preventDefault(); + //Add loading overlay + start(box); + + //Perform ajax call + box.find(".box-body").load(settings.source, function () { + done(box); + }); + }); + }); + + function start(box) { + //Add overlay and loading img + box.append(overlay); + + settings.onLoadStart.call(box); + } + + function done(box) { + //Remove overlay and loading img + box.find(overlay).remove(); + + settings.onLoadDone.call(box); + } + + }; + +})(jQuery); + +/* + * EXPLICIT BOX ACTIVATION + * ----------------------- + * This is a custom plugin to use with the component BOX. It allows you to activate + * a box inserted in the DOM after the app.js was loaded. + * + * @type plugin + * @usage $("#box-widget").activateBox(); + */ +(function ($) { + + 'use strict'; + + $.fn.activateBox = function () { + $.AdminLTE.boxWidget.activate(this); + }; + +})(jQuery); + +/* + * TODO LIST CUSTOM PLUGIN + * ----------------------- + * This plugin depends on iCheck plugin for checkbox and radio inputs + * + * @type plugin + * @usage $("#todo-widget").todolist( options ); + */ +(function ($) { + + 'use strict'; + + $.fn.todolist = function (options) { + // Render options + var settings = $.extend({ + //When the user checks the input + onCheck: function (ele) { + return ele; + }, + //When the user unchecks the input + onUncheck: function (ele) { + return ele; + } + }, options); + + return this.each(function () { + + if (typeof $.fn.iCheck != 'undefined') { + $('input', this).on('ifChecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onCheck.call(ele); + }); + + $('input', this).on('ifUnchecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onUncheck.call(ele); + }); + } else { + $('input', this).on('change', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + if ($('input', ele).is(":checked")) { + settings.onCheck.call(ele); + } else { + settings.onUncheck.call(ele); + } + }); + } + }); + }; +}(jQuery)); \ No newline at end of file diff --git a/Plugson/www/static/AdminLTE/js/app.min.js b/Plugson/www/static/AdminLTE/js/app.min.js new file mode 100644 index 00000000..679f18f1 --- /dev/null +++ b/Plugson/www/static/AdminLTE/js/app.min.js @@ -0,0 +1,13 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support + * @Email + * @version 2.3.0 + * @license MIT + */ +function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(a).on("click",function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height() .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('
');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); \ No newline at end of file diff --git a/Plugson/www/static/AdminLTE/js/pages/dashboard.js b/Plugson/www/static/AdminLTE/js/pages/dashboard.js new file mode 100644 index 00000000..9c4ff7b2 --- /dev/null +++ b/Plugson/www/static/AdminLTE/js/pages/dashboard.js @@ -0,0 +1,210 @@ +/* + * Author: Abdullah A Almsaeed + * Date: 4 Jan 2014 + * Description: + * This is a demo file used only for the main dashboard (index.html) + **/ + +$(function () { + + "use strict"; + + //Make the dashboard widgets sortable Using jquery UI + $(".connectedSortable").sortable({ + placeholder: "sort-highlight", + connectWith: ".connectedSortable", + handle: ".box-header, .nav-tabs", + forcePlaceholderSize: true, + zIndex: 999999 + }); + $(".connectedSortable .box-header, .connectedSortable .nav-tabs-custom").css("cursor", "move"); + + //jQuery UI sortable for the todo list + $(".todo-list").sortable({ + placeholder: "sort-highlight", + handle: ".handle", + forcePlaceholderSize: true, + zIndex: 999999 + }); + + //bootstrap WYSIHTML5 - text editor + $(".textarea").wysihtml5(); + + $('.daterange').daterangepicker({ + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, function (start, end) { + window.alert("You chose: " + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + }); + + /* jQueryKnob */ + $(".knob").knob(); + + //jvectormap data + var visitorsData = { + "US": 398, //USA + "SA": 400, //Saudi Arabia + "CA": 1000, //Canada + "DE": 500, //Germany + "FR": 760, //France + "CN": 300, //China + "AU": 700, //Australia + "BR": 600, //Brazil + "IN": 800, //India + "GB": 320, //Great Britain + "RU": 3000 //Russia + }; + //World map by jvectormap + $('#world-map').vectorMap({ + map: 'world_mill_en', + backgroundColor: "transparent", + regionStyle: { + initial: { + fill: '#e4e4e4', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + } + }, + series: { + regions: [{ + values: visitorsData, + scale: ["#92c1dc", "#ebf4f9"], + normalizeFunction: 'polynomial' + }] + }, + onRegionLabelShow: function (e, el, code) { + if (typeof visitorsData[code] != "undefined") + el.html(el.html() + ': ' + visitorsData[code] + ' new visitors'); + } + }); + + //Sparkline charts + var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]; + $('#sparkline-1').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]; + $('#sparkline-2').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]; + $('#sparkline-3').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + + //The Calender + $("#calendar").datepicker(); + + //SLIMSCROLL FOR CHAT WIDGET + $('#chat-box').slimScroll({ + height: '250px' + }); + + /* Morris.js Charts */ + // Sales chart + var area = new Morris.Area({ + element: 'revenue-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666, item2: 2666}, + {y: '2011 Q2', item1: 2778, item2: 2294}, + {y: '2011 Q3', item1: 4912, item2: 1969}, + {y: '2011 Q4', item1: 3767, item2: 3597}, + {y: '2012 Q1', item1: 6810, item2: 1914}, + {y: '2012 Q2', item1: 5670, item2: 4293}, + {y: '2012 Q3', item1: 4820, item2: 3795}, + {y: '2012 Q4', item1: 15073, item2: 5967}, + {y: '2013 Q1', item1: 10687, item2: 4460}, + {y: '2013 Q2', item1: 8432, item2: 5713} + ], + xkey: 'y', + ykeys: ['item1', 'item2'], + labels: ['Item 1', 'Item 2'], + lineColors: ['#a0d0e0', '#3c8dbc'], + hideHover: 'auto' + }); + var line = new Morris.Line({ + element: 'line-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666}, + {y: '2011 Q2', item1: 2778}, + {y: '2011 Q3', item1: 4912}, + {y: '2011 Q4', item1: 3767}, + {y: '2012 Q1', item1: 6810}, + {y: '2012 Q2', item1: 5670}, + {y: '2012 Q3', item1: 4820}, + {y: '2012 Q4', item1: 15073}, + {y: '2013 Q1', item1: 10687}, + {y: '2013 Q2', item1: 8432} + ], + xkey: 'y', + ykeys: ['item1'], + labels: ['Item 1'], + lineColors: ['#efefef'], + lineWidth: 2, + hideHover: 'auto', + gridTextColor: "#fff", + gridStrokeWidth: 0.4, + pointSize: 4, + pointStrokeColors: ["#efefef"], + gridLineColor: "#efefef", + gridTextFamily: "Open Sans", + gridTextSize: 10 + }); + + //Donut Chart + var donut = new Morris.Donut({ + element: 'sales-chart', + resize: true, + colors: ["#3c8dbc", "#f56954", "#00a65a"], + data: [ + {label: "Download Sales", value: 12}, + {label: "In-Store Sales", value: 30}, + {label: "Mail-Order Sales", value: 20} + ], + hideHover: 'auto' + }); + + //Fix for charts under tabs + $('.box ul.nav a').on('shown.bs.tab', function () { + area.redraw(); + donut.redraw(); + line.redraw(); + }); + + /* The todo list plugin */ + $(".todo-list").todolist({ + onCheck: function (ele) { + window.console.log("The element has been checked"); + return ele; + }, + onUncheck: function (ele) { + window.console.log("The element has been unchecked"); + return ele; + } + }); + +}); diff --git a/Plugson/www/static/AdminLTE/js/pages/dashboard2.js b/Plugson/www/static/AdminLTE/js/pages/dashboard2.js new file mode 100644 index 00000000..a892b5b4 --- /dev/null +++ b/Plugson/www/static/AdminLTE/js/pages/dashboard2.js @@ -0,0 +1,275 @@ +$(function () { + + 'use strict'; + + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + //----------------------- + //- MONTHLY SALES CHART - + //----------------------- + + // Get context with jQuery - using jQuery's .get() method. + var salesChartCanvas = $("#salesChart").get(0).getContext("2d"); + // This will get the first returned node in the jQuery collection. + var salesChart = new Chart(salesChartCanvas); + + var salesChartData = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "Electronics", + fillColor: "rgb(210, 214, 222)", + strokeColor: "rgb(210, 214, 222)", + pointColor: "rgb(210, 214, 222)", + pointStrokeColor: "#c1c7d1", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgb(220,220,220)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "Digital Goods", + fillColor: "rgba(60,141,188,0.9)", + strokeColor: "rgba(60,141,188,0.8)", + pointColor: "#3b8bba", + pointStrokeColor: "rgba(60,141,188,1)", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(60,141,188,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var salesChartOptions = { + //Boolean - If we should show the scale at all + showScale: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: false, + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - Whether the line is curved between points + bezierCurve: true, + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.3, + //Boolean - Whether to show a dot for each point + pointDot: false, + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + //Boolean - Whether to fill the dataset with a color + datasetFill: true, + //String - A legend template + legendTemplate: "
    -legend\"><% for (var i=0; i
  • \"><%=datasets[i].label%>
  • <%}%>
", + //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + //Boolean - whether to make the chart responsive to window resizing + responsive: true + }; + + //Create the line chart + salesChart.Line(salesChartData, salesChartOptions); + + //--------------------------- + //- END MONTHLY SALES CHART - + //--------------------------- + + //------------- + //- PIE CHART - + //------------- + // Get context with jQuery - using jQuery's .get() method. + var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); + var pieChart = new Chart(pieChartCanvas); + var PieData = [ + { + value: 700, + color: "#f56954", + highlight: "#f56954", + label: "Chrome" + }, + { + value: 500, + color: "#00a65a", + highlight: "#00a65a", + label: "IE" + }, + { + value: 400, + color: "#f39c12", + highlight: "#f39c12", + label: "FireFox" + }, + { + value: 600, + color: "#00c0ef", + highlight: "#00c0ef", + label: "Safari" + }, + { + value: 300, + color: "#3c8dbc", + highlight: "#3c8dbc", + label: "Opera" + }, + { + value: 100, + color: "#d2d6de", + highlight: "#d2d6de", + label: "Navigator" + } + ]; + var pieOptions = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke: true, + //String - The colour of each segment stroke + segmentStrokeColor: "#fff", + //Number - The width of each segment stroke + segmentStrokeWidth: 1, + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout: 50, // This is 0 for Pie charts + //Number - Amount of animation steps + animationSteps: 100, + //String - Animation easing effect + animationEasing: "easeOutBounce", + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false, + //Boolean - whether to make the chart responsive to window resizing + responsive: true, + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: false, + //String - A legend template + legendTemplate: "
    -legend\"><% for (var i=0; i
  • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>
", + //String - A tooltip template + tooltipTemplate: "<%=value %> <%=label%> users" + }; + //Create pie or douhnut chart + // You can switch between pie and douhnut using the method below. + pieChart.Doughnut(PieData, pieOptions); + //----------------- + //- END PIE CHART - + //----------------- + + /* jVector Maps + * ------------ + * Create a world map with markers + */ + $('#world-map-markers').vectorMap({ + map: 'world_mill_en', + normalizeFunction: 'polynomial', + hoverOpacity: 0.7, + hoverColor: false, + backgroundColor: 'transparent', + regionStyle: { + initial: { + fill: 'rgba(210, 214, 222, 1)', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + }, + hover: { + "fill-opacity": 0.7, + cursor: 'pointer' + }, + selected: { + fill: 'yellow' + }, + selectedHover: { + } + }, + markerStyle: { + initial: { + fill: '#00a65a', + stroke: '#111' + } + }, + markers: [ + {latLng: [41.90, 12.45], name: 'Vatican City'}, + {latLng: [43.73, 7.41], name: 'Monaco'}, + {latLng: [-0.52, 166.93], name: 'Nauru'}, + {latLng: [-8.51, 179.21], name: 'Tuvalu'}, + {latLng: [43.93, 12.46], name: 'San Marino'}, + {latLng: [47.14, 9.52], name: 'Liechtenstein'}, + {latLng: [7.11, 171.06], name: 'Marshall Islands'}, + {latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis'}, + {latLng: [3.2, 73.22], name: 'Maldives'}, + {latLng: [35.88, 14.5], name: 'Malta'}, + {latLng: [12.05, -61.75], name: 'Grenada'}, + {latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines'}, + {latLng: [13.16, -59.55], name: 'Barbados'}, + {latLng: [17.11, -61.85], name: 'Antigua and Barbuda'}, + {latLng: [-4.61, 55.45], name: 'Seychelles'}, + {latLng: [7.35, 134.46], name: 'Palau'}, + {latLng: [42.5, 1.51], name: 'Andorra'}, + {latLng: [14.01, -60.98], name: 'Saint Lucia'}, + {latLng: [6.91, 158.18], name: 'Federated States of Micronesia'}, + {latLng: [1.3, 103.8], name: 'Singapore'}, + {latLng: [1.46, 173.03], name: 'Kiribati'}, + {latLng: [-21.13, -175.2], name: 'Tonga'}, + {latLng: [15.3, -61.38], name: 'Dominica'}, + {latLng: [-20.2, 57.5], name: 'Mauritius'}, + {latLng: [26.02, 50.55], name: 'Bahrain'}, + {latLng: [0.33, 6.73], name: 'São Tomé and Príncipe'} + ] + }); + + /* SPARKLINE CHARTS + * ---------------- + * Create a inline charts with spark line + */ + + //----------------- + //- SPARKLINE BAR - + //----------------- + $('.sparkbar').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'bar', + height: $this.data('height') ? $this.data('height') : '30', + barColor: $this.data('color') + }); + }); + + //----------------- + //- SPARKLINE PIE - + //----------------- + $('.sparkpie').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'pie', + height: $this.data('height') ? $this.data('height') : '90', + sliceColors: $this.data('color') + }); + }); + + //------------------ + //- SPARKLINE LINE - + //------------------ + $('.sparkline').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'line', + height: $this.data('height') ? $this.data('height') : '90', + width: '100%', + lineColor: $this.data('linecolor'), + fillColor: $this.data('fillcolor'), + spotColor: $this.data('spotcolor') + }); + }); +}); diff --git a/Plugson/www/static/AdminLTE/plugins/chartjs/Chart.min.js b/Plugson/www/static/AdminLTE/plugins/chartjs/Chart.min.js new file mode 100644 index 00000000..fdbb8d9d --- /dev/null +++ b/Plugson/www/static/AdminLTE/plugins/chartjs/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
    <% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>
'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
  • <%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
      <% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); diff --git a/Plugson/www/static/bootstrap/css/bootstrap-theme.css b/Plugson/www/static/bootstrap/css/bootstrap-theme.css new file mode 100644 index 00000000..c19cd5c4 --- /dev/null +++ b/Plugson/www/static/bootstrap/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/Plugson/www/static/bootstrap/css/bootstrap-theme.css.map b/Plugson/www/static/bootstrap/css/bootstrap-theme.css.map new file mode 100644 index 00000000..75353114 --- /dev/null +++ b/Plugson/www/static/bootstrap/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/Plugson/www/static/bootstrap/css/bootstrap-theme.min.css b/Plugson/www/static/bootstrap/css/bootstrap-theme.min.css new file mode 100644 index 00000000..61358b13 --- /dev/null +++ b/Plugson/www/static/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/Plugson/www/static/bootstrap/css/bootstrap.css b/Plugson/www/static/bootstrap/css/bootstrap.css new file mode 100644 index 00000000..680e7687 --- /dev/null +++ b/Plugson/www/static/bootstrap/css/bootstrap.css @@ -0,0 +1,6800 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/Plugson/www/static/bootstrap/css/bootstrap.css.map b/Plugson/www/static/bootstrap/css/bootstrap.css.map new file mode 100644 index 00000000..9f60ed2b --- /dev/null +++ b/Plugson/www/static/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,eAAA;CH8O9C;AG7OmC;EAAW,eAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,8BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,iCAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,8BAAA;ChB+qEH;AgBntED;EAyCI,0BAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,0BAAA;ChB8pED;AgB/pED;;;;;;EAQQ,0BAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EAAA;IA1DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,0BAAA;GhBqtED;EgB/pEH;IAlDM,iBAAA;GhBotEH;EgBlqEH;;;;;;IAzCY,oBAAA;GhBmtET;EgB1qEH;IAjCM,UAAA;GhB8sEH;EgB7qEH;;;;;;IAxBY,eAAA;GhB6sET;EgBrrEH;;;;;;IApBY,gBAAA;GhBitET;EgB7rEH;;;;IAPY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,0BAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,eAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,eAAA;CL65E3B;AK55EC;EAAgC,eAAA;CL+5EjC;AkB/3EC;;;EAGE,0BAAA;EACA,WAAA;ClBi4EH;AkB93EC;;EAEE,oBAAA;ClBg4EH;AkB53EC;EACE,aAAA;ClB83EH;AkBl3ED;EACE,yBAAA;ClBo3ED;AkB50ED;EAtBI;;;;IACE,kBAAA;GlBw2EH;EkBr2EC;;;;;;;;IAEE,kBAAA;GlB62EH;EkB12EC;;;;;;;;IAEE,kBAAA;GlBk3EH;CACF;AkBx2ED;EACE,oBAAA;ClB02ED;AkBl2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBo2ED;AkBz2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBq2EH;AkBl2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBo2ED;AkBj2ED;;EAEE,iBAAA;ClBm2ED;AkB/1ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2ED;AkB/1ED;;EAEE,cAAA;EACA,kBAAA;ClBi2ED;AkBx1EC;;;;;;EAGE,oBAAA;ClB61EH;AkBv1EC;;;;EAEE,oBAAA;ClB21EH;AkBr1EC;;;;EAGI,oBAAA;ClBw1EL;AkB70ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB60ED;AkB30EC;;EAEE,gBAAA;EACA,iBAAA;ClB60EH;AkBh0ED;EC7PE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBgkFD;AmB9jFC;EACE,aAAA;EACA,kBAAA;CnBgkFH;AmB7jFC;;EAEE,aAAA;CnB+jFH;AkB50ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB60EH;AkBn1ED;EASI,aAAA;EACA,kBAAA;ClB60EH;AkBv1ED;;EAcI,aAAA;ClB60EH;AkB31ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB60EH;AkBz0ED;ECzRE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBqmFD;AmBnmFC;EACE,aAAA;EACA,kBAAA;CnBqmFH;AmBlmFC;;EAEE,aAAA;CnBomFH;AkBr1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBs1EH;AkB51ED;EASI,aAAA;EACA,kBAAA;ClBs1EH;AkBh2ED;;EAcI,aAAA;ClBs1EH;AkBp2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBs1EH;AkB70ED;EAEE,mBAAA;ClB80ED;AkBh1ED;EAMI,sBAAA;ClB60EH;AkBz0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBv0ED;;;;;;;;;;ECpZI,eAAA;CnBuuFH;AkBn1ED;EChZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwrFT;AmBtuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6rFT;AkB71ED;ECtYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsuFH;AkBl2ED;EChYI,eAAA;CnBquFH;AkBl2ED;;;;;;;;;;ECvZI,eAAA;CnBqwFH;AkB92ED;ECnZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLstFT;AmBpwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2tFT;AkBx3ED;ECzYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBowFH;AkB73ED;ECnYI,eAAA;CnBmwFH;AkB73ED;;;;;;;;;;EC1ZI,eAAA;CnBmyFH;AkBz4ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLovFT;AmBlyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLyvFT;AkBn5ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBkyFH;AkBx5ED;ECtYI,eAAA;CnBiyFH;AkBp5EC;EACG,UAAA;ClBs5EJ;AkBp5EC;EACG,OAAA;ClBs5EJ;AkB54ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB84ED;AkB3zED;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB63EH;EkBj0EH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB23EH;EkBt0EH;IAhDM,sBAAA;GlBy3EH;EkBz0EH;IA5CM,sBAAA;IACA,uBAAA;GlBw3EH;EkB70EH;;;IAtCQ,YAAA;GlBw3EL;EkBl1EH;IAhCM,YAAA;GlBq3EH;EkBr1EH;IA5BM,iBAAA;IACA,uBAAA;GlBo3EH;EkBz1EH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBi3EH;EkBh2EH;;IAdQ,gBAAA;GlBk3EL;EkBp2EH;;IATM,mBAAA;IACA,eAAA;GlBi3EH;EkBz2EH;IAHM,OAAA;GlB+2EH;CACF;AkBr2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBk2EH;AkB72ED;;EAiBI,iBAAA;ClBg2EH;AkBj3ED;EJhhBE,mBAAA;EACA,oBAAA;Cdo4FD;AkB90EC;EAAA;IAVI,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB41EH;CACF;AkB53ED;EAwCI,YAAA;ClBu1EH;AkBz0EC;EAAA;IAJM,yBAAA;IACA,gBAAA;GlBi1EL;CACF;AkBv0EC;EAAA;IAJM,iBAAA;IACA,gBAAA;GlB+0EL;CACF;AoBl6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC6CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB4JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL6tFT;AoBr6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNi8FD;AoBz6FC;;;EAGE,eAAA;EACA,sBAAA;CpB26FH;AoBx6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLg5FT;AoBx6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CLy5FT;AoBx6FG;;EAEE,qBAAA;CpB06FL;AoBj6FD;EC3DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrB+9FD;AqB79FC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBq+FT;AqBl+FC;;;EAGE,uBAAA;CrBo+FH;AqB/9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB6+FT;AoB/9FD;ECTI,eAAA;EACA,0BAAA;CrB2+FH;AoBh+FD;EC9DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBiiGD;AqB/hGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuiGT;AqBpiGC;;;EAGE,uBAAA;CrBsiGH;AqBjiGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB+iGT;AoB9hGD;ECZI,eAAA;EACA,0BAAA;CrB6iGH;AoB9hGD;EClEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBmmGD;AqBjmGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBymGT;AqBtmGC;;;EAGE,uBAAA;CrBwmGH;AqBnmGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBinGT;AoB5lGD;EChBI,eAAA;EACA,0BAAA;CrB+mGH;AoB5lGD;ECtEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBqqGD;AqBnqGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB2qGT;AqBxqGC;;;EAGE,uBAAA;CrB0qGH;AqBrqGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBmrGT;AoB1pGD;ECpBI,eAAA;EACA,0BAAA;CrBirGH;AoB1pGD;EC1EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBuuGD;AqBruGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB6uGT;AqB1uGC;;;EAGE,uBAAA;CrB4uGH;AqBvuGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBqvGT;AoBxtGD;ECxBI,eAAA;EACA,0BAAA;CrBmvGH;AoBxtGD;EC9EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrByyGD;AqBvyGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+yGT;AqB5yGC;;;EAGE,uBAAA;CrB8yGH;AqBzyGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBuzGT;AoBtxGD;EC5BI,eAAA;EACA,0BAAA;CrBqzGH;AoBjxGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBmxGD;AoBjxGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLuzGT;AoBlxGC;;;;EAIE,0BAAA;CpBoxGH;AoBlxGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBoxGH;AoBhxGG;;;;EAEE,eAAA;EACA,sBAAA;CpBoxGL;AoB3wGD;;ECrEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBo1GD;AoB9wGD;;ECzEE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB21GD;AoBjxGD;;EC7EE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBk2GD;AoBhxGD;EACE,eAAA;EACA,YAAA;CpBkxGD;AoB9wGD;EACE,gBAAA;CpBgxGD;AoBzwGC;;;EACE,YAAA;CpB6wGH;AuBv6GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLsvGT;AuB16GC;EACE,WAAA;CvB46GH;AuBx6GD;EACE,cAAA;CvB06GD;AuBx6GC;EAAY,eAAA;CvB26Gb;AuB16GC;EAAY,mBAAA;CvB66Gb;AuB56GC;EAAY,yBAAA;CvB+6Gb;AuB56GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CLgwGT;AwB18GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB48GD;AwBx8GD;;EAEE,mBAAA;CxB08GD;AwBt8GD;EACE,WAAA;CxBw8GD;AwBp8GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;EACA,0BAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBu8GD;AwBl8GC;EACE,SAAA;EACA,WAAA;CxBo8GH;AwB79GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBy/GD;AwBn+GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBm8GH;AwB77GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB+7GH;AwBz7GC;;;EAGE,eAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxB27GH;AwBl7GC;;;EAGE,eAAA;CxBo7GH;AwBh7GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBk7GH;AwB76GD;EAGI,eAAA;CxB66GH;AwBh7GD;EAQI,WAAA;CxB26GH;AwBn6GD;EACE,WAAA;EACA,SAAA;CxBq6GD;AwB75GD;EACE,QAAA;EACA,YAAA;CxB+5GD;AwB35GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB65GD;AwBz5GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxB25GD;AwBv5GD;EACE,SAAA;EACA,WAAA;CxBy5GD;AwBj5GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxBi5GH;AwBx5GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxBi5GH;AwB53GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB+8GC;EwB54GD;IA1DA,QAAA;IACA,YAAA;GxBy8GC;CACF;A2BzlHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3B2lHD;A2B/lHD;;EAMI,mBAAA;EACA,YAAA;C3B6lHH;A2B3lHG;;;;;;;;EAIE,WAAA;C3BimHL;A2B3lHD;;;;EAKI,kBAAA;C3B4lHH;A2BvlHD;EACE,kBAAA;C3BylHD;A2B1lHD;;;EAOI,YAAA;C3BwlHH;A2B/lHD;;;EAYI,iBAAA;C3BwlHH;A2BplHD;EACE,iBAAA;C3BslHD;A2BllHD;EACE,eAAA;C3BolHD;A2BnlHC;EClDA,8BAAA;EACG,2BAAA;C5BwoHJ;A2BllHD;;EC/CE,6BAAA;EACG,0BAAA;C5BqoHJ;A2BjlHD;EACE,YAAA;C3BmlHD;A2BjlHD;EACE,iBAAA;C3BmlHD;A2BjlHD;;ECnEE,8BAAA;EACG,2BAAA;C5BwpHJ;A2BhlHD;ECjEE,6BAAA;EACG,0BAAA;C5BopHJ;A2B/kHD;;EAEE,WAAA;C3BilHD;A2BhkHD;EACE,kBAAA;EACA,mBAAA;C3BkkHD;A2BhkHD;EACE,mBAAA;EACA,oBAAA;C3BkkHD;A2B7jHD;EtB/CE,yDAAA;EACQ,iDAAA;CL+mHT;A2B7jHC;EtBnDA,yBAAA;EACQ,iBAAA;CLmnHT;A2B1jHD;EACE,eAAA;C3B4jHD;A2BzjHD;EACE,wBAAA;EACA,uBAAA;C3B2jHD;A2BxjHD;EACE,wBAAA;C3B0jHD;A2BnjHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BojHH;A2B3jHD;EAcM,YAAA;C3BgjHL;A2B9jHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B8iHH;A2BziHC;EACE,iBAAA;C3B2iHH;A2BziHC;EACE,6BAAA;ECpKF,8BAAA;EACC,6BAAA;C5BgtHF;A2B1iHC;EACE,+BAAA;EChLF,2BAAA;EACC,0BAAA;C5B6tHF;A2B1iHD;EACE,iBAAA;C3B4iHD;A2B1iHD;;EC/KE,8BAAA;EACC,6BAAA;C5B6tHF;A2BziHD;EC7LE,2BAAA;EACC,0BAAA;C5ByuHF;A2BriHD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3BuiHD;A2B3iHD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3BwiHH;A2BjjHD;EAYI,YAAA;C3BwiHH;A2BpjHD;EAgBI,WAAA;C3BuiHH;A2BthHD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3BuhHL;A6BjwHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmwHD;A6BhwHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BkwHH;A6B3wHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0vHH;A6BjvHD;;;EV8BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwtHD;AmBttHC;;;EACE,aAAA;EACA,kBAAA;CnB0tHH;AmBvtHC;;;;;;EAEE,aAAA;CnB6tHH;A6BnwHD;;;EVyBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+uHD;AmB7uHC;;;EACE,aAAA;EACA,kBAAA;CnBivHH;AmB9uHC;;;;;;EAEE,aAAA;CnBovHH;A6BjxHD;;;EAGE,oBAAA;C7BmxHD;A6BjxHC;;;EACE,iBAAA;C7BqxHH;A6BjxHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BmxHD;A6B9wHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;C7BgxHD;A6B7wHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6B7wHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6BnyHD;;EA0BI,cAAA;C7B6wHH;A6BxwHD;;;;;;;EDhGE,8BAAA;EACG,2BAAA;C5Bi3HJ;A6BzwHD;EACE,gBAAA;C7B2wHD;A6BzwHD;;;;;;;EDpGE,6BAAA;EACG,0BAAA;C5Bs3HJ;A6B1wHD;EACE,eAAA;C7B4wHD;A6BvwHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BuwHD;A6B5wHD;EAUI,mBAAA;C7BqwHH;A6B/wHD;EAYM,kBAAA;C7BswHL;A6BnwHG;;;EAGE,WAAA;C7BqwHL;A6BhwHC;;EAGI,mBAAA;C7BiwHL;A6B9vHC;;EAGI,WAAA;EACA,kBAAA;C7B+vHL;A8B15HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B45HD;A8B/5HD;EAOI,mBAAA;EACA,eAAA;C9B25HH;A8Bn6HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B25HL;A8B15HK;;EAEE,sBAAA;EACA,0BAAA;C9B45HP;A8Bv5HG;EACE,eAAA;C9By5HL;A8Bv5HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By5HP;A8Bl5HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo5HL;A8B77HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm8HD;A8Bn8HD;EA0DI,gBAAA;C9B44HH;A8Bn4HD;EACE,iCAAA;C9Bq4HD;A8Bt4HD;EAGI,YAAA;EAEA,oBAAA;C9Bq4HH;A8B14HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo4HL;A8Bn4HK;EACE,sCAAA;C9Bq4HP;A8B/3HK;;;EAGE,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,iCAAA;EACA,gBAAA;C9Bi4HP;A8B53HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6yHD;A8Bh4HC;EAwDE,YAAA;C9B20HH;A8Bn4HC;EA0DI,mBAAA;EACA,mBAAA;C9B40HL;A8Bv4HC;EAgEE,UAAA;EACA,WAAA;C9B00HH;A8B9zHD;EAAA;IAPM,oBAAA;IACA,UAAA;G9By0HH;E8Bn0HH;IAJQ,iBAAA;G9B00HL;CACF;A8Bp5HC;EAuFE,gBAAA;EACA,mBAAA;C9Bg0HH;A8Bx5HC;;;EA8FE,0BAAA;C9B+zHH;A8BjzHD;EAAA;IATM,iCAAA;IACA,2BAAA;G9B8zHH;E8BtzHH;;;IAHM,6BAAA;G9B8zHH;CACF;A8B/5HD;EAEI,YAAA;C9Bg6HH;A8Bl6HD;EAMM,mBAAA;C9B+5HL;A8Br6HD;EASM,iBAAA;C9B+5HL;A8B15HK;;;EAGE,eAAA;EACA,0BAAA;C9B45HP;A8Bp5HD;EAEI,YAAA;C9Bq5HH;A8Bv5HD;EAIM,gBAAA;EACA,eAAA;C9Bs5HL;A8B14HD;EACE,YAAA;C9B44HD;A8B74HD;EAII,YAAA;C9B44HH;A8Bh5HD;EAMM,mBAAA;EACA,mBAAA;C9B64HL;A8Bp5HD;EAYI,UAAA;EACA,WAAA;C9B24HH;A8B/3HD;EAAA;IAPM,oBAAA;IACA,UAAA;G9B04HH;E8Bp4HH;IAJQ,iBAAA;G9B24HL;CACF;A8Bn4HD;EACE,iBAAA;C9Bq4HD;A8Bt4HD;EAKI,gBAAA;EACA,mBAAA;C9Bo4HH;A8B14HD;;;EAYI,0BAAA;C9Bm4HH;A8Br3HD;EAAA;IATM,iCAAA;IACA,2BAAA;G9Bk4HH;E8B13HH;;;IAHM,6BAAA;G9Bk4HH;CACF;A8Bz3HD;EAEI,cAAA;C9B03HH;A8B53HD;EAKI,eAAA;C9B03HH;A8Bj3HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8lIF;A+BxlID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0lID;A+BllID;EAAA;IAFI,mBAAA;G/BwlID;CACF;A+BzkID;EAAA;IAFI,YAAA;G/B+kID;CACF;A+BjkID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkkID;A+BhkIC;EACE,iBAAA;C/BkkIH;A+BtiID;EAAA;IAxBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkkID;E+BhkIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkkIH;E+B/jIC;IACE,oBAAA;G/BikIH;E+B5jIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8jIH;CACF;A+B1jID;;EAGI,kBAAA;C/B2jIH;A+BtjIC;EAAA;;IAFI,kBAAA;G/B6jIH;CACF;A+BpjID;;;;EAII,oBAAA;EACA,mBAAA;C/BsjIH;A+BhjIC;EAAA;;;;IAHI,gBAAA;IACA,eAAA;G/B0jIH;CACF;A+B9iID;EACE,cAAA;EACA,sBAAA;C/BgjID;A+B3iID;EAAA;IAFI,iBAAA;G/BijID;CACF;A+B7iID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+iID;A+BziID;EAAA;;IAFI,iBAAA;G/BgjID;CACF;A+B9iID;EACE,OAAA;EACA,sBAAA;C/BgjID;A+B9iID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BgjID;A+B1iID;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4iID;A+B1iIC;;EAEE,sBAAA;C/B4iIH;A+BrjID;EAaI,eAAA;C/B2iIH;A+BliID;EALI;;IAEE,mBAAA;G/B0iIH;CACF;A+BhiID;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/BmiID;A+B/hIC;EACE,WAAA;C/BiiIH;A+B/iID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B+hIH;A+BrjID;EAyBI,gBAAA;C/B+hIH;A+BzhID;EAAA;IAFI,cAAA;G/B+hID;CACF;A+BthID;EACE,oBAAA;C/BwhID;A+BzhID;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/BwhIH;A+B5/HC;EAAA;IAtBI,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/BshIH;E+BtgID;;IAbM,2BAAA;G/BuhIL;E+B1gID;IAVM,kBAAA;G/BuhIL;E+BthIK;;IAEE,uBAAA;G/BwhIP;CACF;A+BtgID;EAAA;IAXI,YAAA;IACA,UAAA;G/BqhID;E+B3gIH;IAPM,YAAA;G/BqhIH;E+B9gIH;IALQ,kBAAA;IACA,qBAAA;G/BshIL;CACF;A+B3gID;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4yID;AkB5xHD;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB81HH;EkBlyHH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB41HH;EkBvyHH;IAhDM,sBAAA;GlB01HH;EkB1yHH;IA5CM,sBAAA;IACA,uBAAA;GlBy1HH;EkB9yHH;;;IAtCQ,YAAA;GlBy1HL;EkBnzHH;IAhCM,YAAA;GlBs1HH;EkBtzHH;IA5BM,iBAAA;IACA,uBAAA;GlBq1HH;EkB1zHH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBk1HH;EkBj0HH;;IAdQ,gBAAA;GlBm1HL;EkBr0HH;;IATM,mBAAA;IACA,eAAA;GlBk1HH;EkB10HH;IAHM,OAAA;GlBg1HH;CACF;A+BpjIC;EAAA;IANI,mBAAA;G/B8jIH;E+B5jIG;IACE,iBAAA;G/B8jIL;CACF;A+B7iID;EAAA;IARI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmzIP;CACF;A+BnjID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B03IF;A+BnjID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By3IF;A+B/iID;EChVE,gBAAA;EACA,mBAAA;ChCk4ID;A+BhjIC;ECnVA,iBAAA;EACA,oBAAA;ChCs4ID;A+BjjIC;ECtVA,iBAAA;EACA,oBAAA;ChC04ID;A+B3iID;EChWE,iBAAA;EACA,oBAAA;ChC84ID;A+BviID;EAAA;IAJI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+iID;CACF;A+BlhID;EAhBE;IExWA,uBAAA;GjC84IC;E+BriID;IE5WA,wBAAA;IF8WE,oBAAA;G/BuiID;E+BziID;IAKI,gBAAA;G/BuiIH;CACF;A+B9hID;EACE,0BAAA;EACA,sBAAA;C/BgiID;A+BliID;EAKI,eAAA;C/BgiIH;A+B/hIG;;EAEE,eAAA;EACA,8BAAA;C/BiiIL;A+B1iID;EAcI,eAAA;C/B+hIH;A+B7iID;EAmBM,eAAA;C/B6hIL;A+B3hIK;;EAEE,eAAA;EACA,8BAAA;C/B6hIP;A+BzhIK;;;EAGE,eAAA;EACA,0BAAA;C/B2hIP;A+BvhIK;;;EAGE,eAAA;EACA,8BAAA;C/ByhIP;A+BjkID;EA8CI,sBAAA;C/BshIH;A+BrhIG;;EAEE,0BAAA;C/BuhIL;A+BxkID;EAoDM,0BAAA;C/BuhIL;A+B3kID;;EA0DI,sBAAA;C/BqhIH;A+B9gIK;;;EAGE,0BAAA;EACA,eAAA;C/BghIP;A+B/+HC;EAAA;IAzBQ,eAAA;G/B4gIP;E+B3gIO;;IAEE,eAAA;IACA,8BAAA;G/B6gIT;E+BzgIO;;;IAGE,eAAA;IACA,0BAAA;G/B2gIT;E+BvgIO;;;IAGE,eAAA;IACA,8BAAA;G/BygIT;CACF;A+B3mID;EA8GI,eAAA;C/BggIH;A+B//HG;EACE,eAAA;C/BigIL;A+BjnID;EAqHI,eAAA;C/B+/HH;A+B9/HG;;EAEE,eAAA;C/BggIL;A+B5/HK;;;;EAEE,eAAA;C/BggIP;A+Bx/HD;EACE,0BAAA;EACA,sBAAA;C/B0/HD;A+B5/HD;EAKI,eAAA;C/B0/HH;A+Bz/HG;;EAEE,eAAA;EACA,8BAAA;C/B2/HL;A+BpgID;EAcI,eAAA;C/By/HH;A+BvgID;EAmBM,eAAA;C/Bu/HL;A+Br/HK;;EAEE,eAAA;EACA,8BAAA;C/Bu/HP;A+Bn/HK;;;EAGE,eAAA;EACA,0BAAA;C/Bq/HP;A+Bj/HK;;;EAGE,eAAA;EACA,8BAAA;C/Bm/HP;A+B3hID;EA+CI,sBAAA;C/B++HH;A+B9+HG;;EAEE,0BAAA;C/Bg/HL;A+BliID;EAqDM,0BAAA;C/Bg/HL;A+BriID;;EA2DI,sBAAA;C/B8+HH;A+Bx+HK;;;EAGE,0BAAA;EACA,eAAA;C/B0+HP;A+Bn8HC;EAAA;IA/BQ,sBAAA;G/Bs+HP;E+Bv8HD;IA5BQ,0BAAA;G/Bs+HP;E+B18HD;IAzBQ,eAAA;G/Bs+HP;E+Br+HO;;IAEE,eAAA;IACA,8BAAA;G/Bu+HT;E+Bn+HO;;;IAGE,eAAA;IACA,0BAAA;G/Bq+HT;E+Bj+HO;;;IAGE,eAAA;IACA,8BAAA;G/Bm+HT;CACF;A+B3kID;EA+GI,eAAA;C/B+9HH;A+B99HG;EACE,eAAA;C/Bg+HL;A+BjlID;EAsHI,eAAA;C/B89HH;A+B79HG;;EAEE,eAAA;C/B+9HL;A+B39HK;;;;EAEE,eAAA;C/B+9HP;AkCzmJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2mJD;AkChnJD;EAQI,sBAAA;ClC2mJH;AkCnnJD;EAWM,kBAAA;EACA,eAAA;EACA,eAAA;ClC2mJL;AkCxnJD;EAkBI,eAAA;ClCymJH;AmC7nJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+nJD;AmCnoJD;EAOI,gBAAA;CnC+nJH;AmCtoJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,kBAAA;CnCgoJL;AmC9nJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2oJJ;AmC7nJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwpJJ;AmCxnJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CnC4nJL;AmCtnJG;;;;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2nJL;AmClrJD;;;;;;EAkEM,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,oBAAA;CnCwnJL;AmC/mJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8rJL;AoC5rJG;;ERKF,+BAAA;EACG,4BAAA;C5B2rJJ;AoC3rJG;;ERTF,gCAAA;EACG,6BAAA;C5BwsJJ;AmC1nJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8sJL;AoC5sJG;;ERKF,+BAAA;EACG,4BAAA;C5B2sJJ;AoC3sJG;;ERTF,gCAAA;EACG,6BAAA;C5BwtJJ;AqC3tJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6tJD;AqCjuJD;EAOI,gBAAA;CrC6tJH;AqCpuJD;;EAUM,sBAAA;EACA,kBAAA;EACA,0BAAA;EACA,0BAAA;EACA,oBAAA;CrC8tJL;AqC5uJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6tJL;AqCjvJD;;EA2BM,aAAA;CrC0tJL;AqCrvJD;;EAkCM,YAAA;CrCutJL;AqCzvJD;;;;EA2CM,eAAA;EACA,0BAAA;EACA,oBAAA;CrCotJL;AsClwJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCowJD;AsChwJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CtCkwJL;AsC7vJC;EACE,cAAA;CtC+vJH;AsC3vJC;EACE,mBAAA;EACA,UAAA;CtC6vJH;AsCtvJD;ECtCE,0BAAA;CvC+xJD;AuC5xJG;;EAEE,0BAAA;CvC8xJL;AsCzvJD;EC1CE,0BAAA;CvCsyJD;AuCnyJG;;EAEE,0BAAA;CvCqyJL;AsC5vJD;EC9CE,0BAAA;CvC6yJD;AuC1yJG;;EAEE,0BAAA;CvC4yJL;AsC/vJD;EClDE,0BAAA;CvCozJD;AuCjzJG;;EAEE,0BAAA;CvCmzJL;AsClwJD;ECtDE,0BAAA;CvC2zJD;AuCxzJG;;EAEE,0BAAA;CvC0zJL;AsCrwJD;EC1DE,0BAAA;CvCk0JD;AuC/zJG;;EAEE,0BAAA;CvCi0JL;AwCn0JD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCq0JD;AwCl0JC;EACE,cAAA;CxCo0JH;AwCh0JC;EACE,mBAAA;EACA,UAAA;CxCk0JH;AwC/zJC;;EAEE,OAAA;EACA,iBAAA;CxCi0JH;AwC5zJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CxC8zJL;AwCzzJC;;EAEE,eAAA;EACA,0BAAA;CxC2zJH;AwCxzJC;EACE,aAAA;CxC0zJH;AwCvzJC;EACE,kBAAA;CxCyzJH;AwCtzJC;EACE,iBAAA;CxCwzJH;AyCl3JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo3JD;AyCz3JD;;EASI,eAAA;CzCo3JH;AyC73JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm3JH;AyCl4JD;EAmBI,0BAAA;CzCk3JH;AyC/2JC;;EAEE,mBAAA;CzCi3JH;AyCz4JD;EA4BI,gBAAA;CzCg3JH;AyC91JD;EAAA;IAdI,kBAAA;IACA,qBAAA;GzCg3JD;EyC92JC;;IAEE,mBAAA;IACA,oBAAA;GzCg3JH;EyCx2JH;;IAHM,gBAAA;GzC+2JH;CACF;A0C15JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL4uJT;A0Ct6JD;;EAaI,kBAAA;EACA,mBAAA;C1C65JH;A0Cz5JC;;;EAGE,sBAAA;C1C25JH;A0Ch7JD;EA0BI,aAAA;EACA,eAAA;C1Cy5JH;A2Cl7JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Co7JD;A2Cx7JD;EAQI,cAAA;EAEA,eAAA;C3Ck7JH;A2C57JD;EAeI,kBAAA;C3Cg7JH;A2C/7JD;;EAqBI,iBAAA;C3C86JH;A2Cn8JD;EAyBI,gBAAA;C3C66JH;A2Cr6JD;;EAEE,oBAAA;C3Cu6JD;A2Cz6JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cu6JH;A2C/5JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy9JD;A2Cp6JD;EClDI,0BAAA;C5Cy9JH;A2Cv6JD;EC/CI,eAAA;C5Cy9JH;A2Ct6JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co+JD;A2C36JD;ECtDI,0BAAA;C5Co+JH;A2C96JD;ECnDI,eAAA;C5Co+JH;A2C76JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C++JD;A2Cl7JD;EC1DI,0BAAA;C5C++JH;A2Cr7JD;ECvDI,eAAA;C5C++JH;A2Cp7JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C0/JD;A2Cz7JD;EC9DI,0BAAA;C5C0/JH;A2C57JD;EC3DI,eAAA;C5C0/JH;A6C5/JD;EACE;IAAQ,4BAAA;G7C+/JP;E6C9/JD;IAAQ,yBAAA;G7CigKP;CACF;A6C9/JD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6CtgKD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6C5/JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CLy9JT;A6C3/JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL62JT;A6Cx/JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C4/JD;A6Cr/JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLqiKT;A6Cl/JD;EErEE,0BAAA;C/C0jKD;A+CvjKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0gKH;A6Ct/JD;EEzEE,0BAAA;C/CkkKD;A+C/jKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkhKH;A6C1/JD;EE7EE,0BAAA;C/C0kKD;A+CvkKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0hKH;A6C9/JD;EEjFE,0BAAA;C/CklKD;A+C/kKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkiKH;AgD1lKD;EAEE,iBAAA;ChD2lKD;AgDzlKC;EACE,cAAA;ChD2lKH;AgDvlKD;;EAEE,QAAA;EACA,iBAAA;ChDylKD;AgDtlKD;EACE,eAAA;ChDwlKD;AgDrlKD;EACE,eAAA;ChDulKD;AgDplKC;EACE,gBAAA;ChDslKH;AgDllKD;;EAEE,mBAAA;ChDolKD;AgDjlKD;;EAEE,oBAAA;ChDmlKD;AgDhlKD;;;EAGE,oBAAA;EACA,oBAAA;ChDklKD;AgD/kKD;EACE,uBAAA;ChDilKD;AgD9kKD;EACE,uBAAA;ChDglKD;AgD5kKD;EACE,cAAA;EACA,mBAAA;ChD8kKD;AgDxkKD;EACE,gBAAA;EACA,iBAAA;ChD0kKD;AiDjoKD;EAEE,oBAAA;EACA,gBAAA;CjDkoKD;AiD1nKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,0BAAA;EACA,0BAAA;CjD2nKD;AiDxnKC;ErB3BA,6BAAA;EACC,4BAAA;C5BspKF;AiDznKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BmpKF;AiDlnKD;;EAEE,eAAA;CjDonKD;AiDtnKD;;EAKI,eAAA;CjDqnKH;AiDjnKC;;;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CjDqnKH;AiDjnKD;EACE,YAAA;EACA,iBAAA;CjDmnKD;AiD9mKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDgnKH;AiDrnKC;;;EASI,eAAA;CjDinKL;AiD1nKC;;;EAYI,eAAA;CjDmnKL;AiD9mKC;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CjDgnKH;AiDtnKC;;;;;;;;;EAYI,eAAA;CjDqnKL;AiDjoKC;;;EAeI,eAAA;CjDunKL;AkDztKC;EACE,eAAA;EACA,0BAAA;ClD2tKH;AkDztKG;;EAEE,eAAA;ClD2tKL;AkD7tKG;;EAKI,eAAA;ClD4tKP;AkDztKK;;;;EAEE,eAAA;EACA,0BAAA;ClD6tKP;AkD3tKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDguKP;AkDtvKC;EACE,eAAA;EACA,0BAAA;ClDwvKH;AkDtvKG;;EAEE,eAAA;ClDwvKL;AkD1vKG;;EAKI,eAAA;ClDyvKP;AkDtvKK;;;;EAEE,eAAA;EACA,0BAAA;ClD0vKP;AkDxvKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD6vKP;AkDnxKC;EACE,eAAA;EACA,0BAAA;ClDqxKH;AkDnxKG;;EAEE,eAAA;ClDqxKL;AkDvxKG;;EAKI,eAAA;ClDsxKP;AkDnxKK;;;;EAEE,eAAA;EACA,0BAAA;ClDuxKP;AkDrxKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD0xKP;AkDhzKC;EACE,eAAA;EACA,0BAAA;ClDkzKH;AkDhzKG;;EAEE,eAAA;ClDkzKL;AkDpzKG;;EAKI,eAAA;ClDmzKP;AkDhzKK;;;;EAEE,eAAA;EACA,0BAAA;ClDozKP;AkDlzKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDuzKP;AiDttKD;EACE,cAAA;EACA,mBAAA;CjDwtKD;AiDttKD;EACE,iBAAA;EACA,iBAAA;CjDwtKD;AmDl1KD;EACE,oBAAA;EACA,0BAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL2xKT;AmDj1KD;EACE,cAAA;CnDm1KD;AmD90KD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5Bq2KF;AmDp1KD;EAMI,eAAA;CnDi1KH;AmD50KD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnD80KD;AmDl1KD;;;;;EAWI,eAAA;CnD80KH;AmDz0KD;EACE,mBAAA;EACA,0BAAA;EACA,8BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bo3KF;AmDn0KD;;EAGI,iBAAA;CnDo0KH;AmDv0KD;;EAMM,oBAAA;EACA,iBAAA;CnDq0KL;AmDj0KG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B24KF;AmD/zKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5By4KF;AmDx1KD;EvB1DE,2BAAA;EACC,0BAAA;C5Bq5KF;AmD3zKD;EAEI,oBAAA;CnD4zKH;AmDzzKD;EACE,oBAAA;CnD2zKD;AmDnzKD;;;EAII,iBAAA;CnDozKH;AmDxzKD;;;EAOM,mBAAA;EACA,oBAAA;CnDszKL;AmD9zKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B26KF;AmDn0KD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDszKP;AmD10KD;;;;;;;;EAwBU,4BAAA;CnD4zKT;AmDp1KD;;;;;;;;EA4BU,6BAAA;CnDk0KT;AmD91KD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bm8KF;AmDn2KD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDg0KP;AmD12KD;;;;;;;;EA8CU,+BAAA;CnDs0KT;AmDp3KD;;;;;;;;EAkDU,gCAAA;CnD40KT;AmD93KD;;;;EA2DI,8BAAA;CnDy0KH;AmDp4KD;;EA+DI,cAAA;CnDy0KH;AmDx4KD;;EAmEI,UAAA;CnDy0KH;AmD54KD;;;;;;;;;;;;EA0EU,eAAA;CnDg1KT;AmD15KD;;;;;;;;;;;;EA8EU,gBAAA;CnD01KT;AmDx6KD;;;;;;;;EAuFU,iBAAA;CnD21KT;AmDl7KD;;;;;;;;EAgGU,iBAAA;CnD41KT;AmD57KD;EAsGI,UAAA;EACA,iBAAA;CnDy1KH;AmD/0KD;EACE,oBAAA;CnDi1KD;AmDl1KD;EAKI,iBAAA;EACA,mBAAA;CnDg1KH;AmDt1KD;EASM,gBAAA;CnDg1KL;AmDz1KD;EAcI,iBAAA;CnD80KH;AmD51KD;;EAkBM,8BAAA;CnD80KL;AmDh2KD;EAuBI,cAAA;CnD40KH;AmDn2KD;EAyBM,iCAAA;CnD60KL;AmDt0KD;EC1PE,sBAAA;CpDmkLD;AoDjkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDmkLH;AoDtkLC;EAMI,0BAAA;CpDmkLL;AoDzkLC;EASI,eAAA;EACA,0BAAA;CpDmkLL;AoDhkLC;EAEI,6BAAA;CpDikLL;AmDr1KD;EC7PE,sBAAA;CpDqlLD;AoDnlLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDqlLH;AoDxlLC;EAMI,0BAAA;CpDqlLL;AoD3lLC;EASI,eAAA;EACA,0BAAA;CpDqlLL;AoDllLC;EAEI,6BAAA;CpDmlLL;AmDp2KD;EChQE,sBAAA;CpDumLD;AoDrmLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDumLH;AoD1mLC;EAMI,0BAAA;CpDumLL;AoD7mLC;EASI,eAAA;EACA,0BAAA;CpDumLL;AoDpmLC;EAEI,6BAAA;CpDqmLL;AmDn3KD;ECnQE,sBAAA;CpDynLD;AoDvnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDynLH;AoD5nLC;EAMI,0BAAA;CpDynLL;AoD/nLC;EASI,eAAA;EACA,0BAAA;CpDynLL;AoDtnLC;EAEI,6BAAA;CpDunLL;AmDl4KD;ECtQE,sBAAA;CpD2oLD;AoDzoLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2oLH;AoD9oLC;EAMI,0BAAA;CpD2oLL;AoDjpLC;EASI,eAAA;EACA,0BAAA;CpD2oLL;AoDxoLC;EAEI,6BAAA;CpDyoLL;AmDj5KD;ECzQE,sBAAA;CpD6pLD;AoD3pLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6pLH;AoDhqLC;EAMI,0BAAA;CpD6pLL;AoDnqLC;EASI,eAAA;EACA,0BAAA;CpD6pLL;AoD1pLC;EAEI,6BAAA;CpD2pLL;AqD3qLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD6qLD;AqDlrLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD6qLH;AqDxqLD;EACE,uBAAA;CrD0qLD;AqDtqLD;EACE,oBAAA;CrDwqLD;AsDnsLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CL8oLT;AsD7sLD;EASI,mBAAA;EACA,kCAAA;CtDusLH;AsDlsLD;EACE,cAAA;EACA,mBAAA;CtDosLD;AsDlsLD;EACE,aAAA;EACA,mBAAA;CtDosLD;AuD1tLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,6BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBmuLD;AuD3tLC;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB2uLD;AuDvtLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvDytLH;AwD9uLD;EACE,iBAAA;CxDgvLD;AwD5uLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD2uLD;AwDxuLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL2jLT;AwD9uLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLsoLT;AwDlvLD;EACE,mBAAA;EACA,iBAAA;CxDovLD;AwDhvLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDkvLD;AwD9uLD;EACE,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDgvLD;AwD5uLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,0BAAA;CxD8uLD;AwD5uLC;ElCrEA,WAAA;EAGA,yBAAA;CtBkzLD;AwD/uLC;ElCtEA,aAAA;EAGA,0BAAA;CtBszLD;AwD9uLD;EACE,cAAA;EACA,iCAAA;EACA,0BAAA;CxDgvLD;AwD7uLD;EACE,iBAAA;CxD+uLD;AwD3uLD;EACE,UAAA;EACA,wBAAA;CxD6uLD;AwDxuLD;EACE,mBAAA;EACA,cAAA;CxD0uLD;AwDtuLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDwuLD;AwD3uLD;EAQI,iBAAA;EACA,iBAAA;CxDsuLH;AwD/uLD;EAaI,kBAAA;CxDquLH;AwDlvLD;EAiBI,eAAA;CxDouLH;AwD/tLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDiuLD;AwD/sLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD8tLD;EwD5tLD;InDvEA,kDAAA;IACQ,0CAAA;GLsyLP;EwD3tLD;IAAY,aAAA;GxD8tLX;CACF;AwDztLD;EAFE;IAAY,aAAA;GxD+tLX;CACF;AyD92LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBq4LD;AyD13LC;EnCdA,aAAA;EAGA,0BAAA;CtBy4LD;AyD73LC;EAAW,iBAAA;EAAmB,eAAA;CzDi4L/B;AyDh4LC;EAAW,iBAAA;EAAmB,eAAA;CzDo4L/B;AyDn4LC;EAAW,gBAAA;EAAmB,eAAA;CzDu4L/B;AyDt4LC;EAAW,kBAAA;EAAmB,eAAA;CzD04L/B;AyDt4LD;EACE,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,mBAAA;CzDw4LD;AyDp4LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDs4LD;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,4BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,2BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;A2Dj+LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,0BAAA;EACA,qCAAA;UAAA,6BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLi8LT;A2D5+LC;EAAY,kBAAA;C3D++Lb;A2D9+LC;EAAY,kBAAA;C3Di/Lb;A2Dh/LC;EAAY,iBAAA;C3Dm/Lb;A2Dl/LC;EAAY,mBAAA;C3Dq/Lb;A2Dl/LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Do/LD;A2Dj/LD;EACE,kBAAA;C3Dm/LD;A2D3+LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D6+LH;A2D1+LD;EACE,mBAAA;C3D4+LD;A2D1+LD;EACE,mBAAA;EACA,YAAA;C3D4+LD;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;C3D2+LL;A2Dx+LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,4BAAA;C3D2+LL;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;C3D2+LL;A2Dv+LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3Dy+LH;A2Dx+LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,2BAAA;EACA,cAAA;C3D0+LL;A4DnmMD;EACE,mBAAA;C5DqmMD;A4DlmMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DomMD;A4DvmMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLw7LT;A4D9mMD;;EAcM,eAAA;C5DomML;A4D1kMC;EAAA;IvDiKA,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL69LP;E4DxmMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D2mML;E4DzmMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D4mML;E4D1mMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D6mML;CACF;A4DnpMD;;;EA6CI,eAAA;C5D2mMH;A4DxpMD;EAiDI,QAAA;C5D0mMH;A4D3pMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5DymMH;A4DjqMD;EA4DI,WAAA;C5DwmMH;A4DpqMD;EA+DI,YAAA;C5DwmMH;A4DvqMD;;EAmEI,QAAA;C5DwmMH;A4D3qMD;EAuEI,YAAA;C5DumMH;A4D9qMD;EA0EI,WAAA;C5DumMH;A4D/lMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DkmMD;A4D7lMC;EdlGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CksMH;A4DjmMC;EACE,WAAA;EACA,SAAA;EdvGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C2sMH;A4DnmMC;;EAEE,WAAA;EACA,eAAA;EACA,sBAAA;EtCtHF,aAAA;EAGA,0BAAA;CtB0tMD;A4DpoMD;;;;EAsCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DomMH;A4D9oMD;;EA8CI,UAAA;EACA,mBAAA;C5DomMH;A4DnpMD;;EAmDI,WAAA;EACA,oBAAA;C5DomMH;A4DxpMD;;EAwDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DomMH;A4D/lMG;EACE,iBAAA;C5DimML;A4D7lMG;EACE,iBAAA;C5D+lML;A4DrlMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DulMD;A4DhmMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D6kMH;A4D5mMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,0BAAA;C5D6kMH;A4DtkMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DwkMD;A4DvkMC;EACE,kBAAA;C5DykMH;A4DhiMD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DkkMH;E4D1kMD;;IAYI,mBAAA;G5DkkMH;E4D9kMD;;IAgBI,oBAAA;G5DkkMH;E4D7jMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5D+jMD;E4D3jMD;IACE,aAAA;G5D6jMD;CACF;A6D3zMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7Dy1MH;A6Dv1MC;;;;;;;;;;;;;;;EACE,YAAA;C7Du2MH;AiC/2MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D03MD;AiCj3MD;EACE,wBAAA;CjCm3MD;AiCj3MD;EACE,uBAAA;CjCm3MD;AiC32MD;EACE,yBAAA;CjC62MD;AiC32MD;EACE,0BAAA;CjC62MD;AiC32MD;EACE,mBAAA;CjC62MD;AiC32MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/Du4MD;AiCz2MD;EACE,yBAAA;CjC22MD;AiCp2MD;EACE,gBAAA;CjCs2MD;AgEv4MD;EACE,oBAAA;ChEy4MD;AgEn4MD;;;;ECdE,yBAAA;CjEu5MD;AgEl4MD;;;;;;;;;;;;EAYE,yBAAA;ChEo4MD;AgE73MD;EAAA;IChDE,0BAAA;GjEi7MC;EiEh7MD;IAAU,0BAAA;GjEm7MT;EiEl7MD;IAAU,8BAAA;GjEq7MT;EiEp7MD;;IACU,+BAAA;GjEu7MT;CACF;AgEv4MD;EAAA;IAFI,0BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,2BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,iCAAA;GhE64MD;CACF;AgEt4MD;EAAA;ICrEE,0BAAA;GjE+8MC;EiE98MD;IAAU,0BAAA;GjEi9MT;EiEh9MD;IAAU,8BAAA;GjEm9MT;EiEl9MD;;IACU,+BAAA;GjEq9MT;CACF;AgEh5MD;EAAA;IAFI,0BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,2BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,iCAAA;GhEs5MD;CACF;AgE/4MD;EAAA;IC1FE,0BAAA;GjE6+MC;EiE5+MD;IAAU,0BAAA;GjE++MT;EiE9+MD;IAAU,8BAAA;GjEi/MT;EiEh/MD;;IACU,+BAAA;GjEm/MT;CACF;AgEz5MD;EAAA;IAFI,0BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,2BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,iCAAA;GhE+5MD;CACF;AgEx5MD;EAAA;IC/GE,0BAAA;GjE2gNC;EiE1gND;IAAU,0BAAA;GjE6gNT;EiE5gND;IAAU,8BAAA;GjE+gNT;EiE9gND;;IACU,+BAAA;GjEihNT;CACF;AgEl6MD;EAAA;IAFI,0BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,2BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,iCAAA;GhEw6MD;CACF;AgEj6MD;EAAA;IC5HE,yBAAA;GjEiiNC;CACF;AgEj6MD;EAAA;ICjIE,yBAAA;GjEsiNC;CACF;AgEj6MD;EAAA;ICtIE,yBAAA;GjE2iNC;CACF;AgEj6MD;EAAA;IC3IE,yBAAA;GjEgjNC;CACF;AgE95MD;ECnJE,yBAAA;CjEojND;AgE35MD;EAAA;ICjKE,0BAAA;GjEgkNC;EiE/jND;IAAU,0BAAA;GjEkkNT;EiEjkND;IAAU,8BAAA;GjEokNT;EiEnkND;;IACU,+BAAA;GjEskNT;CACF;AgEz6MD;EACE,yBAAA;ChE26MD;AgEt6MD;EAAA;IAFI,0BAAA;GhE46MD;CACF;AgE16MD;EACE,yBAAA;ChE46MD;AgEv6MD;EAAA;IAFI,2BAAA;GhE66MD;CACF;AgE36MD;EACE,yBAAA;ChE66MD;AgEx6MD;EAAA;IAFI,iCAAA;GhE86MD;CACF;AgEv6MD;EAAA;ICpLE,yBAAA;GjE+lNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because