[TOOL] Lanchon REPIT: The Data-Sparing Repartitioning Tool For Android

Search This thread

rexsllemel

Member
Jul 30, 2015
9
1
Edit:

I'll reedit this soon on browser.
Currently on XDA app but I have a damn fone
 
Last edited:

Teracotta

Senior Member
Jun 26, 2015
350
42
@Lanchon

Hello, I have ported this script to d2usc (which should also work for T999, i747, i535), I have included script here, but I am getting errors.

The partitions I chose tor resize are system, cache, data and fota. They are not adjacent but all occur after the modem.

Here is my filename:

lanchon-repit-20190724-cache=100M+wipe-system=2.24G+keep-fota=min+wipe-data=same-d2usc

Here is the log.

Code:
 ####################################
  Lanchon REPIT
  A Data-Sparing Repartitioning Tool
  Version: 2019-07-24
  Device: d2usc
  Copyright 2016, Lanchon (GPLv3)
 ####################################

=====  PRELIMINARY CHECKS  =====
info: valid package names: <prefix>[-(system|data|cache|fota)=<conf>]...<suffix>
info: valid partition <conf> values: [<size>(G|M)|same|min|max][+[keep|wipe][+[ext4|vfat|f2fs|swap|raw]]]

-----  DEFAULTS  -----
system = size:same + content:keep + fs:ext4
data = size:same + content:keep + fs:ext4
cache = size:same + content:keep + fs:ext4
fota = size:same + content:keep + fs:raw

info: parsing package name

-----  CONFIGURATION  -----
system = size:2.24G + content:keep + fs:ext4
data = size:same + content:keep + fs:ext4
cache = size:100M + content:wipe + fs:ext4
fota = size:min + content:wipe + fs:raw

info: disabling swap
info: unmounting all partitions
info: rereading partition table

=====  PREPARATION  =====
info: determining usable sector range of block device
info: checking existing partitions
#####  processing heap 'main'
info: checking existing partition layout
cat: can't open '/tmp/lanchon-repit/partition-info/p8/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p8/pname': No such file or directory
info: current size: partition #8 '' (): 0 MiB
cat: can't open '/tmp/lanchon-repit/partition-info/p9/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p9/pname': No such file or directory
info: current size: partition #9 '' (): 0 MiB
cat: can't open '/tmp/lanchon-repit/partition-info/p10/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p10/pname': No such file or directory
info: current size: partition #10 '' (): 10 MiB
cat: can't open '/tmp/lanchon-repit/partition-info/p11/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p11/pname': No such file or directory
info: current size: partition #11 '' (): 13 MiB
cat: can't open '/tmp/lanchon-repit/partition-info/p12/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p12/pname': No such file or directory
info: current size: partition #12 '' (): 3 MiB
cat: can't open '/tmp/lanchon-repit/partition-info/p12/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p12/pname': No such file or directory
WARNING: partition #12 '' () ends 29714 MiB before the end of heap 'main'
info: checking new partition layout
cat: can't open '/tmp/lanchon-repit/partition-info/p8/parsedSize': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p8/parsedContent': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p8/parsedFs': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p8/fname': No such file or directory
cat: can't open '/tmp/lanchon-repit/partition-info/p8/pname': No such file or directory

FATAL: partition #8 '' (): undefined new size

[ERROR 1]

Can you give insight into what the problem is?
 
Last edited:

Lanchon

Senior Member
Jun 19, 2011
2,751
4,487
im on the phone travelling. i cant really look. but there seem to be many.

for starters, you declare fota as raw, which means it cant be resized nor wiped (read the docs) but u declare its default as wipe!

more importantly, you are not grasping the concept of heaps in repit. i also dont know the details of the partitions being non adjacent and thus dont know which method to use to solve that in repit, nor what is fota used for and why you want to resize it and declare it raw.

have you provided a port request on github?
 

Teracotta

Senior Member
Jun 26, 2015
350
42
for starters, you declare fota as raw, which means it cant be resized nor wiped (read the docs) but u declare its default as wipe!

Fixed, thanks.

more importantly, you are not grasping the concept of heaps in repit. i also dont know the details of the partitions being non adjacent and thus dont know which method to use to solve that in repit, nor what is fota used for and why you want to resize it and declare it raw.

