// replace tashkil following shadda by smaller alternates

@ShaddaTashkil = [uni064E uni064B uni064C uni064F uni08F0 uni08F1 uni0657];
@ShaddaTashkil.small = [uni064E.small uni064B.small uni064C.small uni064F.small uni08F0.small uni08F1.small uni0657.small];

lookup SamallTashkil {
  sub @ShaddaTashkil by @ShaddaTashkil.small;
} SamallTashkil;

feature calt {
  sub [uni0651 uni06EC] @ShaddaTashkil' lookup SamallTashkil;
} calt;

#ifdef QURAN
// a rather ugly hack for the brain dead Unicode canonical reordering of some
// Arabic combining marks

lookup TashkilShaddaHack {
  sub uni064E by uni06EC uni064E.small;
  sub uni064B by uni06EC uni064B.small;
  sub uni064C by uni06EC uni064C.small;
  sub uni064F by uni06EC uni064F.small;
  sub uni08F0 by uni06EC uni08F0.small;
  sub uni08F1 by uni06EC uni08F1.small;
  sub uni0657 by uni06EC uni0657.small;
} TashkilShaddaHack;

feature calt {
  sub @ShaddaTashkil [uni06EC]' by dummy1;
} calt;

feature calt {
  sub @ShaddaTashkil' lookup TashkilShaddaHack dummy1;
} calt;

// non-hack
feature calt {
  sub [uni065C] [uni0650]' by [uni0650.small2];
} calt;

// hack
feature calt {
  sub [uni0650] [uni065C]' by dummy2;
} calt;

lookup uni065cHack {
  sub uni0650 by uni065C uni0650.small2;
} uni065cHack;

feature calt {
  sub [uni0650]' lookup uni065cHack dummy2;
} calt;

#endif

// replace tashkil following hamza by smaller alternates
feature calt {
  sub @AlefHamzaAbove [uni064E uni064F uni0652]' by [uni064E.small2 uni064F.small uni0652.small2];
  sub @AlefHamzaBelow [uni0650]'                 by [uni0650.small2];
  sub [uni0655]       [uni0650]'                 by [uni0650.small2];
} calt;

// replace hamza mark when following a final heh by a glyph that only have a
// HamzaAbove mark so it will be positioned correctly
feature calt {
  sub [uni0647 uni06D5 uni06C1 uni0647.fina uni06D5.fina uni06C1.fina] [uni0654]' by hamza.above;
} calt;

lookup BaaInitWide {
  sub @aBaa.init by @aBaa.init_Wide;
} BaaInitWide;

feature calt {
  sub @aBaa.init' lookup BaaInitWide @Tashkil.above' [@aGaf.medi @aGaf.fina]';
  sub @aBaa.init' lookup BaaInitWide @Tashkil.above' @Tashkil.above' [@aGaf.medi @aGaf.fina]';
  sub @aBaa.init' lookup BaaInitWide @Tashkil.above' @Tashkil.above' @Tashkil.above' [@aGaf.medi @aGaf.fina]';
} calt;

lookup AboveHaaInit {
  sub @aBaa.init by @aBaa.init_BaaHaaInit;
  sub @aHaa.medi by @aHaa.medi_SadHaaInit;
  sub @aHeh.init by @aHeh.init_HehHaaInit;
  sub @aMem.init by @aMem.init_MemHaaInit;
  sub @aSad.init by @aSad.init_SadHaaInit;
  sub @aSen.init by @aSen.init_SenHaaInit;
} AboveHaaInit;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.init @aHeh.init @aMem.init @aSad.init @aSen.init]' lookup AboveHaaInit
      [@aHaa.medi]' lookup AboveHaaInit;
} calt;

lookup BaaRaaFina {
  sub @aBaa.medi by @aBaa.medi_BaaRaaFina;
  sub @aRaa.fina by @aRaa.fina_BaaRaaFina;
} BaaRaaFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.medi]' lookup BaaRaaFina
      [@aRaa.fina]' lookup BaaRaaFina;
} calt;

lookup BaaNonFina {
  sub @aBaa.medi by @aBaa.medi_BaaNonFina;
  sub @aNon.fina by @aNon.fina_BaaNonFina;
} BaaNonFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.medi]' lookup BaaNonFina
      [@aNon.fina]' lookup BaaNonFina;
} calt;

lookup BaaMemFina {
  sub @aBaa.medi by @aBaa.medi_BaaMemFina;
  sub @aMem.fina by @aMem.fina_BaaMemFina;
} BaaMemFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.medi]' lookup BaaMemFina
      [@aMem.fina]' lookup BaaMemFina;
} calt;

lookup KafBaaAlfIsol {
  sub @aBaa.medi by @aBaa.medi_KafBaaInit;
  sub @aKaf.init by @aKaf.init_KafBaaInit;
} KafBaaAlfIsol;

lookup KafBaaAlfFina {
  sub @aBaa.medi by @aBaa.medi_KafBaaMedi;
  sub @aKaf.medi by @aKaf.medi_KafBaaMedi;
} KafBaaAlfFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aKaf.init]' lookup KafBaaAlfIsol
      [@aBaa.medi]' lookup KafBaaAlfIsol
      [@aAlf.fina @aLam.medi @aLam.fina];

  sub [@aKaf.medi]' lookup KafBaaAlfFina
      [@aBaa.medi]' lookup KafBaaAlfFina
      [@aAlf.fina @aLam.medi @aLam.fina];
} calt;

lookup BaaBaa {
  sub @aBaa.medi by @aBaa.medi_BaaBaaInit;
  sub @aBaa.fina by @aBaa.fina_BaaBaaIsol;
  sub @aBaa.init by @aBaa.init_BaaBaaIsol;
} BaaBaa;

lookup HighBaa {
  sub @aBaa.init by @aBaa.init_High;
  sub @aBaa.medi by @aBaa.medi_High;
} HighBaa;

feature calt {
  lookupflag IgnoreMarks;
  // hack to prevent double high baa in سببس and likes
  sub [@aSen.init @aSen.medi]'
      [@aBaa.medi]'
      [@aBaa.medi]' lookup HighBaa
      [@aSen.medi @aSen.fina]';

  // جرينتش
  sub [@aBaa.init]' lookup BaaBaa
      [@aBaa.medi]' lookup BaaBaa
      [@aBaa.medi]' lookup HighBaa
      [@aSen.fina @aSen.medi @aSen.medi_PreYaa];

  sub [@aBaa.medi @aSad.init @aSad.medi @aSen.init @aSen.medi @aBaa.medi_BaaBaaInit]
      [@aBaa.medi]' lookup HighBaa
      [@aBaa.fina @aBaa.medi @aSen.fina @aBaa.medi_BaaHehMedi @aSen.medi @aSen.medi_PreYaa];

  sub [@aBaa.medi]' lookup HighBaa
      [@aSen.fina @aSen.medi @aSen.medi_PreYaa];

  sub [@aBaa.init]' lookup HighBaa
      [@aBaa.medi]' lookup HighBaa
      [@aBaa.medi @aBaa.fina @aSen.medi @aSen.fina];
} calt;

lookup BaaHeh {
  sub @aBaa.init by @aBaa.init_BaaHehInit;
  sub @aMem.init_dots by @aMem.init_MemHehInit;
  sub @aBaa.medi by @aBaa.medi_BaaHehMedi;
  sub @aHeh.medi by @aHeh.medi_BaaHehMedi;
} BaaHeh;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.init @aBaa.medi @aMem.init_dots]' lookup BaaHeh
      [@aHeh.medi]' lookup BaaHeh;
} calt;

