From d7ce4d65aa9381840dbdf56c2d1cd245dc652b3d Mon Sep 17 00:00:00 2001 From: cfig Date: Sun, 17 Apr 2016 18:30:14 +0800 Subject: [PATCH] clean up and refine README --- README.md | 45 ++++++++-- boot.mk | 93 -------------------- bouncycastle/Android.mk | 143 ------------------------------- security/Android.mk | 12 --- src/libmincrypt/tools/Android.mk | 22 ----- src/main/resources/mkbootfs | Bin 31456 -> 0 bytes src/main/resources/mkbootimg | Bin 30808 -> 0 bytes 7 files changed, 38 insertions(+), 277 deletions(-) delete mode 100644 boot.mk delete mode 100644 bouncycastle/Android.mk delete mode 100644 security/Android.mk delete mode 100644 src/libmincrypt/tools/Android.mk delete mode 100755 src/main/resources/mkbootfs delete mode 100755 src/main/resources/mkbootimg diff --git a/README.md b/README.md index 9abba3e..71a9edc 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,46 @@ # Nexus_boot_image_editor -edit boot.img for Nexus Devices - [![Build Status](https://travis-ci.org/cfig/Nexus_boot_image_editor.svg?branch=master)](https://travis-ci.org/cfig/Nexus_boot_image_editor) +Utilies for editing Nexus(or Nexus compatible) devices boot.img , then you don't need full Android source code to edit your boot images. + +## Prerequisite +#### Host OS requirement: + +The unpacking task only works on Linux, the packing task can work on Linux & OSX. +So the recommended OS is Linux. + +#### Target Android requirement: + +(1) Targeted boot.img MUST follows AOSP [verified boot flow](https://source.android.com/security/verifiedboot/index.html), which means it packs linux kernel and rootfs together, then sign it with OEM/USER keys. + +(2) These utilities are known to work for Nexus (or Nexus compatible) boot.img for the following Android releases: + + - Marshmallow (API Level 23) + - Lollipop (API Level 21,22) + +You can get a full [Android version list](https://source.android.com/source/build-numbers.html) here. + +## Usage +First put your boot.img at **$(CURDIR)/boot.img**, then start gradle 'unpack' task: + + cp boot.img + ./gradew unpack + +Your get the flattened kernel and /root filesystem under **$(CURDIR)/build/unzip\_boot**: + + build/unzip_boot/ + ├── bootimg.cfg + ├── kernel + └── root -## [usage] -TBD +Then you can edit the actual file contents, like rootfs or kernel. +Now, pack the boot.img again + ./gradew pack -## test -filename: src/test/resources/boot.img +You get the repacked boot.img at $(CURDIR): -extracted from Nexus 5x(code: bullhead) factory images from [Google](https://dl.google.com/dl/android/aosp/bullhead-mda89e-factory-29247942.tgz) + boot.img.signed +## example & test +An example boot.img has been placed at **src/test/resources/boot.img**, which is extracted from Nexus 5x(code: bullhead) factory images from [Google](https://dl.google.com/dl/android/aosp/bullhead-mda89e-factory-29247942.tgz), you can take it as a quick start. diff --git a/boot.mk b/boot.mk deleted file mode 100644 index 4137f8a..0000000 --- a/boot.mk +++ /dev/null @@ -1,93 +0,0 @@ -.DEFAULT_GOAL := flat - -SHELL := /bin/bash -WORK_DIR := unzip_boot - -help: - @echo "flat : boot.subimg -> unzip_boot/*" - @echo "boot.img : unsigned boot image" - @echo "boot.subimg : signed boot image" - @echo "addon : (recovery only) add additional tools" - -.PHONY: flat -flat: - rm -fr $(WORK_DIR) - mkdir -p $(WORK_DIR)/root - abootimg -x boot.subimg $(WORK_DIR)/bootimg.cfg $(this_kernel) $(this_ramdisk).gz - gzip -c -d $(this_ramdisk).gz > $(this_ramdisk) - rm $(this_ramdisk).gz - cd $(WORK_DIR)/root && \ - cpio -i -F ../ramdisk.img - @rm $(WORK_DIR)/ramdisk.img - @echo && echo "===================================" && file $(WORK_DIR)/* && echo "===================================" -kernel_cmdline := "$(shell grep -Po '(?<=cmdline = ).*' $(WORK_DIR)/bootimg.cfg)" -this_root := $(WORK_DIR)/root -this_kernel := $(WORK_DIR)/kernel -this_ramdisk := $(WORK_DIR)/ramdisk.img -ifeq '$(TARGET_PRODUCT)' '' -$(warning NON-android) -this_verity_key := tools/security/verity -else -$(warning android) -this_verity_key := build/target/product/security/verity -endif - -.INTERMEDIATE: $(this_ramdisk).gz boot.img -$(this_ramdisk).gz: $(this_root) - mkbootfs $< | gzip > $@ -boot.img: $(this_ramdisk).gz $(this_kernel) - mkbootimg \ - --kernel $(this_kernel) \ - --ramdisk $(this_ramdisk).gz \ - --cmdline "$(shell echo $(kernel_cmdline))" \ - --base 0x01000000 \ - --output $@ -boot.subimg: boot.img - $(call signer,/boot,$<,$@) - -define signer - boot_signer $(1) $(2) $(this_verity_key).pk8 $(this_verity_key).x509.pem $(3) -endef - -mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) -real_mkfile_path := $(shell readlink $(mkfile_path)) - -libs := libc.so libcrypto.so libcutils.so libm.so libselinux.so libstdc++.so libpcre.so liblog.so libnetutils.so libsysutils.so libutils.so libbacktrace.so libstlport.so libgccdemangle.so libunwind.so libunwind-ptrace.so -bins := toolbox sh linker netcfg logd logcat -addon: | unzip_boot/root/system/bin -addon: | unzip_boot/root/system/lib -addon: INITRC := unzip_boot/root/init.recovery.marvellberlin.rc -addon: - #initrc - echo "service console /system/bin/sh" > $(INITRC) - echo " console" >> $(INITRC) - echo " user root" >> $(INITRC) - echo " group root" >> $(INITRC) - echo >> $(INITRC) - echo "service logd /system/bin/logd" >> $(INITRC) - echo " socket logd stream 0666 logd logd" >> $(INITRC) - echo " socket logdr seqpacket 0666 logd logd" >> $(INITRC) - echo " socket logdw dgram 0222 logd logd" >> $(INITRC) - echo " seclabel u:r:logd:s0" >> $(INITRC) - #recovery - #cp out/target/product/$(TARGET_PRODUCT)/system/bin/recovery unzip_boot/root/sbin/ - #@cp -v out/target/product/$(TARGET_PRODUCT)/obj/EXECUTABLES/recovery_intermediates/recovery unzip_boot/root/sbin/ - #bin - @$(foreach item,$(bins), \ - cp -v out/target/product/$(TARGET_PRODUCT)/system/bin/$(item) unzip_boot/root/system/bin/; $(newline)) - #lib - @$(foreach item,$(libs), \ - cp -v out/target/product/$(TARGET_PRODUCT)/system/lib/$(item) unzip_boot/root/system/lib/; $(newline)) - #@cp -v out/target/product/$(TARGET_PRODUCT)/system/etc/sepolicy.recovery unzip_boot/root/sepolicy - @cp -v out/target/product/$(TARGET_PRODUCT)/obj/ETC/sepolicy.recovery_intermediates/sepolicy.recovery unzip_boot/root/sepolicy - - -unzip_boot/root/system/bin: - mkdir $@ -unzip_boot/root/system/lib: - mkdir $@ - -#service console /system/bin/sh -# console -# user root -# group root diff --git a/bouncycastle/Android.mk b/bouncycastle/Android.mk deleted file mode 100644 index 86cd8d6..0000000 --- a/bouncycastle/Android.mk +++ /dev/null @@ -1,143 +0,0 @@ -# -# Copyright (C) 2010 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -LOCAL_PATH := $(call my-dir) - -# used for bouncycastle-hostdex where we want everything for testing -all_bcprov_src_files := $(call all-java-files-under,bcprov/src/main/java) - -# used for bouncycastle for target where we want to be sure to use OpenSSLDigest -android_bcprov_src_files := $(filter-out \ - bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java, \ - $(all_bcprov_src_files)) - -# used for bouncycastle-host where we can't use OpenSSLDigest -ri_bcprov_src_files := $(filter-out \ - bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java \ - bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java, \ - $(all_bcprov_src_files)) - -# These cannot build in the PDK, because the PDK requires all libraries -# compile against SDK versions. LOCAL_NO_STANDARD_LIBRARIES conflicts with -# this requirement. -ifneq ($(TARGET_BUILD_PDK),true) - - include $(CLEAR_VARS) - LOCAL_MODULE := bouncycastle - LOCAL_MODULE_TAGS := optional - LOCAL_SRC_FILES := $(android_bcprov_src_files) - LOCAL_JAVACFLAGS := -encoding UTF-8 - LOCAL_JAVA_LIBRARIES := core-libart conscrypt - LOCAL_NO_STANDARD_LIBRARIES := true - LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt - LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - include $(BUILD_JAVA_LIBRARY) - - # non-jarjar version to build okhttp-tests - include $(CLEAR_VARS) - LOCAL_MODULE := bouncycastle-nojarjar - LOCAL_MODULE_TAGS := optional - LOCAL_SRC_FILES := $(android_bcprov_src_files) - LOCAL_JAVACFLAGS := -encoding UTF-8 - LOCAL_JAVA_LIBRARIES := core-libart conscrypt - LOCAL_NO_STANDARD_LIBRARIES := true - LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - include $(BUILD_STATIC_JAVA_LIBRARY) - - # unbundled bouncycastle jar - include $(CLEAR_VARS) - LOCAL_MODULE := bouncycastle-unbundled - LOCAL_MODULE_TAGS := optional - LOCAL_SDK_VERSION := 9 - LOCAL_SRC_FILES := $(ri_bcprov_src_files) - LOCAL_JAVACFLAGS := -encoding UTF-8 - LOCAL_MODULE_TAGS := optional - LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - include $(BUILD_STATIC_JAVA_LIBRARY) -endif # TARGET_BUILD_PDK != true - -# This is used to generate a list of what is unused so it can be removed when bouncycastle is updated. -# Based on "Finding dead code" example in ProGuard manual at http://proguard.sourceforge.net/ -.PHONY: bouncycastle-proguard-deadcode -bouncycastle-proguard-deadcode: $(full_classes_compiled_jar) $(full_java_libs) - $(PROGUARD) \ - -injars $(full_classes_compiled_jar) \ - -libraryjars "$(call normalize-path-list,$(addsuffix (!org/bouncycastle/**.class,!com/android/org/conscrypt/OpenSSLMessageDigest.class),$(full_java_libs)))" \ - -dontoptimize \ - -dontobfuscate \ - -dontpreverify \ - -ignorewarnings \ - -printusage \ - -keep class org.bouncycastle.jce.provider.BouncyCastleProvider "{ public protected *; }" \ - -keep class org.bouncycastle.jce.provider.symmetric.AESMappings "{ public protected *; }" \ - -keep class org.bouncycastle.asn1.ASN1TaggedObject "{ public protected *; }" \ - -keep class org.bouncycastle.asn1.x509.CertificateList "{ public protected *; }" \ - -keep class org.bouncycastle.crypto.AsymmetricBlockCipher "{ public protected *; }" \ - -keep class org.bouncycastle.x509.ExtendedPKIXBuilderParameters "{ public protected *; }" \ - `(find $(LOCAL_PATH) -name '*.java' | xargs grep '"org.bouncycastle' | egrep ' (put|add)' | sed -e 's/");//' -e 's/.*"//'; \ - find $(LOCAL_PATH) -name '*.java' | xargs grep ' addHMACAlgorithm' | sed 's/"org.bouncycastle/\norg.bouncycastle/g' | grep ^org.bouncycastle | sed 's/".*//'; \ - find . -name '*.java' | xargs grep 'import org.bouncycastle' | grep -v /bouncycastle/ | sed -e 's/.*:import //' -e 's/;//') \ - | sed -e 's/^/-keep class /' -e 's/$$/ { public protected \*; } /' | sort | uniq` \ - -keepclassmembers "class * { \ - static final % *; \ - static final java.lang.String *; \ - }" \ - -keepclassmembers "class * implements java.io.Serializable { \ - private static final java.io.ObjectStreamField[] serialPersistentFields; \ - private void writeObject(java.io.ObjectOutputStream); \ - private void readObject(java.io.ObjectInputStream); \ - java.lang.Object writeReplace(); \ - java.lang.Object readResolve(); \ - }" \ - -keepclassmembers "interface org.bouncycastle.crypto.paddings.BlockCipherPadding { \ - abstract public java.lang.String getPaddingName(); \ - }" \ - -keepclassmembers "class * implements org.bouncycastle.crypto.paddings.BlockCipherPadding { \ - public java.lang.String getPaddingName(); \ - }" - -# Conscrypt isn't built in the PDK, so this cannot be built because it has a -# dependency on conscrypt-hostdex. -ifneq ($(TARGET_BUILD_PDK),true) - include $(CLEAR_VARS) - LOCAL_MODULE := bouncycastle-hostdex - LOCAL_MODULE_TAGS := optional - LOCAL_SRC_FILES := $(all_bcprov_src_files) - LOCAL_JAVACFLAGS := -encoding UTF-8 - LOCAL_MODULE_TAGS := optional - LOCAL_JAVA_LIBRARIES := conscrypt-hostdex - LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt - LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk - include $(BUILD_HOST_DALVIK_JAVA_LIBRARY) -endif - -include $(CLEAR_VARS) -LOCAL_MODULE := bouncycastle-host -LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(ri_bcprov_src_files) -LOCAL_JAVACFLAGS := -encoding UTF-8 -LOCAL_MODULE_TAGS := optional -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk -include $(BUILD_HOST_JAVA_LIBRARY) - -include $(CLEAR_VARS) -LOCAL_MODULE := bouncycastle-bcpkix-host -LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-java-files-under,bcpkix/src/main/java) -LOCAL_JAVACFLAGS := -encoding UTF-8 -LOCAL_MODULE_TAGS := optional -LOCAL_JAVA_LIBRARIES := bouncycastle-host -LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk -include $(BUILD_HOST_JAVA_LIBRARY) diff --git a/security/Android.mk b/security/Android.mk deleted file mode 100644 index 5a40397..0000000 --- a/security/Android.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -####################################### -# verity_key -include $(CLEAR_VARS) - -LOCAL_MODULE := verity_key -LOCAL_SRC_FILES := $(LOCAL_MODULE) -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) - -include $(BUILD_PREBUILT) diff --git a/src/libmincrypt/tools/Android.mk b/src/libmincrypt/tools/Android.mk deleted file mode 100644 index 3154914..0000000 --- a/src/libmincrypt/tools/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2008 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := dumpkey -LOCAL_SRC_FILES := DumpPublicKey.java -LOCAL_JAR_MANIFEST := DumpPublicKey.mf -LOCAL_STATIC_JAVA_LIBRARIES := bouncycastle-host -include $(BUILD_HOST_JAVA_LIBRARY) diff --git a/src/main/resources/mkbootfs b/src/main/resources/mkbootfs deleted file mode 100755 index 61299193afdc64e759afbd6a2527029dac24554c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31456 zcmeHwdwf*Ywf{buIg`n2CLufm1Q=i-L16MAU{KHuBrpjRj1VMPV8~+vZOheGxvf{J7j;s!Ahv)na=&Yzy=M-GOz-dB z-{<~5zdyS3nOSRn_gZ_e{od!CeI~b7c~_(;3X{Rau3{wZ8>1l=B4S^+U_dHZIZMO$ z99GCIkj)&^;wv~VlT_MW3p?`jzZ=#FyJYopT-1xCvV27y?M;iyiaJ{6ceHm!dgk|(FPguo z%oPf_N_n}d`l!xVu3pDolJ%GeiF_W54<$|UyJL6%dTe9+a>s4oDILGL{_C4&JpNZi zjT$IT(KRoMpPB?O0G@M^rY5+O=vO4cS0=%)0q(%Z7&ZeKE#GaxNAtfY34Uu5{C40D ze2n1{0HdYU+bGUNmJjHdrDN${6}&%nnR{s>^Sbj|~J7?mMsDx>R~f`2;+{{1BQkCNceB*C9cf*(wR z|4S15cS-PffoHQ1M)E2y?nEC8yuyI{p*DtPvT`whORGO8Nhiql?d;L%Qd7`SI2aCe zu$A8GWy^h~u2R=RhAFR^X1GOcduw;Fy(`?xLgAJ`B+Pt1it~lSjlr<5v$4Gk5y9rI zK^F8kc60=qq0rVD=n@J(GV=$6%-7!49wyZee;4z$LLwm?*v8E}yP2=LzSaj-e_MMf z><`x0F7F6*`Rf~-I{aLvd#9!{szRXK-__C{WWrUSueqm@GHL8+ztPVqc2OCXsXM$C zZnjX#ikYuwyKjxiZh1#zDC7@OAzF|Sw28xfzm0u96bPc&)z|pCBjIL_qm0ero!x$4 zlaER)D{cXkb%jdmK@EkGPAj+aQGGOT^EGeX=4)+iPgFJ(+Wg@VQbcvMM7mk4@U~g2 z&DI^k_OPEdcLYLy)~R7!pyIX${eI@}LB+Oe3aueubD*oWy^VGHJDX8u(zTK@=JU5S zh8vMlQz)dh4xp|U-qewBdq)Vh!iBkW1=p$d0MuJsGg_Ra66U;SP4&v^)kQ9swk}>F z0jQz42(+9R<1-nbarlVs1h|VsDnwdi9;4=-MB7A6_%*RK?ht|OVP7qrGzJBZN? zQ}DThW`H^buU|);0-Fd*Yk46)69h(NuHeZx;>ic{XYY_hVdjc7!lBc}wmx7j_g{Mby z&sFrT^&z6Wrqeg50YB~FFxzXu>qMuqR%r2ZzbEA(p-*)p`vYkX>Tv4AGCZZjWm**X zfDV^^f$)7gocg&8kLqy!zG}Y?mwkzBjtiW8k$YsqV>(=)&S@Pk#~$gQ*WuK*@o=@q zQTjBVWU%UR>aQ|n>u@|*%2L1 zYlRF)bvUgbG91(4`g!xX4wvfy*~D}>tr0Su*5R~X$Z%eV%Q=VQJiYH(WBnKru?VJt z*kX(&PwzqNfsutbVp$oPbrZe^5k_W_yp>FbkB=bC3X)7!H++=KH;_z2Yj}vuO(fIQ zGQ6M5*ON>`cz7R|*N{wAIXuYa8j`824)5afGLmUn4tI0;3X*B+8Q#L>Qj%$?4cBq` zGLot3hby=|gJkN;!^K>lL^4fL!wxQwA(@8oa5k6INw$&9xST>V4b9=x7XZxq7|YLA zs=DFhTs}iGO+CX$x%?-Rsp*D?xcnB$G?fkS=ko7KrlC8$kIOHUOkH4jkjpQUOhb5h z7ngrQGIgopZZ1DVGIfFBEnNOF$utCp>$v=Vl4)oSS8(|elBw$r7jyY*B-0c(?BMdf zB-4~MoXzDgl1xKwm~nYG$*~Gz>MyXQd-}5uaI*9uNbD<6{LA1V^+`{^`ZUG#4TV!i zj`A)!=owJUkf>*1>1>d7o;l||(YHOl=WW~VP`_8Gn>LLc-*f=Fil+N9wrEdNzvKqb zpEr@wS3T!GLfW3_p)hR6ZRWNwhhh8HrUSc{z5p8*@vrmrF0DZngNeI-Z8+1@zx3;f zie310WW+Nt?x&a`kkL~_<{Yh#{?XJ*$$sd07XLn!?HT!nCpzvXi0+ZGzdd;( zwh*=XIrqj*ht$mgl>^A+W~9KvlTeBim}IHYwsk0G8zmfld*tY*;dwA>ZEbbgr|p3% z(zz&!2XxM4>449ps=pN?~lsp4_oX3emehT#P9_LR$ ziZymWh!r1C|CBQFyFUX?yRsO2mc}hzYO>gWe1fX#ztS`CB`2wSqi18sIkez88mv5? zE-+=A9|waTRi=lv#6dt(L0@1z}|tMIGKZzJco9SJp*&^z!Il7 zI^v1G5&Hp&(Q~mUD6{ARps`0a$Q!*7{eATL7)_5z)T||X_gH@HB^$yJ1n9115ZclV0nqwgA z1ZKpNv(IR?e3LUTwg9%nzd#1n&4;TOAG&Eql`>M@e9rUyJ0?#*Da^Pi-w8b5Q?YzP z`_axdQS%4fqhplD$f1)n?9(dIpX^Uo<@TO;g>$QWU&!@FPkE#7#Lj&@GSW8``LYK- z{{Xz^bL15&NFDdEw)p~_yc$j>TtxlG2B2NlH{$K@a9Ztm&ou^lxdE zRzH8j;i0ZcmCmY_gVoP}3cH(-di1SW75wPE$?0XcT($gABq2H zHZZoF7{{`K%yJKv{m&;|7;U=ohRk@SycIhGFA`Q~yE zh$~|+lYZ|3%xIO)x{)JP@H%@Rjc2XBe$3Om39a3GumSUedlU7%O~cg^`x-Kg6jS%Ofu?rY^mM7hdx7J%X9Z$fazpz zS_OTwt&N_ljDBeE>yD?;YVTVIfl{&et>Vf7>vKaWd`zLTMAcHHiAuQ|r9~6Q`hiwQ z57qXaweRV}HpDaVb7!#wQ&USejl?st8=+8D@;)C6ccSl9eDN`^P_gHI`<^cVzzEEw zp6;Mtn|-*_Igdu+6G~Odi2I+B2#c-cIb(=>2Ns?{1$qa*&6BWCV`mR2;S9`+-#`tY zENdM^mQDJKx?9vb5ECyoSaR)Ro7p6UwD>=MC^H~Cd|JH8B+@C2^DoX_G5_4 zkjnWI46d`W-iu?uBw|0+V*OeypN?R=oyVHzR*xJO_4=--zuxJHO+kdG+3TEFz4$lw zZycZ%Z5%bWEF4vG-!benYMW0%<>mq!I@#WS)Ha4Z)>*X~R}UxM?&uq}(a%n9(>lb- zTB^p8Ayi={qIFd`|19qVE}$2uv}(ZH$vlV6M^IWc`?=UF(Cj^Mp}O~QHqF-?QAK@! z(6X`L)dwZ_$RV%jE8c+?XEBx}%#YRmo7l4$*Ql~LV-Hhq*gXu)_gk=TXL+J8ct&10 zq-lxuXYOBVvU-;Wu7k59u|iP36uldpqCuEs`BL-{1}3V<>K^$uhJ$kJJ@)lO_Bnf; z`yI4y?{V%EbWqS;f_4kKMbJ7yD+DbD#h6%yXPyb=yIjCK40aftcqn zDDS}1St_5QYN$&LEd3^G40$hsr0=hu{;NIxi-!APqMLuP+TQlwK3p`oqrZ;6QcVl} zXNlY~1wDW`&%jtG@9tFBPI!v-wr{e6vei5DqDN=3(~K=;@GZQ2Dcc8cn>^S#3^Gif zbW4FIiwnpWR(s8`@?a0)8Mu=xU@5DNo^eNqV)GC){4Ll}G_O7_E=Fq`Uox<%sEmFP zdj$nMdGk`X3su?o5DZGr()4{Q_I>2xjvlP)J7M4Z9ZCoty_kBF`$Os$FL?Se?>vZz zO5STc(cj1JpbEs8DE2HqZST96jQ9qJobp76$*(UFh}1if2n=H_FiF%9+J|Z=av55O zs*zfU78h)fmsUYOIUCH6!DuVYKcMnr_nzVH)JxH+h%Svs??p6#D+TaIY=;Ic=Rm9- zQhfiWTR(c=>#2$!rcLG+H@3*pzg9;->sP-pov}wv;hE@m%%Sx+x|-1X+iH}iUv1zj zkrUqjh3mj#Dh~%}yR@;oe<~*7i{?92BsG5(oTu&9-KdsbS7N}Q4x7Bu^VR*E^QwCf zVJr3r>>eU7_j|1FXl;JKClkc+G&_x^nOU2c;mL-aS3R&PuM+do#*-0Z-ThU0n7BI< z9m)QsA^Vf3vC01-Jg*+8&95D(a(D(Ro!GXSo!$YjvxC|s24^r~b-1Hdc_%M(_pd;v zRr#REwaP(BKc(edmFLb_fvl^vZ2QMug>(m&DN%JHnEnhmlE#Lp1KV=!ny3nBIjTb$ z8EA!|#exJXIQHh>;Y+U&5|seqsve~Z!otdg3FZRb!`$uBV`J>;+Y7Owf+0~^hO z=#pT(EQjAvZ)3j>i0&$}gSC8+Nd*{6Ej($cP_UAt{RYzZonUE`n zTsXhv546AcMnA^tR~bEpi?r9VT~j=ZPe%SkV-y>=4qBR8u*`#V&>~exi%c=REk7XU z%MTB<4z9zs+FH-RltEmDukrMoaA`Ucw$jz>N$bf|4WHWt9e%&%>!=-mNlTm76oyAg zf#4Mm))jEz!H2&&90<1iLymC3(H#sl`$M6t(fgYlySf5l2R%TEYwdIt%nB7SdgkJ9 zA$|S`r7`R$4M$gFCsJt)1{-%e3PX5SJG!{wDC`Wh@Zw?jH>-G2&#dC||NbX5tC_i%ubR&A>?vM7yuQgZRB$V* znK{x~{Tg?*w`$Gw>1Ys8N!ezE%x2?R=HmLNb-f0<7?=s(Qx}B6XyKjI# zg@MZt!dz;%(smjd84RgBzs2V?meCAQ8E~hBy@yW>_)lpD)2HXQ6|b}%P3yJX8FzvF z&WBzPc2;YX`Mv*=>|uqroNT(X5PMVFA)8N*jO+pb?LUu<90c8i`aA(T7WI~iYdABl zyP#qCbra|w&@X{jBHx3c-^O)!CG^X1@zw##Gx+=0-)rFSHSqTu_h(a9JxwkwAGxkEh0ib<2;tB#nXCCfo}Lyko2fny!k~3a4W6Z2)Ike1HUK% zhh;KAfSIG(nHs@zg1ZGgJRlsAdje^XdkZ||iHvE@rcf*NWxD)HA@ILm(DFMX6op%C zL@-j$6!ub%@lZ^wuWpM^mak-7xcS= zJ}KxSL0=X09YN0uYRS>k8!zZ=K^Frm?Om(iM&rd2y~V7=Y>`*Mj*a5e_aSQ^=zkhj!vXV`ouw zAm}e@?rskhb#80I1!il=)y#^v20HykJ8#?>DcTVTZVPocHv5Y@88UC81AjPp$-4YK zVVs`C)fhk zg@Zd84shb+p$}&|ecg@WtvKPhHqzbg$5GAdwH<*S8q?U(y%lE$tJk))x8ax}n4UPt zoh68$x+JD8*x1bzYC;umBcvHwb#R?XS2MS7?C6SgGMw#fb6iv$Du^$fC?YR_&quE7 z;m}q(jY${4KJAiImYS|SdC778ixZa~ex5Rl)o=SI^ zN-P9A4;dGl8qoqI@gtZ%gDCB^NNLyg}_cgFF+}_E;+kGKF z6&M2bXvkdzkQnL)gG4(?5ww{oT;jC`pb_QA*<%{gIC;!E2%!VbJcfLv;Y(+F!_;!9 zC(bjDH#c@SHnn%OhjG6Q6G9gZk-NXMJG_${%JG8}*uGGSXpT@RXIk3n%rSK}(HK5D zb=(~2>~0KVXvh}w@z!9C-K?!!_L9~(7rbF?!p4yvK9N=iAV zYf1D7UITon0L9Hjo`8=}7cD+MhtNGnntJK>AZuq~bjG%3`l2otDq%e!L4PRHff&}r zc&)dvFpjbFGuHIQdxum>U#5vQ=tl06WI>ZPHi#|3jnP$VST9I@|FSe;}Y zaVTj*r{W3KOEzJ(RbZOByX*!8-Sx$OchJuM*d!Jbfzm9{x`^-|1$+!+Tq-)EM>PvhX)`^<-g@TWKk&3DDc_@4wdF=$HRTpWaEg}5586qIWwb1^LP zP*}ZW2jkEt$x8PW=6liL9I9Ko_P+1}T9Q2zhc-!8`U)-Sp`?Ib6;8h?=qRoE4dKC$ z;(pc{OLy!NCofS^#m$S);#HSpeOL;Xc-7V2XD$@NL2+Ba#Gq-+Q6^U+lErdlR4Eiu zYvL-K-w>J08pM(cy{%Y&5v9868ah^t^Ojc_@XL>MZzaO0Hvc3>%nBnorx!h zWlajw4HLs4H(J_7vQ9x$*yoKZ%&0R;A2q5_GMhz`vINvvHw$bqo?V1}B6z!~uF)EG zjUg=)!vHfn`m|6=6nNvMN-rCfMk&lb;mC9G_FE^}*To&XQKlDZ_4Bw@y<~Ta8;XA; zucw6-?+8+mb|yATL1cbU#`9Yv*|*|}?KsZf6T)QSI`#s`*-Rlkst128ga+X**OWed zOAr1~2*1&T#^#U?{wVHE!+mBcd=>|>4oX4i;_Go2{RtOeXHt-^@?}&CvT@+|>r4u- z#$6m`!8M7r=L(7jatXFA0U6UDr5Qb!SY5K22ndxPL3tP6Cj^;A3fpO{M)nn<^O&G1 ztosrjB}bWM%T-Ob>xO=!s2fHbTs%g-tSnnp^*q?ZXM zBZDW8_e|}K?6PtdlPx1dbHkPu_o*Do*v*QJ$u2}pKCVV{#=}g@7VneKMqzVj^MuCQ z!H*lo`KvYe$HN0rAj)?F?ZWbO>g44_(jjINxtl25+slQ3Q&6jol5mX z<)GxJxlk+!Dz7{T3gb|Keq2MawIj(@fbF5D+X*xER5; zin5^!lc42#h;*r=Z0LoiWe{QzwW4gG^erz!#2d~sb{jHRxk$;TzJe{2gVJxZGQMp} zr75(I5Pup*8lObd)`OvGE&T~Fi@{{9$FV&MtMEy`5oiRcNN*Qe?-uDX6U}3(X7vUT zUf|2qOvM!t5LDWHRgwDKG!va8rjS_!AnR-3@|4-OUQjBQQow8j;CT{-R@*&sKGXK) zIG@cj=@yDNgCHnvobM{L_tl7UKlAZkq5l426 z$Pml^faoqI`(sX1vQ6YnHvIrfO7=K>o3p3l+sblM(Qb>unyxYxfTUV8bAgP>oQUsS zy67`ikfM@#83E+x*vwgAbEqL!<74hOtp`a>$t0i0$?ihuxRmw3qW&-m4aZnJHSQ!b z9dEj4zw!yi)2hMJ#y#y`Fsr~!G~csph^;3sNQr#^*aQ-2m`F|oD+QSueVu~TEn|LJs>MsX@GrFu_YEv+jUkP0h4J%$bC*0_a*x zW={n6+8-oQc0blSPTA13VBL)0ln+RVO zVZr-S$XALBK9Rx{rM$q33gih)RVoU`O2MIc3T8-Qx>8p_t;p48C=CVl>du3x<5Z`z zrJx1EZ%CM}Y%SOZfqPx3bQgrAFi!~=d;!95NzJA76wvef3Vc#am0bnj2J;TZEKqhA zJO|-@63Ud`f?q=Th=g)wZ^7>&(2SJoRt5{+gHVJ|YK`(h!G}^zjuegi!9NpA2K z8Qhgn8Otua3eKqcyqhVG<(fc)n9Z$$fDMo0Sfeq7IvNuEbUp}km2MPeIv;^!Ij`$^ z%)#chl10BVl`jng_t3b`S_}6E(_FS4h+B=hKCPJ9ZU?`C_=Q&6m%+CXzckzSDENiQ zI_;`F+kWr?!YlG^&w;;@c(=nwx5%h^(v~}IzXQ+HtSYqqJ9z2^X*I>Rx54+3{_1ku zr{D*PudA@-z?ZKR|2dEC3dwJ5uq~7PrmeOb@P|p~h8}H3rF)I$+xg@=Kx~w=4-tDO zpE-X@>>ZpvMC@K(|EG!lHfJqJ()_)w5|Hfl9@|9FpCgC#8<}kmcxvACFJS&A#zDGY zo=GfkSrePz0LW5DWma5U;yf#oM;_>ytFr!I>D$8_x0t%sYxqdH0xj{nCey5z5f%6L zh?J!8DXdnTSNI&J@fT^8eu5l#~lGb~>gmR}>wtxEc{Fz5r$cR#xbyie{{*rFl6 zw4hcAU;iJ}u3x2kzFb-N0eSRQ8yetprT)XXkfArx)}gQQC5bmJXYorO)K5C_$@sOH z0)m>r2m4Nqr|lfeq>*brD%_w`&&v9fh*#dRyamVkT<{Lnisf3|iQvKuBn9>NDT!yuRmQIDr6Md=Ty*1ESxlvN zad#F|p{L$M=#{%+G-K*N5MM#7?$oD=b@K&StJoEZisdZn)4Zjup# z>{G3_e*{kpr`?fldkQ@57wyx>*q#I5PWm%)wX!`7!2HF;mII5APJqY8M-H2j5(W9Z zPm>bg=}3?QRS$(dg8meqQ8*&#QVe7YPf~9|kT<0@De*1utZoo`{Kq>G9TajxQ{!sT zO)1EmeDaQI8+E`@!ViVMyhkVX)?VfU3J_P-SPQ9+LhDsOoivy^wg=(2|bU2Id3 zw}&(-@qG(gi$b5E4+tu6e`&FaZwvaZ) zPNH%6sfGin9eJ36hPZZ~;%?+&JR7wHE{IbOG;i}`D%S$joz3#X89Fa<8DM#Qi!K=D z!3|m_Mme@bQ?8bB{4@)_m#I74RSdD2zg;7bYEXTgyQn5;Fwvn08ZG?L3qRsOW7=?f zg2wixM=WUAi6aj*hA%poMH3VqB%%$AJWNFM3Y~AjK@!@_=?)3emMDH`i}p?O2o5b! z`h!Naza%?xq={ytOV5PS)`Fwt09`onBQSKez|RlS&Ln=GhBjUD*bZ%|^apcjzPk9B z2~8jIVrpl~XlIu=A4Ds;?i3Gg-Q?jSx_XqSP-xpH&koV_lsFtk+u`_eC)&xy5Bkt_ z70;WOh!z=smWSr__!%9#gft%7qo!Yg#8TLFq@pOF;I@N;02m*|c+`-NP4V+Ip(6Z* zAAYb;{C+Kt9frb1_#s>0qB8NTwr%+RzUER_$-?qyCTRMKckp%@qZ%=R0^h!#OY1yk#uax zwUuTi{L*EMzZE=2I-w!3=mdaKwQ-g9fCdBOtY(;C8^c;Wbr)&GF&aSO7K{Xmw%|Mx zc;u#yT@8=($Qs*|6nSUFG)Ym_^c3GXH7muHtE!fVRGY=R0nB4+mZcYTw`CvhOP*3* zCB3=h-&QC8P%S{Lx?5E&DKl~rx#w1EgPN9ZO1D0wT6@*8zgO)W)HKU(HOKNJbqeV& zQL|Wz*=#w7N3AJlW*YmdI?mK(eMZghRc91NKWk8(Xt7=|u*X3MVQ4K;bK6wgRupIn zGBX7lOu5#EeQLI81yZtG^VC$!Ll$d9%{7f{P&0_X9);V{0Q-kjW-;|ERu^g~r7(Au zI>xJx;}tPTWm)o!nl`9TwzMJN8q|9P3bjJvAt+dCNXzO_(~hY5sGAw4)q`s8dez>e zW>}|lhcYeJVzmgBl4dc@LlI1yQ%V&z?-6ie7|!0TPIyzzDOMd&xy*%P-iG|BdT&(o ztdFSUE$}T5xtJ{0&(!ghouvVJZMfR3qJ(WH%nHgfakrYcodbRXa!iwVtCJ(B-xKPX z-Bc%CHK@|vD1m9*5w*y)4K0pj$fX*zV!d^Ynr0e@+OsY|^*^a*6(ftVI@^V2x=oz` zRn&W}Iu(p+*`wM_IlGst0MtEdZi+KkwOMmj`_Ir8t!R5UQhegpn#XnhFw0_kiNP1s zcFOLFTb@brYzH_x(=Cl34L`C zC2CoXI?eKrFx!p#T?O{bbRK9KM%e5cHNOTO z(KKUFwZDzdmF_|#1{=`*#-_BQMv=kD zY*NQ>P-oJ(KLJM`R+a7QT;8aW6Dc+C|<=+UjxTfHj zXkQw0u~H61GhX_=7}ee>R`4)G{_ehvr=6jKw~>o!H>nH!8l8<}6$ZQtItqUAHm^db z40a7Z#aYZ4hBJ9)4UFz@S+(U<~L7>dt2Z>f#++{?9T%Kg22ZK{G7lC1wKjO zNSvqteSzc26Ax(uKVV1)_m;W-F@rws!^zJN3^@Hd1mWp3wRD$?^ydqFrNA+X@UTeW zUV*0w{Az)(7Pz?a!aM?R7r062Un}qqfn%@8!}S6`I9-!vy)_B^xWFOuaD%}AC~%o? zP~e{m96#>J!;J#JOw@xc7d;}N{-D46LI!jUnD8y4q3AIQg$D$#e|ASWe~iE;vg`_y zs4r=OexIHCVR?ln%l`A6NJoDsi8Kxi{X&C2UF1_b#R8Y!x0VK4A8@PC)^pUf%Ha|^@N!|{iO{yszGca!M< zqtHL?;N~o<5k^lxC|~_eV~RQm+<|_=DukjS^dun%|Rcy z{|BKjuaxK+GKDvj=+h&c(dy^VN$?Mo;0ikGXz8RS!N(@S=}yCF>C8=n)5D$7^yx9v zX!x=ucy$uIE(v~J5`0q33A zX1sT(`)3%eIT#LwBltxqdJSxO{WWWR-s-jWJ|CpYi=>+6x+wf745^p+_ZYr#rw{+~ zp$o4k$$yBUgK(!R;A`s$G~or&7W`CF$k!O@;kPi2>-M! zN=qdpQ^uhuElN_EflOAWx;Sw!Sl$%ocZtP~T#dMNw{S1M%PQ{-8}9|{Zq15TtXf^k z8*#-NcWsqVO4NvwPc#Spa+TH`XrxfUx3#gWr33HMX+1#dQ=1FEa>HtOZS`_!(0@=t zLGW8u^51vpA^!I0O7Atx++N=`D^{$ns`u5qmwBtGchRjqUvnseH%8_EUBOGaxZ{Wy zE93v)MW@F9R|~&IPH(cw+;F#+-+=P*cWS}@&3^}j;w5Zxb{|)oE{}+sWj6nDA z`Fo^vqyNADzcByj{|)AU^?$%5`^PWL)qHFmax32jB`U;<9kot<0`2KeiuF8-ZZH~xp*k71|agY7C0<${q^UKfgJt}A(> zbW9JA7UK4Fx`%?K4lX6WuLN<$y$;Uc9i^OwJeBI!n9Aj>WDmvRc?@vFB1 zX)k|2MN+!YLqY0GdktmmC>Z)}5^2vXgCfO+{ubg9q`lOW^jnCd-#U@<7HKDFH@8ld zQKlncc1WZx?d9*&NNP<|ep&zXg#9v+;4wT^q#)@QY8(X07l&XkX}?9lC<{Cc<3avk zGf8DWB063VQZ50bx3A0AV&YU5Oc;o0?De!j$KCbz`^2VEQY$Iwg0z#+r(pEhdvnXXA65-%$}K=wxqu`*cGPNWpQ=aPNUP&ki7#m{5o#{Iy}TcDMA*ywGE(1Y zABC~ro>d6VVvUN+VQC)sUjlT{KyNSa3+D-YsVAv1f4Xf&n5;jeeW5fI)M!ulZz+Fc zb~683gFWd|khD+mMti>iY;t1ZRtY<4zZQ(-g$gGjnwSt?qe)8_jJhNnF;cIo)QqZR z#c1Lsy3YU~&HnC{ngJbo(Fdb$0Fg$F^mFSqtNn&ZgUIN$Nh3y<2i9r!>4r#y$gW9Z z|EudXdpdEg4+as(;6~5?NP}i|Ic-jK!D#>Qh%=~Y+FLYY-2WKouboIx&V8DN_U#b% vb?KU1076|t_FuU!eIE9PCguj+H)wYI3>g~zZ%bmIO%01c2b1){AhQ1i$*Len diff --git a/src/main/resources/mkbootimg b/src/main/resources/mkbootimg deleted file mode 100755 index d9e4f2c7438acf4666744fb722e7e59b9600b2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30808 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 E2hCF55C8xG