FOTA is our equivalent to OTA, but it is only 10 MB big.

I don't understand how heaps work and wasn't able to find any guidance from your finished examples or the documentation. Most of your devices have heapStart=$ on the radio partition, with janice starting on kernel2.

As for the details, the major difference is there is a "persist" partition in the middle of the resizable block:

Code:
#   14          221184         3293183   1.5 GiB     8300  system
#   15         3293184        59252735   26.7 GiB    8300  userdata
#   16        59252736        59269119   8.0 MiB     8300  persist
#   17        59269120        60989439   840.0 MiB   8300  cache
#   18        60989440        61009919   10.0 MiB    FFFF  recovery
#   19        61009920        61030399   10.0 MiB    FFFF  fota

If cache can't be resized, what I really want is to move userdata into system.

have you provided a port request on github?

My device is already on there in the request of the T999, we share partition tables.
 

Lanchon

Senior Member
Jun 19, 2011
2,751
4,487
i wont be able to look at this for about a week. but...

- look into i9100 config, there ull find everything explained. then base your config on a simpler config, such as i9300 i seem to remember?

- a heap is a set of movable partition (deemed movable by you) that are CONTIGUOUS on the disk surface, possibly separated among themselves only by unallocated space if at all. note that partition NUMBERS within a heap need not be ascending or contiguous, but usually are.

- partitions that cant be moved (bricking) or are dangerous to move or for which there are no good reasons to move must not be members of a heap.

- a device can have many heaps defined on it, but usually there is no need for more than one. each heap has unmovable start and end sectors on disk. heaps cannot share free space among themselves: each one is a separate world.

- each heap has start and end sectors defined, and the possibly unordered sequence of partition numbers that are its members, declared in disk surface order.

from your message here:

fota should be raw. it could be made ext4 to make it resizable, but given its little size, it is probably best left alone. the smallest size for an ext4 partition is 8MB, so youd save only 2MB for the complexity. so dont. raw means it can be moved but its content are an obscure blob that repit will never alter (including its size).

recovery should be raw if movable. given that the device will be in an semi bricked state if relocation of recovery is interrupted, recovery should actually not be part of a heap at all.

so it is best to leave recovery and fota alone and out of the heap. the only reason to make them part of the heap would be finding out that there is a lot of unused and unpartitioned space after fota in the disk surface. youd have to weight the danger in moving recovery against the benefit of the gained space. none of my published setups move recovery. for heap end, you typically define a sector number. but for this case, you could use repit's finding of physical disk end, which can vary from device to device according to the flash component the phone OEM was able to source at the time of manufacture.

so looks like your heap should be partitions 14 to 17, with hard-defined heap start and end sectors. or you can tell repit to start the heap after partition 13 and end it before partition 18, which i seem to remember is what i usually did for most devices.

persist should be raw (and thus keep). moreover: i remember i think i created a way for a partition to not be configurable. persist should be that: it should default to raw and users must not be able to change its type or content. it only participates in the heap to let the cache donate space to system and data (which requires moving persist).

the other 3 partitions should be relatively obvious. they should be configurable, with defaults to their factory filesystem types, unchanged sized, and kept content. its easy for someone who wants to get rid of the cache to add -cache=min++wipe or whatever it was, i dont really remember at the moment.

if you need further help, maybe its best if u PM me your whatsapp so i send u audio messages, as i cant really spend time typing these days
 

Teracotta

Senior Member
Jun 26, 2015
350
42
if you need further help, maybe its best if u PM me your whatsapp so i send u audio messages, as i cant really spend time typing these days

thanks I appreciate it but I don't have whatsapp, it's not common in my country. I know xda isn't that great anymore but this is still where you are most visible (see the thanks you got for responding)

I have one question, I limited the heap to just 2 partitions, 14 and 15 (all I care about), but I don't know the code to define the end of 15 as the end of the heap

Code:
    # the disk area (as a sector range) to use for the heap partitions:
    heapStart=$(parOldEnd 13)       # one past the end of a specific partition
    heapEnd=$deviceHeapEnd          # one past the last usable sector of the device