lookup BaaBaaHeh {
  sub @aBaa.init by @aBaa.init_BaaBaaHeh;
} BaaBaaHeh;

feature calt {
  lookupflag IgnoreMarks;
  sub @aBaa.init' lookup BaaBaaHeh
      @aBaa.medi_BaaHehMedi;
} calt;

lookup LamAlfFina {
  sub @aAlf.fina by @aAlf.fina_LamAlfFina;
  sub @aLam.medi by @aLam.medi_LamAlfFina;
} LamAlfFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aLam.medi]' lookup LamAlfFina
      [@aAlf.fina]' lookup LamAlfFina;
} calt;

lookup KafLamHeh {
  sub @aLam.medi by @aLam.medi_KafLamHehIsol;
} KafLamHeh;

lookup BaaSenAltInit {
  sub @aBaa.init by @aBaa.init_BaaSenAltInit;
  sub @aRaa.fina by @aRaa.fina_PostTooth;
  sub @aSen.medi by @aSen.medi_BaaSenAltInit;
  sub @aHeh.medi by @aHeh.medi_PostTooth;
  sub @aYaa.fina by @aYaa.fina_PostTooth;
  sub @aMem.fina by @aMem.fina_PostTooth;
} BaaSenAltInit;

lookup LamHaaHaaInit {
  sub @aHaa.medi by @aHaa.medi_1LamHaaHaaInit;
  sub @aLam.init by @aLam.init_LamHaaHaaInit;
} LamHaaHaaInit;

lookup LamHaaHaaInit2 {
  sub @aHaa.medi by @aHaa.medi_2LamHaaHaaInit;
} LamHaaHaaInit2;

lookup KafHeh {
  sub @aKaf.init by @aKaf.init_KafHeh;
  sub @aKaf.medi by @aKaf.medi_KafHeh;
  sub @aHeh.fina by @aHeh.fina_KafHeh;
  sub @aDal.fina by @aDal.fina_KafDal;
} KafHeh;

lookup LamMemFina {
  sub @aLam.medi by @aLam.medi_LamMemFina;
  sub @aMem.fina by @aMem.fina_LamMemFina;
} LamMemFina;

lookup SenMemInit {
  sub @aSen.init by @aSen.init_SenMemInit;
  sub @aSad.init by @aSad.init_SadMemInit;
  sub @aMem.init by @aMem.init_MemMemInit;
  sub @aMem.medi by @aMem.medi_SenMemInit;
} SenMemInit;

lookup AllYaaIsol {
  sub @aKaf.init by @aKaf.init_KafYaaIsol;
  sub @aBaa.init by @aBaa.init_BaaYaaIsol;
  sub @aFaa.init by @aFaa.init_FaaYaaIsol;
  sub @aLam.init by @aLam.init_LamYaaIsol;
  sub @aAyn.init by @aAyn.init_AynYaaIsol;
  sub @aHaa.init by @aHaa.init_HaaYaaIsol;
  sub @aHeh.init by @aHeh.init_HehYaaIsol;
  sub @aMem.init_dots by @aMem.init_MemYaaIsol;
  sub @aYaa.fina by @aYaa.fina_KafYaaIsol;
} AllYaaIsol;

lookup BaaRaaIsol {
  sub @aBaa.init by @aBaa.init_BaaRaaIsol;
  sub @aRaa.fina by @aRaa.fina_BaaRaaIsol;
} BaaRaaIsol;

lookup LamHehIsol {
  sub @aLam.init by @aLam.init_LamHeh;
  sub @aLam.medi by @aLam.medi_LamHeh;
  sub @aLam.medi_LamLamInit by @aLam.medi_LamLamHehIsol;
  sub @aHeh.fina by @aHeh.fina_LamHeh;
  sub @aDal.fina by @aDal.fina_LamDal;
} LamHehIsol;

lookup LamWawFina {
  sub @aLam.medi by @aLam.medi_LamWawFina;
  sub @aWaw.fina by @aWaw.fina_LamWawFina;
} LamWawFina;

lookup FaaYaaFina {
  sub @aFaa.medi by @aFaa.medi_FaaYaaFina;
  sub @aYaa.fina by @aYaa.fina_FaaYaaFina;
} FaaYaaFina;

lookup LamLamHaaInit {
  sub @aHaa.medi by @aHaa.medi_LamLamHaaInit;
  sub @aLam.init by @aLam.init_LamLamHaaInit;
  sub @aLam.medi by @aLam.medi_LamLamHaaInit;
} LamLamHaaInit;

lookup LamBaaMemInit {
  sub @aBaa.medi by @aBaa.medi_LamBaaMemInit;
  sub @aLam.init by @aLam.init_LamBaaMemInit;
  sub @aMem.medi by @aMem.medi_LamBaaMemInit;
} LamBaaMemInit;

lookup KafLamMemMedi {
  sub @aLam.medi by @aLam.medi_KafLamMemMedi;
} KafLamMemMedi;

lookup KafLamMemFina {
  sub @aLam.medi by @aLam.medi_KafLamMemFina;
  sub @aLam.medi_LamMemFina by @aLam.medi_KafLamMemFina;
} KafLamMemFina;

lookup BaaDalIsol {
  sub @aBaa.init by @aBaa.init_BaaDal;
  sub @aDal.fina by @aDal.fina_BaaDal;
} BaaDalIsol;

lookup BaaMemHaaInit {
  sub @aBaa.init by @aBaa.init_BaaMemHaaInit;
  sub @aHaa.medi by @aHaa.medi_BaaMemHaaInit;
  sub @aMem.medi by @aMem.medi_BaaMemHaaInit;
} BaaMemHaaInit;

lookup BaaBaaYaa {
  sub @aBaa.init by @aBaa.init_BaaBaaYaa;
  sub @aBaa.medi by @aBaa.medi_BaaBaaYaa;
  sub @aYaa.fina by @aYaa.fina_BaaBaaYaa;
} BaaBaaYaa;

@LamLamFoo = [@aLam.medi_LamMemMedi @aLam.medi_LamHeh @aLam.medi_LamYaaFina];

lookup LamLamInit {
  sub @aLam.init by @aLam.init_LamLamInit;
  sub @aLam.medi by @aLam.medi_LamLamInit;
  sub @aLam.fina by @aLam.fina_LamLamIsol;
  sub @aKaf.fina by @aKaf.fina_LamKafIsol;
  sub @aGaf.alt.fina by @aGaf.fina_LamKafIsol;
  sub @aLam.medi_LamAlfFina by @aLam.medi_LamLamAlfIsol;
  sub @LamLamFoo by [@aLam.medi_LamLamMemInit @aLam.medi_LamLamHehIsol @aLam.medi_LamLamYaaIsol];
} LamLamInit;

lookup LamLamMedi {
  sub @aLam.medi by @aLam.medi_LamLamMedi2;
  sub @aLam.fina by @aLam.fina_LamLamFina;
  sub @aKaf.fina by @aKaf.fina_LamKafFina;
  sub @aGaf.alt.fina by @aGaf.fina_LamKafFina;
  sub @aLam.medi_LamAlfFina by @aLam.medi_LamLamAlefFina;
  sub @LamLamFoo by [@aLam.medi_LamLamMemMedi @aLam.medi_LamLamHehFina @aLam.medi_LamLamYaaFina];
} LamLamMedi;

