Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Take libmali.so directly from rockchip repo
This is lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so from https://github.com/rockchip-linux/libmali at revision b91d4b9. Previously I had built that package and then extracted the libary from libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb. The two binaries are not quite the same – the "compiled" one is 4096 bytes larger. ldconfig doesn't like the "compiled" one, complaining: ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated In particular this seems to prevent GCompris – the second Flatpak app I tried after LibreOffice – from starting. Comparing the two with diffoscope (see below), we see that the differences are: - Some sections are reordered - A .comment section is added - 4096 bytes of 'X' have appeared I believe from memory that the 'X's are added by Meson to leave space in the ELF file to modify the rpath without relinking the file. There are reports of glibc bugs that are triggered by rearranging ELF files: - https://sourceware.org/bugzilla/show_bug.cgi?id=23964 - https://github.com/NixOS/patchelf/issues/44 So, let's try just reusing the pristine object from Rockchip. https://phabricator.endlessm.com/T29068 --- tmp/usr/lib/mali/libmali.so.1.9.0 +++ /sysroot/home/wjt/src/rockchip-linux/libmali/lib/arm-linux-gnueabihf/libmali-midgard-t76x-r14p0-r0p0-x11.so ├── readelf --wide --file-header {} │ @@ -6,15 +6,15 @@ │ OS/ABI: UNIX - System V │ ABI Version: 0 │ Type: DYN (Shared object file) │ Machine: ARM │ Version: 0x1 │ Entry point address: 0xa0c10 │ Start of program headers: 52 (bytes into file) │ - Start of section headers: 18590608 (bytes into file) │ + Start of section headers: 18560696 (bytes into file) │ Flags: 0x5000402, Version5 EABI, hard-float ABI, <unknown> │ Size of this header: 52 (bytes) │ Size of program headers: 32 (bytes) │ Number of program headers: 8 │ Size of section headers: 40 (bytes) │ - Number of section headers: 29 │ - Section header string table index: 28 │ + Number of section headers: 30 │ + Section header string table index: 26 ├── readelf --wide --program-header {} │ @@ -3,15 +3,15 @@ │ Entry point 0xa0c10 │ There are 8 program headers, starting at offset 52 │ │ Program Headers: │ Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align │ LOAD 0x000000 0x00000000 0x00000000 0x1133d64 0x1133d64 R E 0x10000 │ GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10 │ - NOTE 0x000000 0x00000000 0x00000114 0x00000 0x00000 R 0x4 │ + NOTE 0x000114 0x00000114 0x00000114 0x00024 0x00024 R 0x4 │ EXIDX 0x11313a0 0x011313a0 0x011313a0 0x029c0 0x029c0 R 0x4 │ LOAD 0x1134000 0x01144000 0x01144000 0x7f550 0x8c574 RW 0x10000 │ TLS 0x1134000 0x01144000 0x01144000 0x00000 0x00004 R 0x4 │ DYNAMIC 0x11b4000 0x011d1000 0x011d1000 0x00160 0x00160 RW 0x4 │ LOAD 0x11b4000 0x011d1000 0x011d1000 0x06a54 0x06a54 RW 0x1000 │ │ Section to Segment mapping: ├── readelf --wide --sections {} │ @@ -1,38 +1,39 @@ │ -There are 29 section headers, starting at offset 0x11bab90: │ +There are 30 section headers, starting at offset 0x11b36b8: │ │ Section Headers: │ [Nr] Name Type Addr Off Size ES Flg Lk Inf Al │ [ 0] NULL 00000000 000000 000000 00 0 0 0 │ [ 1] .hash HASH 00000138 000138 0025c0 04 A 2 0 4 │ - [ 2] .dynsym DYNSYM 000026f8 0026f8 005670 10 A 26 3 4 │ + [ 2] .dynsym DYNSYM 000026f8 0026f8 005670 10 A 28 3 4 │ [ 3] .gnu.version VERSYM 0000e62c 00e62c 000ace 02 A 2 0 2 │ - [ 4] .gnu.version_d VERDEF 0000f0fc 00f0fc 000038 00 A 26 2 4 │ - [ 5] .gnu.version_r VERNEED 0000f134 00f134 0001b0 00 A 26 8 4 │ + [ 4] .gnu.version_d VERDEF 0000f0fc 00f0fc 000038 00 A 28 2 4 │ + [ 5] .gnu.version_r VERNEED 0000f134 00f134 0001b0 00 A 28 8 4 │ [ 6] .rel.dyn REL 0000f2e4 00f2e4 08fc78 08 A 2 0 4 │ - [ 7] .rel.plt REL 0009ef5c 09ef5c 000b38 08 AI 2 21 4 │ + [ 7] .rel.plt REL 0009ef5c 09ef5c 000b38 08 A 2 9 4 │ [ 8] .init PROGBITS 0009fa94 09fa94 00000c 00 AX 0 0 4 │ [ 9] .plt PROGBITS 0009faa0 09faa0 001170 04 AX 0 0 4 │ [10] .text PROGBITS 000a0c10 0a0c10 dfc268 00 AX 0 0 16 │ [11] .fini PROGBITS 00e9ce78 e9ce78 000008 00 AX 0 0 4 │ [12] .rodata PROGBITS 00e9ce80 e9ce80 28e10c 00 A 0 0 8 │ [13] .ARM.extab PROGBITS 0112af8c 112af8c 006414 00 A 0 0 4 │ [14] .ARM.exidx ARM_EXIDX 011313a0 11313a0 0029c0 00 AL 10 0 4 │ [15] .eh_frame PROGBITS 01133d60 1133d60 000004 00 A 0 0 4 │ [16] .tbss NOBITS 01144000 1134000 000004 00 WAT 0 0 4 │ - [17] .init_array INIT_ARRAY 01144000 1134000 000108 04 WA 0 0 4 │ - [18] .fini_array FINI_ARRAY 01144108 1134108 000008 04 WA 0 0 4 │ + [17] .init_array INIT_ARRAY 01144000 1134000 000108 00 WA 0 0 4 │ + [18] .fini_array FINI_ARRAY 01144108 1134108 000008 00 WA 0 0 4 │ [19] .jcr PROGBITS 01144110 1134110 000004 00 WA 0 0 4 │ [20] .data.rel.ro PROGBITS 01144118 1134118 05b248 00 WA 0 0 8 │ [21] .got PROGBITS 0119f4b8 118f4b8 0011d0 04 WA 0 0 4 │ [22] .data PROGBITS 011a0688 1190688 022ec8 00 WA 0 0 8 │ - [23] .bss NOBITS 011c3550 11b3550 00d024 00 WA 0 0 8 │ - [24] .ARM.attributes ARM_ATTRIBUTES 00000000 11baa54 000035 00 0 0 1 │ - [25] .dynamic DYNAMIC 011d1000 11b4000 000160 08 WA 26 0 4 │ - [26] .dynstr STRTAB 011d1160 11b4160 0068d0 00 A 0 0 4 │ - [27] .note.gnu.build-id NOTE 011d7a30 11baa30 000024 00 A 0 0 4 │ - [28] .shstrtab STRTAB 00000000 11baa89 000104 00 0 0 1 │ + [23] .comment PROGBITS 00000000 11b3550 000024 01 MS 0 0 1 │ + [24] .bss NOBITS 011c3550 11b3550 00d024 00 WA 0 0 8 │ + [25] .ARM.attributes ARM_ATTRIBUTES 00000000 11b3574 000035 00 0 0 1 │ + [26] .shstrtab STRTAB 00000000 11b35a9 00010d 00 0 0 1 │ + [27] .dynamic DYNAMIC 011d1000 11b4000 000160 08 WA 28 0 4 │ + [28] .dynstr STRTAB 011d1160 11b4160 0068d0 00 A 0 0 4 │ + [29] .note.gnu.build-id NOTE 011d7a30 11baa30 000024 00 A 0 0 4 │ Key to Flags: │ W (write), A (alloc), X (execute), M (merge), S (strings), I (info), │ L (link order), O (extra OS processing required), G (group), T (TLS), │ C (compressed), x (unknown), o (OS specific), E (exclude), │ y (purecode), p (processor specific) ├── readelf --wide --version-info {} │ @@ -345,20 +345,20 @@ │ 554: 0 (*local*) 3 (GLIBC_2.4) 1 (*global*) 1 (*global*) │ 558: 1 (*global*) 1 (*global*) 1 (*global*) 1 (*global*) │ 55c: 1 (*global*) 1 (*global*) 1 (*global*) 1 (*global*) │ 560: d (GLIBC_2.4) b (GLIBCXX_3.4.9) 1 (*global*) 3 (GLIBC_2.4) │ 564: 1 (*global*) 4 (GLIBCXX_3.4) 1 (*global*) │ │ Version definition section '.gnu.version_d' contains 2 entries: │ - Addr: 0x000000000000f0fc Offset: 0x00f0fc Link: 26 (.dynstr) │ + Addr: 0x000000000000f0fc Offset: 0x00f0fc Link: 28 (.dynstr) │ 000000: Rev: 1 Flags: BASE Index: 1 Cnt: 1 Name: libmali.so │ 0x001c: Rev: 1 Flags: none Index: 2 Cnt: 1 Name: LIBMALI_1.0 │ │ Version needs section '.gnu.version_r' contains 8 entries: │ - Addr: 0x000000000000f134 Offset: 0x00f134 Link: 26 (.dynstr) │ + Addr: 0x000000000000f134 Offset: 0x00f134 Link: 28 (.dynstr) │ 000000: Version: 1 File: ld-linux-armhf.so.3 Cnt: 1 │ 0x0010: Name: GLIBC_2.4 Flags: none Version: 20 │ 0x0020: Version: 1 File: librt.so.1 Cnt: 1 │ 0x0030: Name: GLIBC_2.4 Flags: none Version: 16 │ 0x0040: Version: 1 File: libdl.so.2 Cnt: 1 │ 0x0050: Name: GLIBC_2.4 Flags: none Version: 13 │ 0x0060: Version: 1 File: libpthread.so.0 Cnt: 1 ├── strings --all {} │ @@ -1,7 +1,9 @@ │ +XXXX │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX │ "3F2t(FO │ KpG- │ #9hc │ F8hL │ H{DyDxD │ E!F*F,D │ E F*F,D │ @@ -217401,21 +217403,52 @@ │ d ,: │ e ,: │ f ,: │ g ,: │ h ,: │ i ,: │ j ,: │ +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` │ INFO │ WARN │ ERROR │ FAIL │ g++ (Ubuntu 4.9.3-13ubuntu2) 4.9.3 │ profile=tx011-release gpu=t76x hwver=r0p0 kernel_modules=0 progs_install=bin libs_install=bin floatabi=hard winsys=fbdev os=linux toolchain_prefix_target=/home/lihuang/project/linux_mali/midgard/driver/product/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- winsys_dma_buf=1 simd=1 symbols=0 wayland_server=0 ump=0 cl=1 opencl_platform_config=config_t6xx winsys=gbm allocator=drm_dumb winsys=x11,gbm cl=1 │ a79caef8f5df9db3a4dcede1f163d679bd864dff │ +GCC: (Linaro GCC 4.9-2017.01) 4.9.4 │ +aeabi │ +.shstrtab │ +.note.gnu.build-id │ +.hash │ +.dynsym │ +.dynstr │ +.gnu.version │ +.gnu.version_d │ +.gnu.version_r │ +.rel.dyn │ +.rel.plt │ +.init │ +.text │ +.fini │ +.rodata │ +.ARM.extab │ +.ARM.exidx │ +.eh_frame │ +.tbss │ +.init_array │ +.fini_array │ +.jcr │ +.data.rel.ro │ +.dynamic │ +.got │ +.data │ +.bss │ +.comment │ +.ARM.attributes │ __gmon_start__ │ _fini │ _ITM_deregisterTMCloneTable │ _ITM_registerTMCloneTable │ __cxa_finalize │ _Jv_RegisterClasses │ getpid │ @@ -218779,35 +218812,7 @@ │ GLIBCXX_3.4.15 │ CXXABI_1.3 │ GLIBCXX_3.4.20 │ GLIBCXX_3.4 │ GLIBC_2.7 │ GLIBC_2.15 │ libmali.so.1 │ -aeabi │ -.shstrtab │ -.hash │ -.dynsym │ -.gnu.version │ -.gnu.version_d │ -.gnu.version_r │ -.rel.dyn │ -.rel.plt │ -.init │ -.text │ -.fini │ -.rodata │ -.ARM.extab │ -.ARM.exidx │ -.eh_frame │ -.tbss │ -.init_array │ -.fini_array │ -.jcr │ -.data.rel.ro │ -.got │ -.data │ -.bss │ -.ARM.attributes │ -.dynamic │ -.dynstr │ -.note.gnu.build-id ├── readelf --wide --decompress --hex-dump=.plt {} │ @@ -1,9 +1,10 @@ │ │ Hex dump of section '.plt': │ + NOTE: This section has relocations against it, but these have NOT been applied to this dump. │ 0x0009faa0 04e02de5 04e09fe5 0ee08fe0 08f0bee5 ..-............. │ 0x0009fab0 08fa0f01 10c68fe2 ffca8ce2 08fabce5 ................ │ 0x0009fac0 10c68fe2 ffca8ce2 00fabce5 10c68fe2 ................ │ 0x0009fad0 ffca8ce2 f8f9bce5 10c68fe2 ffca8ce2 ................ │ 0x0009fae0 f0f9bce5 10c68fe2 ffca8ce2 e8f9bce5 ................ │ 0x0009faf0 10c68fe2 ffca8ce2 e0f9bce5 10c68fe2 ................ │ 0x0009fb00 ffca8ce2 d8f9bce5 10c68fe2 ffca8ce2 ................ ├── readelf --wide --decompress --hex-dump=.got {} │ @@ -1,10 +1,9 @@ │ │ Hex dump of section '.got': │ - NOTE: This section has relocations against it, but these have NOT been applied to this dump. │ 0x0119f4b8 60f31901 00000000 00000000 a0fa0900 `............... │ 0x0119f4c8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ │ 0x0119f4d8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ │ 0x0119f4e8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ │ 0x0119f4f8 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ │ 0x0119f508 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ │ 0x0119f518 a0fa0900 a0fa0900 a0fa0900 a0fa0900 ................ ├── readelf --wide --decompress --hex-dump=.shstrtab {} │ @@ -1,20 +1,20 @@ │ │ Hex dump of section '.shstrtab': │ - 0x00000000 002e7368 73747274 6162002e 68617368 ..shstrtab..hash │ - 0x00000010 002e6479 6e73796d 002e676e 752e7665 ..dynsym..gnu.ve │ - 0x00000020 7273696f 6e002e67 6e752e76 65727369 rsion..gnu.versi │ - 0x00000030 6f6e5f64 002e676e 752e7665 7273696f on_d..gnu.versio │ - 0x00000040 6e5f7200 2e72656c 2e64796e 002e7265 n_r..rel.dyn..re │ - 0x00000050 6c2e706c 74002e69 6e697400 2e746578 l.plt..init..tex │ - 0x00000060 74002e66 696e6900 2e726f64 61746100 t..fini..rodata. │ - 0x00000070 2e41524d 2e657874 6162002e 41524d2e .ARM.extab..ARM. │ - 0x00000080 65786964 78002e65 685f6672 616d6500 exidx..eh_frame. │ - 0x00000090 2e746273 73002e69 6e69745f 61727261 .tbss..init_arra │ - 0x000000a0 79002e66 696e695f 61727261 79002e6a y..fini_array..j │ - 0x000000b0 6372002e 64617461 2e72656c 2e726f00 cr..data.rel.ro. │ - 0x000000c0 2e676f74 002e6461 7461002e 62737300 .got..data..bss. │ - 0x000000d0 2e41524d 2e617474 72696275 74657300 .ARM.attributes. │ - 0x000000e0 2e64796e 616d6963 002e6479 6e737472 .dynamic..dynstr │ - 0x000000f0 002e6e6f 74652e67 6e752e62 75696c64 ..note.gnu.build │ - 0x00000100 2d696400 -id. │ + 0x00000000 002e7368 73747274 6162002e 6e6f7465 ..shstrtab..note │ + 0x00000010 2e676e75 2e627569 6c642d69 64002e68 .gnu.build-id..h │ + 0x00000020 61736800 2e64796e 73796d00 2e64796e ash..dynsym..dyn │ + 0x00000030 73747200 2e676e75 2e766572 73696f6e str..gnu.version │ + 0x00000040 002e676e 752e7665 7273696f 6e5f6400 ..gnu.version_d. │ + 0x00000050 2e676e75 2e766572 73696f6e 5f72002e .gnu.version_r.. │ + 0x00000060 72656c2e 64796e00 2e72656c 2e706c74 rel.dyn..rel.plt │ + 0x00000070 002e696e 6974002e 74657874 002e6669 ..init..text..fi │ + 0x00000080 6e69002e 726f6461 7461002e 41524d2e ni..rodata..ARM. │ + 0x00000090 65787461 62002e41 524d2e65 78696478 extab..ARM.exidx │ + 0x000000a0 002e6568 5f667261 6d65002e 74627373 ..eh_frame..tbss │ + 0x000000b0 002e696e 69745f61 72726179 002e6669 ..init_array..fi │ + 0x000000c0 6e695f61 72726179 002e6a63 72002e64 ni_array..jcr..d │ + 0x000000d0 6174612e 72656c2e 726f002e 64796e61 ata.rel.ro..dyna │ + 0x000000e0 6d696300 2e676f74 002e6461 7461002e mic..got..data.. │ + 0x000000f0 62737300 2e636f6d 6d656e74 002e4152 bss..comment..AR │ + 0x00000100 4d2e6174 74726962 75746573 00 M.attributes. Previously I had copied the libmali.so.1[.9.0] from the result of building commit 1fb6b47b287252f16bf06dc7bd87611c378de0cf Author: Will Thompson <wjt@endlessm.com> Date: Wed Sep 2 10:08:30 2020 +0100 Update to newer Mali I obtained these files as follows: - Built https://github.com/rockchip-linux/libmali @ b91d4b9 - Unpacked libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb - Copied the files into here In the previous version, all libraries were symlinks to libMali.so (capital M): wjt@jerry:~$ ls -l /usr/lib/mali-t76x/arm-linux-gnueabihf/ total 18132 drwxr-xr-x 2 root root 4096 Jan 1 1970 flatpak lrwxrwxrwx 25 root root 10 Sep 25 2019 libEGL.so.1 -> libMali.so lrwxrwxrwx 25 root root 10 Sep 25 2019 libEGL.so.1.0.0 -> libMali.so lrwxrwxrwx 25 root root 10 Sep 25 2019 libgbm.so.1 -> libMali.so lrwxrwxrwx 25 root root 10 Sep 25 2019 libgbm.so.1.0.0 -> libMali.so lrwxrwxrwx 25 root root 10 Sep 25 2019 libGLESv2.so.2 -> libMali.so lrwxrwxrwx 25 root root 10 Sep 25 2019 libGLESv2.so.2.0.0 -> libMali.so -rw-r--r-- 5 root root 18561828 Jan 1 1970 libMali.so In this version, all these libraries actually exist, as very small libraries which in turn link to libmali.so (lowercase m): wjt@jerry:~$ ls -l tmp/usr/lib/mali/ total 18220 lrwxrwxrwx 1 wjt wjt 11 Jul 29 04:35 libEGL.so -> libEGL.so.1 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libEGL.so.1 lrwxrwxrwx 1 wjt wjt 11 Jul 29 04:35 libgbm.so -> libgbm.so.1 -rw-r--r-- 1 wjt wjt 5452 Jul 29 04:35 libgbm.so.1 lrwxrwxrwx 1 wjt wjt 17 Jul 29 04:35 libGLESv1_CM.so -> libGLESv1_CM.so.1 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libGLESv1_CM.so.1 lrwxrwxrwx 1 wjt wjt 14 Jul 29 04:35 libGLESv2.so -> libGLESv2.so.2 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libGLESv2.so.2 lrwxrwxrwx 1 wjt wjt 10 Jul 29 04:35 libmali-midgard-t76x-r14p0-r0p0-x11.so -> libmali.so lrwxrwxrwx 1 wjt wjt 18 Jul 29 04:35 libMaliOpenCL.so -> libMaliOpenCL.so.1 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libMaliOpenCL.so.1 lrwxrwxrwx 1 wjt wjt 12 Jul 29 04:35 libmali.so -> libmali.so.1 lrwxrwxrwx 1 wjt wjt 12 Jul 29 04:35 libMali.so -> libMali.so.1 lrwxrwxrwx 1 wjt wjt 16 Jul 29 04:35 libmali.so.1 -> libmali.so.1.9.0 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libMali.so.1 -rw-r--r-- 1 wjt wjt 18591768 Jul 29 04:35 libmali.so.1.9.0 lrwxrwxrwx 1 wjt wjt 14 Jul 29 04:35 libOpenCL.so -> libOpenCL.so.1 -rw-r--r-- 1 wjt wjt 5372 Jul 29 04:35 libOpenCL.so.1 drwxr-xr-x 2 wjt wjt 4096 Jul 29 04:35 pkgconfig For example: wjt@jerry:~$ ldd tmp/usr/lib/mali/libgbm.so linux-vdso.so.1 (0xbef7d000) libmali.so.1 => not found libdrm.so.2 => /lib/arm-linux-gnueabihf/libdrm.so.2 (0xb6f01000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e07000) /lib/ld-linux-armhf.so.3 (0xb6f42000) libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6d8c000) Crucially this libgbm includes a (stub) implementation of gbm_surface_create_with_modifiers() which Mutter requires but the old libMali.so did not implement. We have to install a libmali.so.1 symlink into /usr/lib/arm-linux-gnueabihf because executables which link against libEGL now transitively link against this. I renamed libmali.so.1.9.0 (as built by Rockchip's package) to libmali.so.1 to simplify this. I'm sure I have not done this the Correct Way. With this patch GDM and my user session come up. However, ldconfig complains: ldconfig: file /lib/arm-linux-gnueabihf/libmali.so.1 is truncated and a similar message when launching Flatpaks. gnome-session-binary, mutter, etc. seem to come up fine so I don't know what the deal is here. https://phabricator.endlessm.com/T29068 diff --git a/debian/changelog b/debian/changelog index a00526d..76e20df 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +mali-t76x-drivers-x11 (14.0.0.0-2) eos3.6; urgency=medium + + * Update from + libmali-midgard-t76x-r14p0-r0p0-x11-arm_1.9-1_armhf.deb + + -- Will Thompson <wjt@endlessm.com> Wed, 02 Sep 2020 10:13:29 +0100 + mali-t76x-drivers-x11 (14.0.0.0-1) master; urgency=medium * Initial packaging from diff --git a/debian/mali-t76x-corelibs.links b/debian/mali-t76x-corelibs.links index e68a2f4..06c2cae 100644 --- a/debian/mali-t76x-corelibs.links +++ b/debian/mali-t76x-corelibs.links @@ -1,13 +1,9 @@ -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1 -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0 -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1 -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0 -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2 -usr/lib/mali-t76x/arm-linux-gnueabihf/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2 -usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/libEGL.so.1.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/libgbm.so.1.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2 usr/lib/mali-t76x/arm-linux-gnueabihf/libGLESv2.so.2.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libEGL.so.1.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libgbm.so.1.0.0 +usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/libGLESv2.so.2.0.0 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/lib +usr/lib/mali-t76x/arm-linux-gnueabihf/libmali.so.1 usr/lib/arm-linux-gnueabihf/libmali.so.1 + diff --git a/debian/mali-t76x-drivers-rk3288.install b/debian/mali-t76x-drivers-rk3288.install index a7cdbe4..1bcb435 100644 --- a/debian/mali-t76x-drivers-rk3288.install +++ b/debian/mali-t76x-drivers-rk3288.install @@ -1,2 +1,10 @@ -drivers/rk3288/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/ -drivers/rk3288/libMali.so usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ +drivers/rk3288/libEGL.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/ +drivers/rk3288/libEGL.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ +drivers/rk3288/libgbm.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/ +drivers/rk3288/libgbm.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ +drivers/rk3288/libGLESv2.so.2 usr/lib/mali-t76x/arm-linux-gnueabihf/ +drivers/rk3288/libGLESv2.so.2 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ +drivers/rk3288/libMali.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/ +drivers/rk3288/libMali.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ +drivers/rk3288/libmali.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/ +drivers/rk3288/libmali.so.1 usr/lib/mali-t76x/arm-linux-gnueabihf/flatpak/ diff --git a/debian/rules b/debian/rules index 2d33f6a..32496f3 100755 --- a/debian/rules +++ b/debian/rules @@ -2,3 +2,7 @@ %: dh $@ + +# Libraries all link to each other, so need to tell dpkg-shlibdeps where they live +override_dh_shlibdeps: + dh_shlibdeps -l/usr/lib/mali-t76x/arm-linux-gnueabihf diff --git a/drivers/rk3288/libEGL.so.1 b/drivers/rk3288/libEGL.so.1 new file mode 100644 index 0000000..444c9b7 Binary files /dev/null and b/drivers/rk3288/libEGL.so.1 differ diff --git a/drivers/rk3288/libGLESv2.so.2 b/drivers/rk3288/libGLESv2.so.2 new file mode 100644 index 0000000..af96aa5 Binary files /dev/null and b/drivers/rk3288/libGLESv2.so.2 differ diff --git a/drivers/rk3288/libMali.so.1 b/drivers/rk3288/libMali.so.1 new file mode 100644 index 0000000..ed98243 Binary files /dev/null and b/drivers/rk3288/libMali.so.1 differ diff --git a/drivers/rk3288/libgbm.so.1 b/drivers/rk3288/libgbm.so.1 new file mode 100644 index 0000000..0bfa4c2 Binary files /dev/null and b/drivers/rk3288/libgbm.so.1 differ diff --git a/drivers/rk3288/libMali.so b/drivers/rk3288/libmali.so.1 similarity index 77% rename from drivers/rk3288/libMali.so rename to drivers/rk3288/libmali.so.1 index 83c1c75..c9344b6 100644 Binary files a/drivers/rk3288/libMali.so and b/drivers/rk3288/libmali.so.1 differ
- Loading branch information