"$deviceHeapEnd" on your other examples is always the end of the partition table, since the userdata is the last partition...how do I define the end of 15 or start of 16 as the end of the heap?
 

Lanchon

Senior Member
Jun 19, 2011
2,751
4,487
> I have ported this script to d2usc (which should also work for T999, i747, i535)

> My device is already on there in the request of the T999, we share partition tables.

sharing the partition table is not enough. i REALLY need the dump and other info as requested, including a link to the flashable rom that you are using.

too bad i could have ported the device right now but i don't have the info :(

EDIT: i'm still on the road, btw
 
  • Like
Reactions: ipdev

Teracotta

Senior Member
Jun 26, 2015
350
42
@terracota,

i've seen your device has a 1.5GB system. why exactly do you want to increase that?

have you seen this post?
https://github.com/Lanchon/REPIT/issues/70#issuecomment-280895675

there are 2 reasons

first reason is there are apps that need to be run from /system, and at 50 MB/app there isn't enough space to launch all of them. there's only like 400 mb free space after the ROM. this includes the modern GAPPS which are much bigger than when this phone was new

second issue is certain features like screenshot will only default to internal storage, while other apps can be told to route to external SD card. this can't be changed. and makes it difficult to locate things which save to either /sdcard or /extscard

what I intend is to change the path of internal SD card to the external, so the internal SD card paths will dump on the higher capacity SD card, and the original internal will be added to the /system.

I will fill out the dump as you requested
 

ipdev

Recognized Contributor
Feb 14, 2016
2,546
1
5,159
Google Nexus 10
Nexus 7 (2013)
I have one question, I limited the heap to just 2 partitions, 14 and 15 (all I care about), but I don't know the code to define the end of 15 as the end of the heap

"$deviceHeapEnd" on your other examples is always the end of the partition table, since the userdata is the last partition...how do I define the end of 15 or start of 16 as the end of the heap?
I am bias about system size vs. userdata.
System and cache should be as small as possible. Userdata as large as possible.

It's your choice though.

Assuming you ran the dump file.
Lanchon/REPIT DeviceDump GitHub - Link
If not, run it and save the output file.
Even if you do not request an official port, the output log will tell you everything you need to know to port it yourself.
or help restore if something goes wrong.


If heapStart=$(parOldEnd 13) The end of partition 13. So the end of partition 15 would be ...
Assuming you have everything else configured correctly.

Code:
# the set of contiguous partitions that form this heap, in order of ascending partition start address:
 heapPartitions="$(seq 14 15)"

# the disk area (as a sector range) to use for the heap partitions:
 heapStart=$(parOldEnd 13)
 heapEnd=$(parOldEnd 15)

If it was me, I would submit the dump logs for an official version.
From the bit of the partition table you shared a few posts back, that 800Meg cache partition is a waist of space.
Lanchon might be able to configure RePit to reduce cache and increase system or userdata.
It's been about a year since I looked into repit. I was using contiguous partitions and some free space in-between the partitions.
I only skimmed the parts about non-contiguous partitions. ;)

Good luck.
Cheers. :cowboy:
 

JaLoou

Senior Member
Jun 20, 2017
185
19
Hello.
I was trying to use your tool. And for a first time it was ok.

Now I was trying to use it for the second time for increase the data partition to 6GB and decrease the system partition to 512MB without wiping on i9100 via TWRP 3.1.0.
But now I got an error. And I had attached the screenshot about it.

Sorry, I'm not an IT specialist. But I was trying to use e2fsck as was recommended by your tool and got info that there are many nodes with imagic flags set, many nodes with links to another nodes...

So, please, recommend me what to do now exactly for a success after the error?
May I need to run e2fsck with specific presets or something else?

P.S.: Few years ago I was installing LOS v14.1 and RR v5.8.3-5.8.4 on my device and I was completely disappointed by these custom ROMs due to many hidden issues in they. May these unreliable custom ROMs was producing these abnormalities in the system partition without my knowledge about it?...
May there are possible deeply hidden viruses?
 

Attachments

  • Screenshot_2021-01-08-17-52-41.png
    Screenshot_2021-01-08-17-52-41.png
    48 KB · Views: 40
Last edited:

OpenMinded

Senior Member
Oct 26, 2006
893
69
I saw there was still activity here. I posted a request a while back :
Is anyone still looking at those?