lookup LamLamMedi2 {
  sub @aLam.medi by @aLam.medi_LamLamMedi;
} LamLamMedi2;

lookup LamYaaFina {
  sub @aLam.medi by @aLam.medi_LamYaaFina;
  sub @aYaa.fina by @aYaa.fina_LamYaaFina;
} LamYaaFina;

lookup LamMemHaaInit {
  sub @aHaa.medi by @aHaa.medi_LamMemHaaInit;
  sub @aLam.init by @aLam.init_LamMemHaaInit;
  sub @aMem.medi by @aMem.medi_LamMemHaaInit;
} LamMemHaaInit;

#ifndef QURAN
lookup LamMemInit {
  sub @aLam.init by @aLam.init_LamMemInit;
  sub @aMem.medi by @aMem.medi_LamMemInit;
} LamMemInit;
#endif

lookup LamAlfIsol {
  sub @aAlf.fina by @aAlf.fina_LamAlfIsol;
  sub @aLam.init by @aLam.init_LamAlfIsol;
} LamAlfIsol;

#ifndef QURAN
lookup LamHaaMemInit {
  sub @aHaa.medi by @aHaa.medi_LamHaaMemInit;
  sub @aLam.init by @aLam.init_LamHaaMemInit;
  sub @aMem.medi by @aMem.medi_LamHaaMemInit;
} LamHaaMemInit;
#endif

lookup BaaBaaMemInit {
  sub @aBaa.init by @aBaa.init_BaaBaaMemInit;
  sub @aBaa.medi by @aBaa.medi_BaaBaaMemInit;
  sub @aMem.medi by @aMem.medi_BaaBaaMemInit;
} BaaBaaMemInit;

lookup BaaBaaHaaInit {
  sub @aBaa.init by @aBaa.init_BaaBaaHaaInit;
  sub @aBaa.medi by @aBaa.medi_BaaBaaHaaInit;
  sub @aHaa.medi by @aHaa.medi_BaaBaaHaaInit;
} BaaBaaHaaInit;

lookup MemRaaIsol {
  sub @aMem.init by @aMem.init_MemRaaIsol;
  sub @aRaa.fina by @aRaa.fina_MemRaaIsol;
} MemRaaIsol;

lookup HaaHaaInit {
  sub @aHaa.init by @aHaa.init_HaaHaaInit;
  sub @aHaa.medi by @aHaa.medi_HaaHaaInit;
} HaaHaaInit;

lookup KafMemIsol {
  sub @aKaf.init by @aKaf.init_KafMemIsol;
  sub @aLam.init by @aLam.init_LamMemIsol;
  sub @aBaa.init by @aBaa.init_BaaMemIsol;
  sub @aMem.fina by @aMem.fina_KafMemIsol;
} KafMemIsol;

lookup LamQafFina {
  sub @aLam.medi by @aLam.medi_LamQafFina;
  sub @aQaf.fina by @aQaf.fina_LamQafFina;
} LamQafFina;

lookup MemHaaMemInit {
  sub @aHaa.medi by @aHaa.medi_MemHaaMemInit;
  sub @aMem.init by @aMem.init_MemHaaMemInit;
  sub @aMem.init_MemHaaInit by @aMem.init_MemHaaMemInit;
  sub @aHaa.medi_SadHaaInit by @aHaa.medi_MemHaaMemInit;
} MemHaaMemInit;

lookup BaaNonIsol {
  sub @aBaa.init by @aBaa.init_BaaNonIsol;
  sub @aNon.fina by @aNon.fina_BaaNonIsol;
} BaaNonIsol;

lookup KafMemFina {
  sub @aKaf.medi by @aKaf.medi_KafMemFina;
  sub @aMem.fina by @aMem.fina_KafMemFina;
} KafMemFina;

lookup KafLamAlf {
  sub @aLam.medi by @aLam.medi_KafLamAlf;
  sub @aLam.medi_LamAlfFina by @aLam.medi_KafLamAlf;
} KafLamAlf;

lookup BaaSenInit {
  sub @aBaa.init by @aBaa.init_BaaSenInit;
  sub @aSen.fina by @aSen.fina_BaaSen;
  sub @aSen.medi by @aSen.medi_BaaSenInit;
} BaaSenInit;

lookup KafRaaFina {
  sub @aKaf.medi by @aKaf.medi_KafRaaFina;
  sub @aRaa.fina by @aRaa.fina_KafRaaFina;
} KafRaaFina;

lookup LamHehInit {
  sub @aHeh.medi by @aHeh.medi_LamHehInit;
  sub @aLam.init by @aLam.init_LamHehInit;
} LamHehInit;

lookup BaaMemInit {
  sub @aBaa.init by @aBaa.init_BaaMemInit;
  sub @aMem.medi by @aMem.medi_BaaMemInit;
} BaaMemInit;

lookup KafLam {
  sub @aKaf.init by @aKaf.init_KafLam;
  sub @aKaf.medi by @aKaf.medi_KafLam;
  sub @aKaf.fina by @aKaf.fina_KafKafFina;
  sub @aGaf.alt.fina by @aGaf.fina_KafKafFina;
  sub @aLam.medi by @aLam.medi_KafLam;
  sub @aLam.fina by @aLam.fina_KafLam;
  sub @aAlf.fina by @aAlf.fina_KafAlf;
} KafLam;

lookup KafRaaIsol {
  sub @aKaf.init by @aKaf.init_KafRaaIsol;
  sub @aRaa.fina by @aRaa.fina_KafRaaIsol;
} KafRaaIsol;

lookup AynHaaInit {
  sub @aAyn.init by @aAyn.init_AynHaaInit;
  sub @aHaa.medi by @aHaa.medi_AynHaaInit;
} AynHaaInit;

lookup KafYaaFina {
  sub @aKaf.medi by @aKaf.medi_KafYaaFina;
  sub @aAyn.medi by @aAyn.medi_AynYaaFina;
  sub @aYaa.fina by @aYaa.fina_KafYaaFina;
} KafYaaFina;

lookup LamMemMedi {
  sub @aLam.medi by @aLam.medi_LamMemMedi;
  sub @aMem.medi_dots by @aMem.medi_LamMemMedi;
} LamMemMedi;

lookup SenBaaMemInit {
  sub @aSen.init by @aSen.init_SenBaaMemInit;
  sub @aSad.init by @aSad.init_SenBaaMemInit;
  sub @aBaa.medi by @aBaa.medi_SenBaaMemInit;
  sub @aMem.medi by @aMem.medi_SenBaaMemInit;
} SenBaaMemInit;

lookup HaaRaaIsol {
  sub @aHaa.init by @aHaa.init_HaaRaaIsol;
  sub @aRaa.fina by @aRaa.fina_HaaRaaIsol;
} HaaRaaIsol;

lookup LamRaaIsol {
  sub @aLam.init by @aLam.init_LamRaaIsol;
  sub @aRaa.fina by @aRaa.fina_LamRaaIsol;
} LamRaaIsol;

lookup KafMemAlf {
  sub @aKaf.medi by @aKaf.medi_KafMemAlf;
  sub @aKaf.init by @aKaf.init_KafMemAlf;
  sub @aMem.medi by @aMem.medi_KafMemAlf;
  sub @aAlf.fina by @aAlf.fina_KafMemAlf;
  sub @aLam.fina by @aLam.fina_KafMemLam;
  sub @aLam.medi by @aLam.medi_KafMemLam;
} KafMemAlf;

