import lzma,struct,sys
sys.path.insert(0,'/root/rblxdecomp-luraph/luraph/extract')
from deobfuscate import unpack_stage

def pack_stage(data: bytes) -> str:
    filters=[{'id':lzma.FILTER_LZMA1,'dict_size':1<<26,'lc':3,'lp':0,'pb':0}]
    comp=lzma.compress(data,format=lzma.FORMAT_RAW,filters=filters)
    # pad to 4 bytes; decoder ignores trailing zeros after LZMA eof
    pad=(-len(comp))%4
    comp += b'\0'*pad
    out=[]
    for i in range(0,len(comp),4):
        val=int.from_bytes(comp[i:i+4],'little')
        digs=[0]*5
        for j in range(4,-1,-1):
            digs[j]=val%85; val//=85
        out.append(''.join(chr(33+d) for d in digs))
    s='LPH+'+''.join(out)
    return s.replace('!!!!!','z')

if __name__=='__main__':
    for data in [b'hello', b'a'*1000, bytes(range(256))*10]:
        s=pack_stage(data); dec=unpack_stage(s)
        print(len(data),len(s),dec==data)