What I was trying to achieve for that device is a move/copy of the vendor files to a separate partition so that Android 8 and up can be ported and hopefully further on with GSI.
I am quite new to all this but I have two of these NX608J phones and have been able before to do some low level system recovery so I am not afraid to try things.

It's great hardware, would love to be able to port some ROMS from other phones to it.
Thanks for any help!
 

Lanchon

Senior Member
Jun 19, 2011
2,751
4,487
I saw there was still activity here. I posted a request a while back :
Is anyone still looking at those?

What I was trying to achieve for that device is a move/copy of the vendor files to a separate partition so that Android 8 and up can be ported and hopefully further on with GSI.
I am quite new to all this but I have two of these NX608J phones and have been able before to do some low level system recovery so I am not afraid to try things.

It's great hardware, would love to be able to port some ROMS from other phones to it.
Thanks for any help!
hi,

> Is anyone still looking at those?

i'm not really. years ago qualcomm started signing the partition table of all its devices, and verifying it even if the device was OEM unlocked. (since they store the OEM unlock state in a partition, they read the partition table before disable signatures.) this means that new ports of REPIT can brick new devices. it happened at least once when a guy requested a port: i did the port, he tried it, and his phone was bricked beyond repair. i felt really bad but i couldn't help. and i stopped processing new devices.

other chipsets have since become common, such ask mediatek. but there is no reason to believe the story won't repeat itself. the ideal solution would be for lineageos and twrp step up to the challenge and standarize a way to partition using LVM, so that all users can pretty much so as they please safely.
 
  • Like
Reactions: ipdev

Lanchon

Senior Member
Jun 19, 2011
2,751
4,487
I saw there was still activity here. I posted a request a while back :
Is anyone still looking at those?

What I was trying to achieve for that device is a move/copy of the vendor files to a separate partition so that Android 8 and up can be ported and hopefully further on with GSI.
I am quite new to all this but I have two of these NX608J phones and have been able before to do some low level system recovery so I am not afraid to try things.

It's great hardware, would love to be able to port some ROMS from other phones to it.
Thanks for any help!

the ZTE Nubia N3 seems to be snapdragon 625, which guarantees that the phone will be bricked if the PT is altered.

android 8 etc can be built without a separate vendor partition. pretty much all android changes to partition layout are technically optional during build (but legaly mandatory for playstore and android trademark use in new devices). this is exactly for the reasons you need it: to be able to upgrade old androids without dangerous repartitioning.

but as said earlier, you can us LVM to join all non-bootloader partitions into a big heap and partition that heap as desired into logical volumes. you will need to include LVM support in your kernel of course.
 
  • Like
Reactions: ipdev