lookup BaaHaaMemInit {
  sub @aBaa.init by @aBaa.init_BaaHaaMemInit;
  sub @aHaa.medi by @aHaa.medi_BaaHaaMemInit;
  sub @aHaa.medi_SadHaaInit by @aHaa.medi_BaaHaaMemInit;
  sub @aBaa.init_BaaHaaInit by @aBaa.init_BaaHaaMemInit;
} BaaHaaMemInit;

lookup AboveHaaIsol {
  sub @aAyn.init by @aAyn.init_AboveHaa;
  sub @aBaa.init by @aBaa.init_AboveHaa;
  sub @aFaa.init by @aFaa.init_FaaHaaInit;
  sub @aHaa.init by @aHaa.init_AboveHaa;
  sub @aHeh.init by @aHeh.init_AboveHaa;
  sub @aKaf.init by @aKaf.init_AboveHaa;
  sub @aLam.init by @aLam.init_LamHaaInit;
  sub @aMem.init by @aMem.init_AboveHaa;
  sub @aSad.init by @aSad.init_AboveHaa;
  sub @aSen.init by @aSen.init_AboveHaa;
  sub @aHaa.fina by @aHaa.fina_AboveHaaIsol;
} AboveHaaIsol;

lookup AboveHaaIsol2 {
  sub @aHaa.fina by @aHaa.fina_AboveHaaIsol2;
  sub @aHaa.medi by @aHaa.medi_FaaHaaInit;
} AboveHaaIsol2;

lookup SenYaaFina {
  sub @aRaa.fina by @aRaa.fina_PostTooth;
  sub @aSad.init by @aSad.init_PreYaa;
  sub @aSad.medi by @aSad.medi_PreYaa;
  sub @aSen.init by @aSen.init_PreYaa;
  sub @aSen.medi by @aSen.medi_PreYaa;
  sub @aYaa.fina by @aYaa.fina_PostTooth;
} SenYaaFina;

lookup KafMemInit {
  sub @aKaf.init by @aKaf.init_KafMemInit;
  sub @aKaf.medi by @aKaf.medi_KafMemMedi;
  sub @aAyn.init by @aAyn.init_AynMemInit;
  sub @aFaa.init by @aFaa.init_FaaMemInit;
  sub @aHaa.init by @aHaa.init_HaaMemInit;
  sub @aHeh.init by @aHeh.init_HehMemInit;
  sub @aMem.medi by @aMem.medi_KafMemMedi;
} KafMemInit;

// the Lam.medi+Mem.fina is too narrow for tashkil, so we use a wider (extended)
// meem when tashkil clash is anticipated.
lookup LamMemFinaExtended {
  sub @aMem.fina by @aMem.fina_LamMemFinaExtended;
} LamMemFinaExtended;

feature calt {
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.above'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above' @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.above'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above' @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.below' @Tashkil.above'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.above' @Tashkil.below'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.above';
  sub @aLam.medi' lookup LamMemFina
      @Tashkil.below'
      @aMem.fina' lookup LamMemFinaExtended
      @Tashkil.below';
} calt;

// ditto
lookup MemExtended {
  sub @aMem.fina by @aMem.fina_KafMemIsolExtended;
} MemExtended;

feature calt {
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.above'
      @aMem.fina' lookup MemExtended
      @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup MemExtended
      @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup MemExtended
      @Tashkil.above' @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.above'
      @aMem.fina' lookup MemExtended
      @Tashkil.above' @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.below' @Tashkil.above'
      @aMem.fina' lookup MemExtended
      @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.above' @Tashkil.below'
      @aMem.fina' lookup MemExtended
      @Tashkil.above';
  sub [@aLam.init @aKaf.init]' lookup KafMemIsol
      @Tashkil.below'
      @aMem.fina' lookup MemExtended
      @Tashkil.below';
} calt;

//ditto, but we don't have LamMemInit in Quran font
#ifndef QURAN
lookup LamMemInitTatweel {
  sub @aMem.medi by @aMem.medi_LamMemInitTatweel;
} LamMemInitTatweel;

feature calt {
  sub @aLam.init' lookup LamMemInit
      @Tashkil.above'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.above' @Tashkil.above'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.above' @Tashkil.above'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above' @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.above'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above' @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.below' @Tashkil.above'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.above' @Tashkil.below'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.above';
  sub @aLam.init' lookup LamMemInit
      @Tashkil.below'
      @aMem.medi' lookup LamMemInitTatweel
      @Tashkil.below';
} calt;
#endif

// ditto
lookup KafMemFinaExtended {
  sub @aMem.fina by @aMem.fina_KafMemFinaExtended;
} KafMemFinaExtended;

feature calt {
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.above'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above';
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above';
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.above' @Tashkil.above'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above' @Tashkil.above';
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.above'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above' @Tashkil.above';
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.below' @Tashkil.above'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above;
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.above' @Tashkil.below'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.above';
  sub @aKaf.medi' lookup KafMemFina
      @Tashkil.below'
      @aMem.fina' lookup KafMemFinaExtended
      @Tashkil.below';
} calt;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi]' lookup KafLamHeh
      [@aHeh.fina @aDal.fina]' lookup LamHehIsol;

  sub [@aKaf.init @aKaf.medi]' lookup KafMemAlf
      [@aMem.medi]' lookup KafMemAlf
      [@aLam.medi @aLam.fina @aAlf.fina]' lookup KafMemAlf;

  sub [@aBaa.init]' lookup BaaSenAltInit
      [@aSen.medi]' lookup BaaSenAltInit
      [@aHeh.medi @aRaa.fina @aYaa.fina @aMem.fina]' lookup BaaSenAltInit;

  sub [@aLam.init]' lookup LamHaaHaaInit
      [@aHaa.medi]' lookup LamHaaHaaInit
      [@aHaa.medi]' lookup LamHaaHaaInit2;

  sub [@aKaf.init @aKaf.medi]' lookup KafHeh
      [@aHeh.fina @aDal.fina]' lookup KafHeh;

  sub [@aLam.medi]' lookup LamMemFina
      [@aMem.fina]' lookup LamMemFina;

  sub [@aSen.init @aSad.init @aMem.init]' lookup SenMemInit
      [@aMem.medi]' lookup SenMemInit;

  sub [@aKaf.init @aBaa.init @aFaa.init @aLam.init @aAyn.init @aHaa.init @aHeh.init @aMem.init_dots]' lookup AllYaaIsol
      [@aYaa.fina]' lookup AllYaaIsol;

  sub [@aBaa.init]' lookup BaaRaaIsol
      [@aRaa.fina]' lookup BaaRaaIsol;

  sub [@aLam.init @aLam.medi @aLam.medi_LamLamInit]' lookup LamHehIsol
      [@aHeh.fina @aDal.fina]' lookup LamHehIsol;

  sub [@aLam.medi]' lookup LamWawFina
      [@aWaw.fina]' lookup LamWawFina;

  sub [@aFaa.medi]' lookup FaaYaaFina
      [@aYaa.fina]' lookup FaaYaaFina;

  sub [@aLam.init]' lookup LamLamHaaInit
      [@aLam.medi]' lookup LamLamHaaInit
      [@aHaa.medi]' lookup LamLamHaaInit;

  sub [@aLam.init]' lookup LamBaaMemInit
      [@aBaa.medi]' lookup LamBaaMemInit
      [@aMem.medi]' lookup LamBaaMemInit;

  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi]' lookup KafLamMemMedi
      [@aMem.medi_dots]' lookup LamMemMedi;

  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi @aLam.medi_LamMemFina]' lookup KafLamMemFina
      [@aMem.fina @aMem.fina_LamMemFinaExtended]' lookup LamMemFina;

  sub [@aBaa.init]' lookup BaaDalIsol
      [@aDal.fina]' lookup BaaDalIsol;

  sub [@aBaa.init]' lookup BaaMemHaaInit
      [@aMem.medi]' lookup BaaMemHaaInit
      [@aHaa.medi]' lookup BaaMemHaaInit;

  sub [@aBaa.init]' lookup BaaBaaYaa
      [@aBaa.medi]' lookup BaaBaaYaa
      [@aYaa.fina]' lookup BaaBaaYaa;

  sub [@aLam.medi]' lookup LamYaaFina
      [@aYaa.fina]' lookup LamYaaFina;

  sub [@aLam.init]' lookup LamMemHaaInit
      [@aMem.medi]' lookup LamMemHaaInit
      [@aHaa.medi]' lookup LamMemHaaInit;

