# use on the appropriate log file produced by ghidra
import sys
fl=sys.argv[1]
def modInverse(a, m):
    m0 = m
    y = 0
    x = 1
    if (m == 1):
        return 0
    while (a > 1):
        q = a // m
        t = m
        m = a % m
        a = t
        t = y
        y = x - q * y
        x = t
    if (x < 0):
        x = x + m0
    return x
n=0xBCA83D793F493C49DF558612E74C773198AB4901F20369BFAF1598D71E362EF13AB9BE3B4D4D73C63378542D23BEBA56AD4D589C1E7F151E25CF6F7A38F8FF1FF491D5D2DFC971617B6D9559406E3A5127B2AEBDDEA965E0DFCF4C50AE241CAF9E87BFE33B0DB619B5C395E3986E310A3278F990B4139A421AF74B3E4E1548250DEC8F1755B038E61069E2547983ED93878549B4A9F5FAA1BEF72A75A9929FA7240FB1E46B9587170EF993C29C35F1F145E55BFEC0DE85D2B9409D6599B1C348BF76DD441ABD53033475E3267F91647C2584D974D3AD7B8C0C33711556D6C2CF23BF7905B17A68C622A0580A623C1AF9F446294D5F2DE50721D85EB5F49B7013
rt=0x79bad423a3b14693488f32a3f32ca9cf96dbdfc5b45c7d4bba04af8958f008e3b7468b33f0f868eccc0b5b0fac5c60d131c2491b43dda75af695cfc303086204cb656f24b02024adef05c5e3be2f4918b67f7c75d3b9150b78ba70f4785515bd64e2905517559033e69a4a36501604c371a37137f56d64444b269538b87152169bf581d560bab993e4a6010f39f41fc97396f57eaecef874a469d5159ab5a71f6c9c5e1e4e7e5de2a7436604f47c695572b7b8916116044ba223c95eccaad9c3747dcdc56e966b1978a17282d9911d9bf314f1ef52971d4c4f59c1fcde5c4deeeb8ce02816aa24b79091d81e70c11c3f12dafad70b74eee3aa4a902a2d76b2bc
r=(1<<2048)
ri=modInverse(r,n)
rii=modInverse(ri,n)

accs=["Collected as HasMulAdd ,a : ",
"Collected as SubN ,a : ",
"Collected as Plus ,b : " ,
"Collected as Plum? ,b : ",
"Collected as Plum res ,b : ",
"Collected as Plus ,a : ",
"Collected as YetAnother ,a : ",
"Collected as MbSubtr ,a : ",
"Collected as Upper ,a : ",
 "Collected as MbSubtr ,b : ",
 "Grabbed "
 ]
priors=[]
mults={}
pluses={}
minuses={}
sqms={}
sqms2={}
relations={}

def checkPriorRelation(nm):
  global priors
  if nm in priors: return
  rel=False
  if nm in mults:
    relations[nm]=["mul",mults[nm]]
    del mults[nm]
    rel=True
  if nm in pluses and not rel:
    print("Sum")
    relations[nm]=["sum",pluses[nm]]
    del pluses[nm]
    rel=True
  if nm in minuses and not rel:
    print("Neg")
    relations[nm]=["neg",minuses[nm]]
    del minuses[nm]
    rel=True
  if rel is False:
      if nm in sqms:
        relations[nm]=["sqm",sqms[nm]]
  if rel is False:
     if nm in sqms2:
        print("Squam2")
        relations[nm]=["sqm2",sqms2[nm]]
  priors.append(nm)
  for k in range(len(priors)):
     p=priors[k]
     mi=(p*nm*ri)%n
     sqm=(p*mi*ri)%n
     sqm2=(nm*mi*ri)%n
     mp=(p+nm)%n
     mn=(p-nm+n)%n
     mn2=(nm-p+n)%n
     if nm<0: mn+=n
     if not mi in mults:
       mults[mi]=[k,len(priors)-1]
     if not mp in pluses:
       pluses[mp]=[k,len(priors)-1]
     if not mn in minuses:
       minuses[mn]=[k,len(priors)-1]
     if not mn2 in minuses:
       minuses[mn2]=[len(priors)-1,k]
     
lnm=0 

def save():
    import json
    st=json.dumps({"priors":priors, "relations":relations})
    fl=open("exp_values.json","w")
    fl.write(st)
    fl.close()
cnt=0
prev=None
with open(fl,"r",encoding="utf-8") as fl:
  for ln in fl:
    for acc in accs:
      if acc in ln:
       if "Grabbed " in ln:
        nm=int(ln.split(":")[1].strip(),16)%n
       else:
        nm=int(ln[len(acc):],16)%n
       lnm=nm
       if nm in priors:
        print("Prior")
       else:
        pass
       checkPriorRelation(nm)
       prev=nm
       cnt=cnt+1
       if cnt>100:
        cnt=0
        save()
       break
save()