Top Liked Posts

  • There are no posts matching your filters.
  • 69
    Lanchon REPIT: The In-Device Data-Sparing Repartitioning Tool For Android


    REPIT is a simple, safe, device-only, data-sparing, and easily portable repartitioning tool for Android devices:
    • device-only: just flash a zip file in recovery to repartition the device.
    • simple: rename the zip file before flashing to configure your choice of partition sizes, file systems, wipes, etc.
    • safe:
      • a correctly ported REPIT can never hard-brick your device.
      • before starting, REPIT checks for the existence of all the tools that will be needed for the task at hand, verifies that the current partition layout passes several sanity checks, checks and fixes all the involved file systems, and verifies that the new partition layout will meet its sanity checks too. REPIT performs a dry-run of the complete repartitioning process to detect possible problems early on.
      • if REPIT fails, it will nonetheless try to restore your device to a working in-between state.
      • my estimate is that around 1000 users have already repartitioned with REPIT with no incidents of data loss, boot loops or soft bricks (2016-04).
    • easily portable: a simple configuration file is all that is needed to port REPIT to a new device.

    Documentation (HELL YEAH, read this!) -> HERE

    Downloads -> HERE


    this is a user discussion thread. post here for general discussion and user support.
    for official support create a Github issue, but only of you have read the docs.

    new versions will not be announced here.
    please 'watch' the Github project to receive notifications.


    special thanks to the.gangster.



    XDA:DevDB Information
    Lanchon REPIT, Tool/Utility for all devices (see above for details)

    Contributors
    Lanchon
    Source Code: https://github.com/Lanchon/REPIT


    Version Information
    Status: Stable

    Created 2016-04-13
    Last Updated 2019-06-07
    7
    UPDATE: AFH hosting is back up and i've reuploaded the latest release.
    hopefully now the downloads work. thanks @the.gangster!!!

    linky...
    https://www.androidfilehost.com/?w=files&flid=119974
    7
    Tried this on a n7000 recently, tried to resize cache, which didn't work, saw partition structure with modem after cache, and understand your concerns in the comments. I imagine the we could so some experiments like you are doing for the Honor 4, however I'm not at the stage where I want to volunteer my device as potential sacrifice.

    A question on "wipe", how sure are we that "wipe" actually wipes, ie is all the previous data non-recoverable down to a block level?

    Does the wipe trigger some type of NAND erase cycle? This would be problematic on n7000 given the hard brick issues with NAND firmware there, and on the n7000 IIRC the ioctl() is filtered and purposely ignored, maybe this is also an issue with i9100? I don't recall.

    If I have a used ext4 parition, and then format & wipe it then I think a fstrim happens. If I then change it to vfat, and dd the partition, am I able to recover blocks from the original ext4 partition, or does the trim cause the nand to regard the blocks as empty and return 0x0000000 or 0x11111111 or something deterministic?

    I'm looking for a wipe that actually wipes, ext4 and vfat, rather then my current solution which is to dd if=/dev/zero of=/path, which is slow and is difficult to get a progress report, as kill -USR1 is a PITA.

    hi,

    well, it's not that it didn't work lol! cache was intentionally left out of the resizable set. you've seen the comments and the 4X discussion so you know exactly why.

    i wouldn't do the experiments anyway. in the Honor there is something useful to be gained: 1 extra GB to a 4GB /data, which is a lot. in the S2 cache is 100MB. cache is unused nowadays, so the only logical thing to do is shrink it. plus you want something left, like 32MB. so we will risk devices for 68MB? not on my watch :)


    secure wipe is a very complex issue and there's an awful big can of worms there, believe me. it'll try to paint a picture.

    ssds have a bunch of 'trim' commands. there's ERASE and DISCARD, and later TRIM was added, all with slightly different semantics. ans they all come in standard and secure flavors. most recently you can come across the standard non-queued commands or the new queued variants.

    the non-secure flavored commands are performance-oriented: they are hints to help the ssd. the drive can ignore them if it wants. it can ignore requests for short ranges but honor requests for large extents, or whatever.

    more recently devices can implement DRAT and RZAT (deterministic read after trim and read zero after trim), ending the previous non-deterministic behavior. take a look:
    http://www.t13.org/documents/uploadeddocuments/docs2010/e09158r2-trim_clarifications.pdf

    but there are a million bugs in ssd firmware so linux blacklists broken functionality. like RZAT in many drives (you can google it), even if the drive says it supports it.

    in any case RZAT drives just alter the FTL (flash translation layer) structures to unmap the block, they don't erase flash, so your data is typically still there but normally inaccessible. and there is probably even a history of previous snapshots of the block, not just the latest.

    that's where the secure commands enter the picture: supposedly the firmware must actually erase from flash all copies of the targeted blocks. in reality, firmwares are so buggy i wouldn't trust them for that, except maybe if the drive is intel brand.


    back to the real world... the exynos:

    >Does the wipe trigger some type of NAND erase cycle? This would be problematic on n7000 given the hard brick issues with NAND firmware there, and on the n7000 IIRC the ioctl() is filtered and purposely ignored, maybe this is also an issue with i9100? I don't recall.

    you are living in the past. more than two years ago i started arguing that non-secure trim commands should in all probability work fine and could be used to speed up the S2 family. rationale is complex but you can google my threads about it. no-one listened so 2 years ago i learned to build kernels and did some tests with volunteers and began publishing trimming kernels (google i9100 trim for a bit of history). finally in 2016 trim was finally added to official CM 13, 12.1 and 11.

    you could be trimming your device without knowing: if you are using recent official CM, you are already trimming. many other kernels switched to trim too.

    but... in the S2, secure trim kills the eMMC, so only non-secure variants are issued by trim kernels. secure erase is not a possibility.

    i don't know if the eMMC is RZAT, but i wouldn't trust the firmware anyway. if you want to wipe, dd is your best option. but don't use zeros!!! some ssd's compress data. use a pseudo random stream instead. after all, non-secure trim is not very different from a write, in the best case, so just write for safety and be done with it.

    yes, dd won't wipe reserved blocks. no way to do that except:
    -MAYBE... an eMMC full reset (including bootloader) by resizing the boot partitions (google) which is very dangerous and can easily hard brick the device.
    -putting a power drill to you beloved S2 :)


    regarding what repit does:
    -it trims only if the kernel has trim enabled.
    -and it trims only ext4 partitions.

    thanks!
    5
    i wont be able to look at this for about a week. but...

    - look into i9100 config, there ull find everything explained. then base your config on a simpler config, such as i9300 i seem to remember?

    - a heap is a set of movable partition (deemed movable by you) that are CONTIGUOUS on the disk surface, possibly separated among themselves only by unallocated space if at all. note that partition NUMBERS within a heap need not be ascending or contiguous, but usually are.

    - partitions that cant be moved (bricking) or are dangerous to move or for which there are no good reasons to move must not be members of a heap.

    - a device can have many heaps defined on it, but usually there is no need for more than one. each heap has unmovable start and end sectors on disk. heaps cannot share free space among themselves: each one is a separate world.

    - each heap has start and end sectors defined, and the possibly unordered sequence of partition numbers that are its members, declared in disk surface order.

    from your message here:

    fota should be raw. it could be made ext4 to make it resizable, but given its little size, it is probably best left alone. the smallest size for an ext4 partition is 8MB, so youd save only 2MB for the complexity. so dont. raw means it can be moved but its content are an obscure blob that repit will never alter (including its size).

    recovery should be raw if movable. given that the device will be in an semi bricked state if relocation of recovery is interrupted, recovery should actually not be part of a heap at all.

    so it is best to leave recovery and fota alone and out of the heap. the only reason to make them part of the heap would be finding out that there is a lot of unused and unpartitioned space after fota in the disk surface. youd have to weight the danger in moving recovery against the benefit of the gained space. none of my published setups move recovery. for heap end, you typically define a sector number. but for this case, you could use repit's finding of physical disk end, which can vary from device to device according to the flash component the phone OEM was able to source at the time of manufacture.

    so looks like your heap should be partitions 14 to 17, with hard-defined heap start and end sectors. or you can tell repit to start the heap after partition 13 and end it before partition 18, which i seem to remember is what i usually did for most devices.

    persist should be raw (and thus keep). moreover: i remember i think i created a way for a partition to not be configurable. persist should be that: it should default to raw and users must not be able to change its type or content. it only participates in the heap to let the cache donate space to system and data (which requires moving persist).

    the other 3 partitions should be relatively obvious. they should be configurable, with defaults to their factory filesystem types, unchanged sized, and kept content. its easy for someone who wants to get rid of the cache to add -cache=min++wipe or whatever it was, i dont really remember at the moment.

    if you need further help, maybe its best if u PM me your whatsapp so i send u audio messages, as i cant really spend time typing these days
    4
    Unfortunately I realized that I have a much bigger problem. It has ruined the partition table of the ROM. I discovered that the fat storage partition sdcard0 is no longer detected. It seems that there is not. The phone works, more or less. The camera will not, but I downloaded one from the play store.
    You can repair it?

    no, but you can. you have 2 options:
    -take the problem to the xda thread that caused it, and ask for help there.
    -or go to the REPIT site and read and understand the complete documentation. this is the REPIT thread and we do things differently here: we provide full documentation -which cost me a lot of time to write, btw- instead of spoon-feeding users with obscure solutions that they don't understand. this is precisely to avoid users getting into situations like the one you are in.

    your issue is probably that you changed the file system type of /sdcard using REPIT and you don't even know you did because you blindly followed instructions you didn't understand. if this is true, you could solve this issue either with TWRP or REPIT.

    please don't ask "how do i do that?" on this thread. it's all in the docs. if you prefer to be spoon-fed, please go to the other thread.

    thanks!