#ifndef QURAN
  sub [@aLam.init]' lookup LamMemInit
      [@aMem.medi]' lookup LamMemInit;
#endif

  sub [@aLam.init]' lookup LamAlfIsol
      [@aAlf.fina]' lookup LamAlfIsol;

#ifndef QURAN
  sub [@aLam.init]' lookup LamHaaMemInit
      [@aHaa.medi]' lookup LamHaaMemInit
      [@aMem.medi]' lookup LamHaaMemInit;
#endif

  sub [@aBaa.init]' lookup BaaBaaMemInit
      [@aBaa.medi]' lookup BaaBaaMemInit
      [@aMem.medi]' lookup BaaBaaMemInit;

  sub [@aBaa.init]' lookup BaaBaaHaaInit
      [@aBaa.medi]' lookup BaaBaaHaaInit
      [@aHaa.medi]' lookup BaaBaaHaaInit;

  sub [@aMem.init]' lookup MemRaaIsol
      [@aRaa.fina]' lookup MemRaaIsol;

  sub [@aAyn.init]'
      [@aRaa.fina]' lookup MemRaaIsol;

  sub [@aHaa.init]' lookup HaaHaaInit
      [@aHaa.medi]' lookup HaaHaaInit;

  sub [@aKaf.init @aLam.init @aBaa.init]' lookup KafMemIsol
      [@aMem.fina]' lookup KafMemIsol;

  sub [@aLam.medi]' lookup LamQafFina
      [@aQaf.fina]' lookup LamQafFina;

  sub [@aMem.init @aMem.init_MemHaaInit]' lookup MemHaaMemInit
      [@aHaa.medi @aHaa.medi_SadHaaInit]' lookup MemHaaMemInit
      [@aMem.medi]' lookup KafMemInit;

  sub [@aBaa.init]' lookup BaaNonIsol
      [@aNon.fina]' lookup BaaNonIsol;

  sub [@aKaf.medi]' lookup KafMemFina
      [@aMem.fina]' lookup KafMemFina;

  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi @aLam.medi_LamAlfFina]' lookup KafLamAlf
      [@aAlf.fina @aAlf.fina_LamAlfFina];

  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi @aLam.medi_LamAlfFina]' lookup KafLamAlf
       // see float hamza in quran.fea
       uni0621.float'
      [@aAlf.fina @aAlf.fina_LamAlfFina];

  sub [@aBaa.init]' lookup BaaSenInit
      [@aSen.medi]' lookup BaaSenInit;

  sub [@aBaa.init]' lookup BaaSenAltInit
      [@aSen.fina]' lookup BaaSenInit;

  sub [@aKaf.medi]' lookup KafRaaFina
      [@aRaa.fina]' lookup KafRaaFina;

  sub [@aLam.init]' lookup LamHehInit
      [@aHeh.medi]' lookup LamHehInit;

  sub [@aBaa.init]' lookup BaaMemInit
      [@aMem.medi]' lookup BaaMemInit;

  sub [@aKaf.init @aKaf.medi]' lookup KafLam
      [@aLam.medi @aLam.fina @aAlf.fina @aKaf.fina]' lookup KafLam;

  sub [@aKaf.init]' lookup KafRaaIsol
      [@aRaa.fina]' lookup KafRaaIsol;

  sub [@aAyn.init]' lookup AynHaaInit
      [@aHaa.medi]' lookup AynHaaInit;

  sub [@aKaf.medi @aAyn.medi]' lookup KafYaaFina
      [@aYaa.fina]' lookup KafYaaFina;

  sub [@aLam.medi]' lookup LamMemMedi
      [@aMem.medi_dots]' lookup LamMemMedi;

  sub [@aSen.init @aSad.init]' lookup SenBaaMemInit
      [@aBaa.medi]' lookup SenBaaMemInit
      [@aMem.medi]' lookup SenBaaMemInit;

  sub [@aBaa.init]' lookup BaaBaa
      [@aBaa.medi @aBaa.fina]' lookup BaaBaa;

  sub [@aHaa.init]' lookup HaaRaaIsol
      [@aRaa.fina]' lookup HaaRaaIsol;

  sub [@aLam.init]' lookup LamRaaIsol
      [@aRaa.fina]' lookup LamRaaIsol;

  sub [@aBaa.init @aBaa.init_BaaHaaInit]' lookup BaaHaaMemInit
      [@aHaa.medi @aHaa.medi_SadHaaInit]' lookup BaaHaaMemInit
      [@aMem.medi]' lookup KafMemInit;

  sub [@aAyn.init @aBaa.init @aHaa.init @aHeh.init @aMem.init @aSad.init @aSen.init]' lookup AboveHaaIsol
      [@aHaa.fina]' lookup AboveHaaIsol;

  sub [@aFaa.init @aLam.init @aKaf.init]' lookup AboveHaaIsol
      [@aHaa.medi @aHaa.fina]' lookup AboveHaaIsol2;

  sub [@aSen.init @aSad.init @aSen.medi @aSad.medi]' lookup SenYaaFina
      [@aYaa.fina @aRaa.fina]' lookup SenYaaFina;
} calt;

lookup ToothYaaBari {
  sub @aSen.init by @aSen.init_YaaBari;
  sub @aSad.init by @aSad.init_YaaBari;
  sub @aYaaBari.fina by @aYaaBari.fina_PostTooth;
} ToothYaaBari;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aSen.init @aSad.init]' lookup ToothYaaBari
      [@aYaaBari.fina]'      lookup ToothYaaBari;
} calt;

lookup ToothYaaBariFina {
  sub @aBaa.medi            by @aBaa.medi_YaaBari;
  sub @aBaa.init_BaaBaaIsol by @aBaa.init_BaaBaaYaaBari;
  sub @aBaa.medi_BaaBaaInit by @aBaa.medi_YaaBari;
  sub @aHaa.init_DotBelow   by @aHaa.init_BaaYaaBari;
  sub @aYaaBari.fina      by @aYaaBari.fina_PostToothFina;
} ToothYaaBariFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aHaa.init_DotBelow]' lookup ToothYaaBariFina
      [@aBaa.medi]'          lookup ToothYaaBariFina
      [@aYaaBari.fina]'    lookup ToothYaaBariFina;

  sub [@aBaa.medi]'       lookup ToothYaaBariFina
      [@aYaaBari.fina]' lookup ToothYaaBariFina;

  sub [@aBaa.init_BaaBaaIsol]' lookup ToothYaaBariFina
      [@aBaa.medi_BaaBaaInit]' lookup ToothYaaBariFina
      [@aYaaBari.fina]'      lookup ToothYaaBariFina;
} calt;

lookup AscenderYaaBari {
  sub @aBaa.init by @aBaa.init_YaaBari;
  sub @aFaa.init by @aFaa.init_YaaBari;
  sub @aLam.init by @aLam.init_YaaBari;
  sub @aKaf.init by @aKaf.init_YaaBari;
  sub @aYaaBari.fina by @aYaaBari.fina_PostAscender;
} AscenderYaaBari;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.init @aFaa.init @aLam.init @aKaf.init]' lookup AscenderYaaBari
      [@aYaaBari.fina]'                            lookup AscenderYaaBari;
} calt;

lookup AynYaaBari {
  sub @aHaa.init by @aHaa.init_YaaBari;
  sub @aHeh.init by @aHeh.init_YaaBari;
  sub uni06BE.init by uni06BE.init_YaaBari;
  sub @aAyn.init by @aAyn.init_YaaBari;
  sub @aTaa.init by @aTaa.init_YaaBari;
  sub @aMem.init_dots by @aMem.init_YaaBari;
  sub @aYaaBari.fina by @aYaaBari.fina_PostAyn;
} AynYaaBari;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aHaa.init @aHeh.init @aAyn.init @aTaa.init @aMem.init_dots uni06BE.init]' lookup AynYaaBari
       @aYaaBari.fina'                                                          lookup AynYaaBari;
} calt;

// default Faa.init+Mem.medi ligature is too narrow leading to mark clash of
// both glyphs have marks above or both have marks bellow at the same time. So
// we use an alternate wider Meem in such cases.
// This covers فَمَا فَّمَا فَمَّا فَّمَّا فِّمَا فِمِا.
lookup FaaMemTatweel {
  sub @aMem.medi by @aMem.medi_KafMemMediTatweel;
} FaaMemTatweel;

feature calt {
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.above'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.above' @Tashkil.above'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.above' @Tashkil.above'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above' @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.above'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above' @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.below' @Tashkil.above'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.above' @Tashkil.below'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.above';
  sub @aFaa.init' lookup KafMemInit
      @Tashkil.below'
      @aMem.medi' lookup FaaMemTatweel
      @Tashkil.below';
} calt;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aKaf.init @aKaf.medi @aAyn.init @aFaa.init @aHaa.init @aHeh.init]' lookup KafMemInit
      [@aMem.medi]' lookup KafMemInit;
} calt;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aLam.init]' lookup LamLamInit
      [@LamLamFoo @aLam.medi @aKaf.fina @aLam.fina @aLam.medi_LamAlfFina]' lookup LamLamInit;

  sub [@aLam.medi]' lookup LamLamMedi2
      [@LamLamFoo @aLam.medi @aKaf.fina @aLam.fina @aLam.medi_LamAlfFina]' lookup LamLamMedi;
} calt;

lookup HehMediTooth {
  sub @aHeh.medi by @aHeh.medi_PostTooth;
  sub @aSad.init by @aSad.init_PreYaa;
  sub @aSad.medi by @aSad.medi_PreYaa;
  sub @aSen.init by @aSen.init_PreYaa;
  sub @aSen.medi by @aSen.medi_PreYaa;
} HehMediTooth;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aSad.init @aSad.medi @aSen.init @aSen.medi]' lookup HehMediTooth
      [@aHeh.medi]' lookup HehMediTooth;
} calt;

// replace final alef followed by madda by a wider one
feature calt {
  sub @Tashkil.above [uni0627.fina]' [uni0653 uni06E4] by [uni0627.fina_Wide];
} calt;

// Wider alef wasl and alef with hamza above after faa
feature calt {
  lookupflag IgnoreMarks;
  sub @aFaa.init
     [uni0671.fina uni0623.fina]'
  by [uni0671.fina_Wide uni0623.fina_Wide];
} calt;

// If there are no marks, revert the above substitution
feature calt {
  sub @aFaa.init
     [uni0671.fina_Wide uni0623.fina_Wide]'
  by [uni0671.fina uni0623.fina];
} calt;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aAyn.init @aHaa.init @aHaa.medi]'
      [@aAlf.fina @aDal.fina @aHeh.fina @aLam.fina @aLam.medi @aLam.medi_LamMemFina
       @aLam.medi_LamWawFina @aLam.medi_LamHeh @aLam.medi_LamYaaFina @aKaf.fina
       @aLam.medi_LamQafFina @aBaa.medi_BaaRaaFina @aLam.medi_LamAlfFina
       @aLam.medi_LamMemMedi @aLam.medi_LamLamMedi @aBaa.medi_BaaNonFina @aBaa.medi_High
       @aKaf.medi @aKaf.medi_KafMemAlf @aKaf.medi_KafMemMedi @aKaf.medi_KafMemFina
       @aKaf.medi_KafLam @aKaf.medi_KafHeh @aKaf.medi_KafBaaMedi @aKaf.medi_KafRaaFina
       @aKaf.medi_KafYaaFina]
  by  [@aAyn.init_Finjani @aHaa.init_Finjani @aHaa.medi_Finjani];
} calt;

lookup BaaYaaFina {
  sub @aBaa.medi by @aBaa.medi_BaaYaaFina;
  sub @aYaa.fina by @aYaa.fina_BaaYaaFina;
} BaaYaaFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aBaa.medi]' lookup BaaYaaFina
      [@aYaa.fina]' lookup BaaYaaFina;
} calt;

lookup ToothMem {
  sub @aMem.fina by @aMem.fina_PostTooth;
  sub @aSad.init by @aSad.init_PreYaa;
  sub @aSad.medi by @aSad.medi_PreYaa;
  sub @aSen.init by @aSen.init_PreYaa;
  sub @aSen.medi by @aSen.medi_PreYaa;
} ToothMem;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aSen.init @aSen.medi @aSad.init @aSad.medi]' lookup ToothMem
      [@aMem.fina]' lookup ToothMem;
} calt;

lookup KafLamYaa {
  sub @aLam.medi_KafLam by @aLam.medi_KafLamYaa;
} KafLamYaa;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aLam.medi_KafLam]' lookup KafLamYaa
      [@aYaa.fina]' lookup LamYaaFina;
} calt;

lookup LamKafInit {
// XXX: sync with classes.fea

  // @aLam.init
  sub uni06B5.init by uni06B5.init uni0640.1;
  sub uni06B7.init by uni06B7.init uni0640.1;
  sub uni0644.init by uni0644.init uni0640.1;
  sub uni06B8.init by uni06B8.init uni0640.1;
  sub uni06B6.init by uni06B6.init uni0640.1;
  sub uni076A.init by uni076A.init uni0640.1;

  // @aLam.medi by
  sub uni06B5.medi by uni06B5.medi uni0640.1;
  sub uni06B7.medi by uni06B7.medi uni0640.1;
  sub uni0644.medi by uni0644.medi uni0640.1;
  sub uni06B8.medi by uni06B8.medi uni0640.1;
  sub uni06B6.medi by uni06B6.medi uni0640.1;
  sub uni076A.medi by uni076A.medi uni0640.1;

  // @aLam.medi_KafLam
  sub uni06B5.medi_KafLam by uni06B5.medi_KafLam uni0640.1;
  sub uni06B7.medi_KafLam by uni06B7.medi_KafLam uni0640.1;
  sub uni0644.medi_KafLam by uni0644.medi_KafLam uni0640.1;
  sub uni06B8.medi_KafLam by uni06B8.medi_KafLam uni0640.1;
  sub uni06B6.medi_KafLam by uni06B6.medi_KafLam uni0640.1;
  sub uni076A.medi_KafLam by uni076A.medi_KafLam uni0640.1;

  // @aLam.medi_KafMemLam
  sub uni06B5.medi_KafMemLam by uni06B5.medi_KafMemLam uni0640.1;
  sub uni06B7.medi_KafMemLam by uni06B7.medi_KafMemLam uni0640.1;
  sub uni0644.medi_KafMemLam by uni0644.medi_KafMemLam uni0640.1;
  sub uni06B8.medi_KafMemLam by uni06B8.medi_KafMemLam uni0640.1;
  sub uni06B6.medi_KafMemLam by uni06B6.medi_KafMemLam uni0640.1;
  sub uni076A.medi_KafMemLam by uni076A.medi_KafMemLam uni0640.1;

  // @aLam.medi_LamLamInit
  sub uni06B5.medi_LamLamInit by uni06B5.medi_LamLamInit uni0640.1;
  sub uni06B7.medi_LamLamInit by uni06B7.medi_LamLamInit uni0640.1;
  sub uni0644.medi_LamLamInit by uni0644.medi_LamLamInit uni0640.1;
  sub uni06B8.medi_LamLamInit by uni06B8.medi_LamLamInit uni0640.1;
  sub uni06B6.medi_LamLamInit by uni06B6.medi_LamLamInit uni0640.1;
  sub uni076A.medi_LamLamInit by uni076A.medi_LamLamInit uni0640.1;

  sub @aMem.medi_LamMemInit   by @aMem.medi_LamMemInitTatweel;
} LamKafInit;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aLam.init @aLam.medi @aLam.medi_KafLam @aLam.medi_KafMemLam
       @aLam.medi_LamLamInit @aMem.medi_LamMemInit]' lookup LamKafInit
      [@aKaf.medi @aKaf.medi_KafHeh @aKaf.medi_KafMemFina @aKaf.medi_KafRaaFina
       @aKaf.medi_KafYaaFina @aKaf.medi_KafMemAlf @aGaf.fina];
} calt;

lookup LamAynTatweel {
// XXX: sync with classes.fea

  // @aLam.init
  sub uni06B5.init by uni06B5.init uni0640.2;
  sub uni06B7.init by uni06B7.init uni0640.2;
  sub uni0644.init by uni0644.init uni0640.2;
  sub uni06B8.init by uni06B8.init uni0640.2;
  sub uni06B6.init by uni06B6.init uni0640.2;
  sub uni076A.init by uni076A.init uni0640.2;

  // @aLam.medi by
  sub uni06B5.medi by uni06B5.medi uni0640.2;
  sub uni06B7.medi by uni06B7.medi uni0640.2;
  sub uni0644.medi by uni0644.medi uni0640.2;
  sub uni06B8.medi by uni06B8.medi uni0640.2;
  sub uni06B6.medi by uni06B6.medi uni0640.2;
  sub uni076A.medi by uni076A.medi uni0640.2;

  // @aLam.medi_KafLam
  sub uni06B5.medi_KafLam by uni06B5.medi_KafLam uni0640.2;
  sub uni06B7.medi_KafLam by uni06B7.medi_KafLam uni0640.2;
  sub uni0644.medi_KafLam by uni0644.medi_KafLam uni0640.2;
  sub uni06B8.medi_KafLam by uni06B8.medi_KafLam uni0640.2;
  sub uni06B6.medi_KafLam by uni06B6.medi_KafLam uni0640.2;
  sub uni076A.medi_KafLam by uni076A.medi_KafLam uni0640.2;

  // @aLam.medi_KafMemLam
  sub uni06B5.medi_KafMemLam by uni06B5.medi_KafMemLam uni0640.2;
  sub uni06B7.medi_KafMemLam by uni06B7.medi_KafMemLam uni0640.2;
  sub uni0644.medi_KafMemLam by uni0644.medi_KafMemLam uni0640.2;
  sub uni06B8.medi_KafMemLam by uni06B8.medi_KafMemLam uni0640.2;
  sub uni06B6.medi_KafMemLam by uni06B6.medi_KafMemLam uni0640.2;
  sub uni076A.medi_KafMemLam by uni076A.medi_KafMemLam uni0640.2;

  // @aLam.medi_LamLamInit
  sub uni06B5.medi_LamLamInit by uni06B5.medi_LamLamInit uni0640.2;
  sub uni06B7.medi_LamLamInit by uni06B7.medi_LamLamInit uni0640.2;
  sub uni0644.medi_LamLamInit by uni0644.medi_LamLamInit uni0640.2;
  sub uni06B8.medi_LamLamInit by uni06B8.medi_LamLamInit uni0640.2;
  sub uni06B6.medi_LamLamInit by uni06B6.medi_LamLamInit uni0640.2;
  sub uni076A.medi_LamLamInit by uni076A.medi_LamLamInit uni0640.2;

  sub @aMem.medi_LamMemInit   by @aMem.medi_LamMemInitTatweel;
} LamAynTatweel;

// lam [shadda] kasra ayn.fina
feature calt {
  sub [@aLam.init @aLam.medi @aLam.medi_KafLam @aLam.medi_KafMemLam
       @aLam.medi_LamLamInit @aMem.medi_LamMemInit]' lookup LamAynTatweel
      [uni064D uni0650 uni065C]
       @aAyn.fina;
  sub [@aLam.init @aLam.medi @aLam.medi_KafLam @aLam.medi_KafMemLam
       @aLam.medi_LamLamInit @aMem.medi_LamMemInit]' lookup LamAynTatweel
      [uni0651]
      [uni064D uni0650 uni065C]
       @aAyn.fina;
} calt;

#ifdef QURAN
// alef lam meem raa (with madda)
// we don't get plain aLam.init aMem.fina except in Quran font
feature calt {
  sub @aLam.init' lookup LamKafInit [uni0653 uni06E4]
      @aMem.medi [uni0653 uni06E4];
} calt;
#endif

lookup HehYaaFina {
  sub @aHeh.medi_BaaHehMedi by @aHeh.medi_HehYaaFina;
  sub @aHeh.medi_PostTooth by @aHeh.medi_PostToothHehYaa;
} HehYaaFina;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aHeh.medi_PostTooth @aHeh.medi_BaaHehMedi]' lookup HehYaaFina
      [@aYaa.fina]'                                 lookup BaaYaaFina;
} calt;

feature calt {
  lookupflag IgnoreMarks;
  sub @RaaWaw [uni0625 uni0673]' by @aAlf.isol_LowHamza;
} calt;


// insert tatweel between ح and ك in فحك[ملير]
lookup FaaHaaKaf {
// XXX: sync with classes.fea
// sub @aHaa.medi_FaaHaaInit   by @aHaa.medi_FaaHaaInit   uni0640.1;
  sub uni062E.medi_FaaHaaInit by uni062E.medi_FaaHaaInit uni0640.1;
  sub uni062D.medi_FaaHaaInit by uni062D.medi_FaaHaaInit uni0640.1;
  sub uni0681.medi_FaaHaaInit by uni0681.medi_FaaHaaInit uni0640.1;
  sub uni0687.medi_FaaHaaInit by uni0687.medi_FaaHaaInit uni0640.1;
  sub uni0685.medi_FaaHaaInit by uni0685.medi_FaaHaaInit uni0640.1;
  sub uni062C.medi_FaaHaaInit by uni062C.medi_FaaHaaInit uni0640.1;
  sub uni0682.medi_FaaHaaInit by uni0682.medi_FaaHaaInit uni0640.1;
  sub uni0757.medi_FaaHaaInit by uni0757.medi_FaaHaaInit uni0640.1;
  sub uni0684.medi_FaaHaaInit by uni0684.medi_FaaHaaInit uni0640.1;
  sub uni076F.medi_FaaHaaInit by uni076F.medi_FaaHaaInit uni0640.1;
  sub uni076E.medi_FaaHaaInit by uni076E.medi_FaaHaaInit uni0640.1;
  sub uni0683.medi_FaaHaaInit by uni0683.medi_FaaHaaInit uni0640.1;
  sub uni06BF.medi_FaaHaaInit by uni06BF.medi_FaaHaaInit uni0640.1;
  sub uni077C.medi_FaaHaaInit by uni077C.medi_FaaHaaInit uni0640.1;
  sub uni0758.medi_FaaHaaInit by uni0758.medi_FaaHaaInit uni0640.1;
  sub uni0772.medi_FaaHaaInit by uni0772.medi_FaaHaaInit uni0640.1;
  sub uni0686.medi_FaaHaaInit by uni0686.medi_FaaHaaInit uni0640.1;
} FaaHaaKaf;

feature calt {
  lookupflag IgnoreMarks;
  sub @aFaa.init_FaaHaaInit
      @aHaa.medi_FaaHaaInit' lookup FaaHaaKaf
     [@aKaf.medi_KafHeh @aKaf.medi_KafMemFina @aKaf.medi_KafRaaFina @aKaf.medi_KafYaaFina];
} calt;

// insert tatweel between ح and ت in [بمسصف]حت[رن]
lookup AboveHaaTatweel {
// XXX: sync with classes.fea
//sub @aHaa.medi_FaaHaaInit   by @aHaa.medi_FaaHaaInit   uni0640.05;
  sub uni062E.medi_FaaHaaInit by uni062E.medi_FaaHaaInit uni0640.05;
  sub uni062D.medi_FaaHaaInit by uni062D.medi_FaaHaaInit uni0640.05;
  sub uni0681.medi_FaaHaaInit by uni0681.medi_FaaHaaInit uni0640.05;
  sub uni0687.medi_FaaHaaInit by uni0687.medi_FaaHaaInit uni0640.05;
  sub uni0685.medi_FaaHaaInit by uni0685.medi_FaaHaaInit uni0640.05;
  sub uni062C.medi_FaaHaaInit by uni062C.medi_FaaHaaInit uni0640.05;
  sub uni0682.medi_FaaHaaInit by uni0682.medi_FaaHaaInit uni0640.05;
  sub uni0757.medi_FaaHaaInit by uni0757.medi_FaaHaaInit uni0640.05;
  sub uni0684.medi_FaaHaaInit by uni0684.medi_FaaHaaInit uni0640.05;
  sub uni076F.medi_FaaHaaInit by uni076F.medi_FaaHaaInit uni0640.05;
  sub uni076E.medi_FaaHaaInit by uni076E.medi_FaaHaaInit uni0640.05;
  sub uni0683.medi_FaaHaaInit by uni0683.medi_FaaHaaInit uni0640.05;
  sub uni06BF.medi_FaaHaaInit by uni06BF.medi_FaaHaaInit uni0640.05;
  sub uni077C.medi_FaaHaaInit by uni077C.medi_FaaHaaInit uni0640.05;
  sub uni0758.medi_FaaHaaInit by uni0758.medi_FaaHaaInit uni0640.05;
  sub uni0772.medi_FaaHaaInit by uni0772.medi_FaaHaaInit uni0640.05;
  sub uni0686.medi_FaaHaaInit by uni0686.medi_FaaHaaInit uni0640.05;

//sub @aHaa.medi_SadHaaInit   by @aHaa.medi_SadHaaInit   uni0640.05;
  sub uni062E.medi_SadHaaInit by uni062E.medi_SadHaaInit uni0640.05;
  sub uni062D.medi_SadHaaInit by uni062D.medi_SadHaaInit uni0640.05;
  sub uni0681.medi_SadHaaInit by uni0681.medi_SadHaaInit uni0640.05;
  sub uni0687.medi_SadHaaInit by uni0687.medi_SadHaaInit uni0640.05;
  sub uni0685.medi_SadHaaInit by uni0685.medi_SadHaaInit uni0640.05;
  sub uni062C.medi_SadHaaInit by uni062C.medi_SadHaaInit uni0640.05;
  sub uni0682.medi_SadHaaInit by uni0682.medi_SadHaaInit uni0640.05;
  sub uni0757.medi_SadHaaInit by uni0757.medi_SadHaaInit uni0640.05;
  sub uni0684.medi_SadHaaInit by uni0684.medi_SadHaaInit uni0640.05;
  sub uni076F.medi_SadHaaInit by uni076F.medi_SadHaaInit uni0640.05;
  sub uni076E.medi_SadHaaInit by uni076E.medi_SadHaaInit uni0640.05;
  sub uni0683.medi_SadHaaInit by uni0683.medi_SadHaaInit uni0640.05;
  sub uni06BF.medi_SadHaaInit by uni06BF.medi_SadHaaInit uni0640.05;
  sub uni077C.medi_SadHaaInit by uni077C.medi_SadHaaInit uni0640.05;
  sub uni0758.medi_SadHaaInit by uni0758.medi_SadHaaInit uni0640.05;
  sub uni0772.medi_SadHaaInit by uni0772.medi_SadHaaInit uni0640.05;
  sub uni0686.medi_SadHaaInit by uni0686.medi_SadHaaInit uni0640.05;
} AboveHaaTatweel;

feature calt {
  lookupflag IgnoreMarks;
  sub [@aHaa.medi_FaaHaaInit @aHaa.medi_SadHaaInit]' lookup AboveHaaTatweel
      [@aBaa.medi_BaaNonFina @aBaa.medi_BaaRaaFina];
} calt;


// When an initial Baa is followed by Alef, the dot clashes with the Hamza below
// Alef, Also the marks above the Baa clash with the Alef, so we replace the Baa
// with a wider variant.
feature calt {
  lookupflag IgnoreMarks;
  sub @aBaa.init' lookup BaaInitWide @aAlf.fina;
} calt;

// If the Alef has no Hamza below, or there is no marks above the Baa, revert to
// the original, non-wide form (notice there is no IgnoreMarks flag).
feature calt {
  sub [@aBaa.init_Wide]'
      [uni0622.fina uni0623.fina uni0627.fina uni0671.fina uni0672.fina
       uni0675.fina uni0773.fina uni0774.fina]
   by [@aBaa.init];
} calt;

// Replace teh init following teh/them medi by a teh init with two vertical
// dots
// XXX: use a different glyph for PDF text extraction
feature calt {
  lookupflag IgnoreMarks;
  script arab;
  language ARA;
  sub uni062A.init_BaaBaaIsol'
      [uni062A.medi_BaaBaaInit uni062B.medi_BaaBaaInit]
   by uni067A.init_BaaBaaIsol;

  sub uni062A.init_High'
      [uni062A.medi_High uni062B.medi_High]
   by uni067A.init_High;
} calt;
