//Islamic Inheritance Calculator, IRTH
//Author: Ayman Abu-Mostafa
//Terms: Can be freely distributed, as long as this header is included and kept unchanged.

//Load rational.js and define debug() before this file

//Constants
whole = new Rational(1,1);
none = new Rational(0,1);
twothirds = new Rational(2,3);
half = new Rational(1,2);
third = new Rational(1,3);
quarter = new Rational(1,4);
sixth = new Rational(1,6);
eighth = new Rational(1,8);

function toshare() {			//defining it as a constant didn't work!
	return new Rational(-1,1);
}

bequest = 0;
son = 1;		daughter = 2;	gson = 3;		gdaughter = 4;
husband = 5;	wife = 6;		father = 7;		mother = 8;
gfather = 9;	gmotherF = 10;	gmotherM = 11;	brother = 12;
sister = 13;	brotherF = 14;	sisterF = 15;	siblingM = 16;
nephew = 17;	nephewF = 18;	uncle = 19;		uncleF = 20;
cousin = 21;	cousinF = 22;	freed = 23;		relativeM = 24;
treasury= 25;
heirCategory = new Array("Hibah/wasiat ke bukan ahli waris",
	"Anak laki-laki", "Anak perempuan", "Cucu laki-laki dari anak laki-laki", "Cucu perempuan dari anak laki-laki",
	"Suami", "Istri", "Ayah", "Ibu", "Kakeh shahihah (atau yang diatasnya)", "Nenek shahihah (atau yang diatasnya) dari ayah",
	"Nenek shahihah (atau yang diatasnya) dari ibu", "Saudara laki-laki seayah-seibu", "Saudara perempuan seayah-seibu", // baris pertama
	"Saudara laki-laki seayah",	"Saudara perempuan seayah", "Saudara laki-laki/perempuan seibu", "Anak laki-laki dari saudara laki-laki seayah-seibu",
	"Anak laki-laki dari saudara laki-laki seayah", "Saudara laki-laki ayah yang seayah-seibu", "Saudara laki-laki ayah yang seayah",
	"Anak laki-laki dari saudara laki-laki ayah yang seayah-seibu",	"Anak laki-laki dari saudara laki-laki ayah yang seayah", "Mu'tiq/Mu'tiqah", "Ahli waris lain dari ibu", "Baitul mal");
heirsCategory = new Array("Hibah/wasiat ke bukan ahli waris", "Anak laki-laki", "Anak perempuan", "Cucu laki-laki dari anak laki-laki", "Cucu perempuan dari anak laki-laki",
	"Suami", "Istri", "Ayah", "Ibu", "Kakeh shahihah (atau yang diatasnya)", "Nenek shahihah (atau yang diatasnya) dari ayah",
	"Nenek shahihah (atau yang diatasnya) dari ibu", "Saudara laki-laki seayah-seibu", "Saudara perempuan seayah-seibu", // baris pertama
	"Saudara laki-laki seayah",	"Saudara perempuan seayah", "Saudara laki-laki/perempuan seibu", "Anak laki-laki dari saudara laki-laki seayah-seibu",
	"Anak laki-laki dari saudara laki-laki seayah", "Saudara laki-laki ayah yang seayah-seibu", "Saudara laki-laki ayah yang seayah",
	"Anak laki-laki dari saudara laki-laki ayah yang seayah-seibu",	"Anak laki-laki dari saudara laki-laki ayah yang seayah", "Mu'tiq/Mu'tiqah", "Ahli waris lain dari ibu", "Baitul mal");
/*
heirCategory = new Array("Bequest to non-heirs", "Son", "Daughter", "Son of son", "Daughter of son",
	"Husband", "Wife", "Father", "Mother", "Father of father (or higher)", "Mother of father (or higher)",
	"Mother of mother (or higher)", "Full brother", "Full sister", "Half-brother from father",
	"Half-sister from father", "Sibling from mother", "Son of full brother",
	"Son of half-brother from father", "Full brother of father",
	"Half-brother of father from his father", "Son of full brother of father",
	"Son of half-brother of father from his father", "Freed slave", "Other ralative to mother", "Islamic Treasury");
heirsCategory = new Array("Bequest to non-heirs", "Sons", "Daughters", "Sons of sons", "Daughters of sons",
	"Husband", "Wife", "Father", "Mother", "Father of father (or higher)", "Mother of father (or higher)",
	"Mother of mother (or higher)", "Full brothers", "Full sisters", "Half-brothers from father",
	"Half-sisters from father", "Siblings from mother", "Sons of full brother",
	"Sons of half-brother from father", "Full brothers of father",
	"Half-brothers of father from his father", "Sons of full brothers of father",
	"Sons of half-brothers of father from his father", "Freed slaves", "Other relatives to mother", "Islamic Treasury");
*/
//Preferences
DETAILS = 1;
RESULTS = 0;
DEBUG = 2;
TABLE = 3;

var allowRudd = true;
var allowRuddToSpouses = false;
Hanafi = 1;
Maliki = 2;
Shafii = 3;
Hanbali = 4;
Egypt = 5;
var school = 0;
schoolNames = new Array("Tidak bermahzab", "Mahdzab Hanafi", "Mahdzab Maliki", "Mahdzab Syafi'i", "Mahdzab Hambali", "Hukum Mesir");

//Variables
var nheirs;		//Array(26)
var shares;  	//Array(26)
var namedShares;//Array(26)
var firstHeir;
var lastHeir;
var mdec;		//Flag if there's a male descendant
var fdec;		//Flag if there's a female descendant
var fasab;		//Flag if there's female agnates with other females
var gfb;		//Flag if it's the case of a grandfather and brothers
var mushtarika;	//Flag if it's the Mushtarika case
var existsBequest;
var bequestShare;
var remain;
var sum;

function assertTrue(condition, errmsg) {
	if (!condition) {
		alert("BUG:\n" + errmsg + "\nHubungi pengembang");
		detail("[ERROR] " + errmsg);
	}
	return condition;
}

function gets(h, sh) {
	if ((nheirs[h]>0) || (h==treasury) || (h==bequest)) {
		if (nheirs[h] == 1) debug(heirCategory[h] + " mendapatkan " + toString(sh));
		else debug(heirsCategory[h] + " mendapatkan " + toString(sh));
		shares[h] = sh;
	}
}

function has(h) {
	if ((nheirs[h]>0) || (h==treasury) || (h==bequest)) {
		if (nheirs[h] == 1) debug(heirCategory[h] + " memiliki " + toString(shares[h]));
		else debug(heirsCategory[h] + " memiliki " + toString(shares[h]));
		return shares[h];
	}
	else return none;
}

function isToShare(h) {
	if (nheirs[h] > 0) {
		var sh = has(h);
		var b = (sh.num < 0) && (sh.denom >= 1);
		if (nheirs[h] == 1) debug(heirCategory[h] + (b? " agnasi" : " tidak diagnasi"));
		else debug(heirsCategory[h] + (b? " agnasi" : " tidak diagnasi"));
		return b;
	}
	else return false;
}

function isVoid(h) {
	return ((nheirs[h] == 0) || isZero(shares[h]));
}

function deprive(h, reason) {
	if (nheirs[h] == 0) return;
	if (nheirs[h] == 1) detail(heirCategory[h] + " dihijab karena " + reason);
	else detail(heirsCategory[h] + " dihijab karena " + reason);
	shares[h] = none;
}

function depriveRange(h1, h2, reason) {
	for (var i=h1; i<=h2; i++)
		deprive(i,reason);
}

/**
 * Sums up all given shares (not including amount to be shared)
 * and sets the global variables sum and remain.
 * Notice that calculation is done on estate, which is one less any bequest.
 */
function sumUp() {
	var summ = none;
	for (var i=firstHeir; i<=lastHeir; i++) {
		if ((nheirs[i]>0) && !isToShare(i)) 		//add only unmarked shares
			summ = add(summ, shares[i]);
	}
	summ = add(summ, shares[treasury]);
	detail("===> Sekarang berjumlah " + toString(summ));
	sum = summ;
	remain = subtract(whole,sum);
	detail(toString(remain) + " sekarang tersisa");
}

function addsUp() {
	sumUp();
	return isZero(remain);
}

function calculateRemainder() {
	sumUp();
	return remain;
}

function isOversubscribed() {
	return isGt(sum, whole);
}

function isUndersubscribed() {
	return isLt(sum, whole);
}

function isRevertTo(h) {
	if (school == Maliki) {
		return false;
	}
	if (allowRudd==false) {
		return false;
	}
	var b = (h==daughter) || (h==gdaughter) || (h==mother) || (h==gmotherF) || (h==gmotherM) ||
		(h==sister) || (h==sisterF) || (h==siblingM);
	if (allowRuddToSpouses==true) {
		detail("Mengikuti pendapat Sayyidina Utsman untuk menyertakan suami/istri dalam pengembalian");
		b = b || (h==husband) || (h==wife);
	}
	if ((!isVoid(h)) && (nheirs[h] == 1))
		detail(heirCategory[h] + (b? " berpartisipasi " : " tidak berpartisipasi ") + "dalam 'rodd' (pengembalian)");
	else if ((!isVoid(h)) && (nheirs[h] > 1))
		detail(heirsCategory[h] + (b? " berpartisipasi " : " tidak berpartisipasi ") + "dalam 'rodd' (pengembalian)");
	return b;
}

function initialize() {
	//defining this as a global constant didn't work!
	var named_shares = new Array(none,whole,half,whole,half,half,quarter,whole,third,whole,sixth,sixth,whole,half,
		whole,half,sixth,whole,whole,whole,whole,whole,whole,whole,none,none);
	nheirs = new Array(26);
	shares = new Array(26);
	namedShares = new Array(26);
	for (var i=0; i<nheirs.length && i<shares.length && i<named_shares.length && i<namedShares.length; i++) {
		namedShares[i] = named_shares[i];
		nheirs[i] = 0 * 1;
		shares[i] = named_shares[i];
	}
	mdec = false;	fdec = false;	fasab = false;	gfb = false;	mushtarika = false;
	remain = whole;	sum = none;
	existsBequest = false;			bequestShare = none;
	firstHeir = 0;	lastHeir = 0;
}

function getHeirList() {
	var heirList = "";
	for (var j=son; j<treasury; j++) {
		if (nheirs[j]>0) {
			if (nheirs[j]==1) heirList += heirCategory[j] + ";";
			else heirList += nheirs[j] + " " + heirsCategory[j] + ";";
		}
	}
	debug("===>mengambilDaftarAhliWaris: " + heirList);
	return heirList;
}

function getHeirRange() {
	firstHeir = 0;
	for (var i=son; i<treasury; i++) {
		if (nheirs[i]>0) {
			firstHeir = i;
			break;
		}
	}
	lastHeir = 0;
	for (var j=treasury-1; j>=son; j--) {
		if (nheirs[j]>0) {
			lastHeir = j;
			break;
		}
	}
	if ((firstHeir>0) && (lastHeir<treasury))
		debug("Ahli waris pertama adalah " + heirCategory[firstHeir] + " dan ahli waris terakhir adalah " + heirCategory[lastHeir]);
}

//Inheritance Rules
function calcShare(h) {
	if (!assertTrue((h>0) && (h<=treasury), "hitungBagianWaris: " + h + " bukan ahli waris yang berhak")) return false;
	var n = nheirs[h];
	debug(h + ":" + n + "=" + (shares[h]? toString(shares[h]): "TIDAK ADA"));
	if (n==0) {
		shares[h] = none;
		return true;
	}
	else if (shares[h] && isZero(shares[h])) return true;		//been deprived in a previous iteration
	if (n == 1) detail("(" + h + ") Menghitung bagian warisan untuk : " + heirCategory[h]);
	else detail("(" + h + ") Menghitung bagian warisan untuk: " + heirsCategory[h]);
	var sh = has(h);
	switch(h) {
	case son:
		if (n == 1) {
			deprive(gson,"karena adanya anak laki-laki");
			deprive(gdaughter,"karena adanya anak laki-laki");
			depriveRange(brother,treasury,"karena adanya anak laki-laki");//because of son
		}
		else {
			deprive(gson,"karena adanya anak laki-laki");//because of sons
			deprive(gdaughter,"karena adanya anak laki-laki");
			depriveRange(brother,treasury,"karena adanya anak laki-laki");
		}
		sh = toshare();
		if (n == 1) detail("Anak laki-laki akan mendapatkan bagian harta warisan karena sisa");//Son will share by agnation
		else detail("Anak laki-laki akan mendapatkan bagian harta warisan karena sisa");
		mdec = true;
		break;
	case daughter:
		if (n==1) deprive(siblingM,"karena adanya anak perempuan");//because of daughter
		else deprive(siblingM,"karena adanya anak perempuan");
		if ((n>1) && (nheirs[gson]==0))
			deprive(gdaughter,"karena adanya lebih dari satu anak perempuan dan tidak ada cucu laki-laki dari anak laki-laki (tidak bisa menghijab)");//because more than one daughter and no sons of sons (cannot agnate)
			//TODO Here
		fdec = true;
		if (nheirs[son]>0) {
			sh = multiply(has(son), half);
			if (n == 1 && nheirs[son] == 1) detail("Anak perempuan akan berbagi dengan anak laki-laki dengan perbandingan 1:2");
			else if (n == 1 && nheirs[son] > 1) detail("Anak perempuan akan berbagi dengan anak laki-laki dengan perbandingan 1:2");
			if (n > 1 && nheirs[son] == 1) detail("Anak perempuan akan berbagi dengan anak laki-laki dengan perbandingan 1:2");
			else detail("Anak perempuan akan berbagi dengan anak laki-laki dengan perbandingan 1:2");
		}
		//May agnate with other females, in which case the following
		//else statements still apply
		else if (n==1) {
			sh = half;
			detail("Satu anak perempuan dan tanpa anak laki-laki, ia akan mendapatkan separuh (1/2)");
		}
		else {
			sh = twothirds;
			detail("Lebih dari satu anak perempuan dan tidak ada anak laki-laki, mereka berbagi dua pertiga (2/3)");
		}
		break;
	case gson:
		if (n == 1) depriveRange(brother,treasury,"karena adanya cucu laki-laki dari anak laki-laki");
		else depriveRange(brother,treasury,"karena adanya cucu laki-laki dari anak laki-laki");
		mdec = true;
		sh = toshare();
		if (n == 1) detail("cucu laki-laki dari anak laki-laki mungkin berbagi dengan agnasi");
		else detail("cucu laki-laki dari anak laki-laki mungkin berbagi dengan agnasi");//sons of sons may share by agnation
		break;
	case gdaughter:
		if (n==1) deprive(siblingM,"karena adanya cucu perempuan dari anak laki-laki");//because of daughter of son
		else deprive(siblingM,"karena adanya cucu perempuan dari anak laki-laki");
		fdec = true;
		if (nheirs[gson]>0) {
			sh = multiply(has(gson), half);
			if (n==1 && nheirs[gson]==1) detail("Cucu perempuan dari anak laki-laki akan berbagi dengan cucu laki-laki dari anak laki-laki dengan perbandingan 1:2");//Daughter of son will share with son of son by ratio of 1:2
			else if (n==1 && nheirs[gson]>1) detail("Cucu perempuan dari anak laki-laki akan berbagi dengan cucu laki-laki dari anak laki-laki dengan perbandingan 1:2");
			else if (n>1 && nheirs[gson]==1) detail("Cucu perempuan dari anak laki-laki akan berbagi dengan cucu laki-laki dari anak laki-laki dengan perbandingan 1:2");
			else detail("Cucu perempuan dari anak laki-laki akan berbagi dengan cucu laki-laki dari anak laki-laki dengan perbandingan 1:2");
		}
		else if (nheirs[daughter]==1) {
			sh = sixth;
			//No sons of sons and one daughter, sister or half-sister from father,
			//so daughter(s) of son(s) get one sixth to complete two thirds
			detail("Tidak ada cucu laki-laki dari anak laki-laki, saudara perempuan atau saudara perempuan seayah, sehingga cucu-cucu perempuan dari satu atau beberapa anak laki-laki mendapatkan seperenam (1/6) untuk melengkapi menjadi dua pertiga (2/3)");
		}
		//Case of nheirs[daughter]>1 taken care of under daughter above
		else if (n==1) {
			sh = half;
			//One daughter of son and no sons of sons, she gets half
			detail("Satu cucu perempuan dari anak laki-laki dan tidak ada cucu laki dari anak laki-laki, ia mendapatkan setengah");
		}
		else {
			sh = twothirds;
			//More than one daughter of son(s) and no sons of sons, they share two thirds
			detail("Lebih dari satu cucu perempuan dari satu atau beberapa anak laki-laki dan tidak ada cucu laki-laki dari anak laki-laki, mereka berbagai dua pertiga (2/3)");
		}
		break;
	case husband:
		//husband and wife cannot have both survived
		if (!assertTrue(nheirs[wife]==0, "suami atau istri mereka tidak bisa keduanya hidup")) return false;
		deprive(wife,"karena dia adalah si mayit!");//because she is the testator!
		if ((mdec==true) || (fdec==true)) {
			sh = quarter;
			//Testator left children or grandchildren, husband gets quarter
			detail("Mayit meninggalkan anak atau cucu, sehingga suami mendapatkan seperempat (1/4)");
		}
		else {
			sh = half;
			//Testator left no children nor grandchildren, husband gets half
			detail("Mayit tidak meninggalkan anak atau cucu, sehingga suami mendapatkan setengah (1/2)");
		}
		break;
	case wife:
		//husband and wife cannot have both survived
		if (!assertTrue(nheirs[husband]==0, "suami atau istri tidak mungkin kedua-duanya hidup")) return false;
		deprive(husband,"karena dia adalah si mayit!");//because he is the testator
		if ((mdec==true) || (fdec==true)) {
			sh = eighth;
			//Testator left children or grandchildren, wife gets one eighth
			detail("Mayit meninggalkan anak atau cucu, sehingga istri mendapatkan seperdelapan (1/8)");
		}
		else {
			sh = quarter;
			//Testator left no children nor grandchildren, wife gets quarter
			detail("Mayit tidak meninggalkan anak atau cucu, istri mendapatkan seperempat (1/4)");
		}
		break;
	case father:
		deprive(gfather,"karena ayah");//because of father
		if (school != Hanbali) deprive(gmotherF,"karena ayah");
		depriveRange(brother,treasury,"karena ayah");
		if (mdec==true) {
			sh = sixth;
			//Testator left male descendants, father gets one sixth
			detail("Mayit meninggalkan keturunan laki-laki, ayah mendapatkan seperenam (1/6)");
		}
		else if (fdec==true) {
			sh = sixth;
			//Testator left female descendants, father gets one sixth. He may get more by agnation
			detail("Mayit meninggalkan keturunan perempuan, ayah mendapatkan seperenam (1/6). Ia mungkin mendapatkan lebih melalui jalan agnasi");
		}
		else if ( ((nheirs[husband]*1+nheirs[wife]*1)>0) && (nheirs[mother]>0) ) {	//Al-Gharraa, or the Umariyyatan
			shares[father] = none;	//So we can add up the others
			shares[mother] = none;
			sumUp();
			sh = multiply(remain, twothirds);
			shares[mother] = multiply(remain, third);
			//Testator left a spouse, a father and a mother, father shares remainder with mother by ratio of 2:1 (Omar's verdict)
			detail("Mayit meninggalkan seorang istri (atau suami), sehingga ayah berbagi sisa dengan ibu dengan perbandingan 2: 1 (Keputusan Sayyidina Umar)");
		}
		else {
			//sh = third;
			//detail("Testator left no descendants, father gets one third. He may get more by agnation.");
			sh = toshare();
			//Testator left no descendants, father inherits by agnation.
			detail("Mayit tidak meninggalkan keturunan, sehingga ayah mendapatkan melalui agnasi");
		}
		break;
	case mother:
		deprive(gmotherM,"karena ibu");
		deprive(gmotherF,"karena ibu");
		//See if siblings have not been deprived
		var sumsib = none;
		sumsib = add(has(brother), sumsib);
		sumsib = add(has(sister), sumsib);
		sumsib = add(has(siblingM), sumsib);
		sumsib = add(has(brotherF), sumsib);
		sumsib = add(has(sisterF), sumsib);
		debug("Jumlah bagian waris dari seluruh saudara adalah " + toString(sumsib));
		var numsib = 0;
		numsib += nheirs[brother]*1;
		numsib += nheirs[sister]*1;
		numsib += nheirs[siblingM]*1;
		numsib += nheirs[brotherF]*1;
		numsib += nheirs[sisterF]*1;
		debug("Jumlah semua saudara = " + numsib);
		if ((mdec==true) || (fdec==true)) {
			sh = sixth;
			//Testator left decendants, mother gets one sixth
			detail("Mayit tidak meninggalkan keturunan, sehingga ibu mendapatkan seperenam (1/6)");
		}
		else if (numsib>1 && !isZero(sumsib)) {
			sh = sixth;
			//Testator left more than one sibling, mother gets one sixth
			detail("Mayit meninggalkan lebih dari satu saudara, sehingga ibu mendapatkan seperenam (1/6)");
		}
		else if ( (nheirs[husband]+nheirs[wife]>0) && (nheirs[father]>0) ) {
			//Do nothing. It's been taken care of under father above	//Omar's verdict
			//Testator left a spouse, a father and a mother, mother shares remainder with father by ratio of 1:2 (Omar's verdict)
			detail("Mayit meninggalkan seorang istri (atau suami), seorang ayah dan seorang ibu, sehingga ibu berbagi sisa dengan ayah dengan perbandingan 1:3 (Keputusan Sayyidina Umar)");
		}
		else	sh = third;
		break;
	case gfather:
		//because of father of father, according to Abu-Haneefa
		if (school==Hanafi) depriveRange(brother,treasury,"karena kakek dari ayah, menurut mahzab Hanafi");
		else depriveRange(siblingM,treasury,"karena kakek dari ayah");
		//See if we have the grandfther-and-brothers case
		var numsib = 0;
		numsib += nheirs[brother]*1;
		numsib += nheirs[sister]*1;
		numsib += nheirs[siblingM]*1;
		numsib += nheirs[brotherF]*1;
		numsib += nheirs[sisterF]*1;
		if (numsib > 0) gfb = true;
		if (mdec==true) {
			sh = sixth;
			//Testator left male descendants. Father of father gets one sixth
			detail("Mayit meninggalkan keturunan laki-laki. Sehingga kakek dari ayah mendapatkan seperenam (1/6).");
		}
		else if (fdec==true) {
			sh = sixth;
			//Testator left female descendants. Father of father gets one sixth. He may get more by agnation
			detail("Mayit meninggalkan keturunan perempuan. Sehingga kakek dari ayah mendapatkan seperenam (1/6). Ia mungkin mendaptkan lebih dengan jalan agnasi");
		}
		else {
			sh = toshare();
			//Testator left no descendants. Father of father inherits by agnation
			detail("Mayit tidak meninggalkan keturunan.");
		}
		break;
	case gmotherF:
		if ((school != 0) && !isVoid(gmotherM)) {
			var g = getGmGen();
			if ((g == 1) && ((school == Hanafi) || (school == Hanbali))) {
				//because mother of father is a younger generation than mother of mother (Hanafi and Hanbali juristic schools
				deprive(gmotherM, "karena nenek dari ayah lebih muda generasinya daripada nenek dari ibu (Mahzab Hanafi dan Hambali)");
				sh = sixth;
				//Mother of father gets one sixth as mother of mother is deprived
				detail("Nenek dari ayah mendapatkan seperenam (1/6) karena nenek dari ibu dihijab");
				break;
			}
			else if (g == 2) {
				//because mother of mother is a younger generation than mother of father
				deprive(gmotherF, "karena nenek dari ibu lebih mudah generasinya dari nenek dari ayah");
				sh = none;
				break;
			}
			else {
				sh = new Rational(1,12);
				//Mother of father shares with mother of mother, each gets 1/12
				detail("Nenek dari ayah berbagi dengan nenek dari ibu, masing-masing mendapatkan 1/12");
			}
		}
		else if (isVoid(gmotherM)) {
			sh = sixth;
			//No mother of mother or she got none, mother of father gets one sixth (Abu-Bakr's verdict)
			detail("Tidak ada nenek dari ibu atau ia tidak mendapatkan apa-apa, sehingga nenek dari ayah mendapatkan seperenam (1/6) (Keputusan Sayyidina Abu Bakar)");
		}
		else {
			sh = new Rational(1,12);
			//Mother of father shares with mother of mother, each gets 1/12
			detail("Nenek dari ayah berbagi dengan nenek dari ibu, masing-masing mendapatkan 1/12");
		}
		break;
	case gmotherM:
		if ((school != 0) && !isVoid(gmotherF)) {
			var g = getGmGen();
			if ((g == 1) && ((school == Hanafi) || (school == Hanbali))) {
				//because mother of father is a younger generation than mother of mother (Hanafi and Hanbali juristic schools)
				deprive(gmotherM, "karena nenek dari ayah lebih muda generasinya daripada nenek dari ibu (Mahzab Hanafi dan Hambali)");
				sh = none;
				break;
			}
			else if (g == 2) {
				//because mother of mother is a younger generation than mother of father
				deprive(gmotherF, "karena nenek dari ibu lebih muda generasinya daripada nenek dari ayah");
				sh = sixth;
				//Mother of father gets one sixth as mother of mother is deprived
				detail("Nenek dari ayah mendapatkan seperenam (1/6) karena nenek dari ibu dihijab");
				break;
			}
			else {
				sh = new Rational(1,12);
				//Mother of father shares with mother of mother, each gets 1/12
				detail("Nenek dari ayah berbagi dengan nenek dari ibu, masing-masing mendapatkan 1/12");
			}
		}
		else if (isVoid(gmotherF)) {
			sh = sixth;
			//No mother of father or she got none, mother of mother gets one sixth (Abu-Bakr's verdict)
			detail("Tidak ada nenek dari ayah atau ia tidak mendapatkan apa-apa, sehingga nenek dari ibu mendapatkan seperenam (1/6) (Keputusan Sayyidina Abu Bakar)");
		}
		else {
			sh = new Rational(1,12);
			//Mother of father shares with mother of mother, each gets 1/12
			detail("Nenek dari ayah berbagi dengan nenek dari ibu, masing-masing mendapatkan seperduabelas (1/12)");
		}
		break;
	case brother:
		if (n == 1) {
			deprive(brotherF,"karena saudara laki-laki");//because of brother
			deprive(sisterF,"karena saudara laki-laki");
			depriveRange(nephew,treasury,"karena saudara laki-laki");
		}
		else {
			deprive(brotherF,"karena saudara laki-laki");
			deprive(sisterF,"karena saudara laki-laki");
			depriveRange(nephew,treasury,"karena beberapa saudara laki-laki");
		}
		sh = toshare();
		if (n==1) detail("Saudara laki-laki mungkin mendapatkan bagian melalui jalan agnasi");//Brother may share by agnation
		else  detail("Saudara laki-laki mungkin mendapatkan bagian melalui jalan agnasi");
		break;
	case sister:
		if (nheirs[brotherF]==0 && (fdec==false))
			//because of one full sister and no half-brothers from father (cannot agnate)
			deprive(sisterF,"karena adanya satu saudara perempuan kandung seayah seibu dan tidak ada saudara laki-laki seayah (tidak bisa beragnasi)");
		if ((n==1) && (fdec==true))
			//because of one full sister and one or more female decendants
			deprive(sisterF,"karena adanya satu saudara perempuan kandung seayah seibu dan satu atau lebih keturunan perempuan");
		if (nheirs[brother]>0) {
			sh = multiply(has(brother), half);
			//Full sister will share with full brother by ratio of 1:2
			if (n==1 && nheirs[brother]==1) detail("Saudara perempuan seayah-seibu akan berbagai dengan saudara laki-laki seayah-seibu dengan perbandingan 1:2");
			else if (n==1 && nheirs[brother]>1) detail("Saudara perempuan seayah-seibu akan berbagai dengan saudara laki-laki seayah-seibu dengan perbandingan 1:2");
			else if (n>1 && nheirs[brother]==1) detail("Saudara perempuan seayah-seibu akan berbagai dengan saudara laki-laki seayah-seibu dengan perbandingan 1:2");
			else detail("Saudara perempuan seayah-seibu akan berbagai dengan saudara laki-laki seayah-seibu dengan perbandingan 1:2");
		}
		else if (fdec==true) {
			sh = toshare();
			fasab = true;
			detail("Saudara perempuan seayah seibu akan mendapatkan bagian melalui jalan agnasi");//Full sister(s) will share by agnation
			deprive(brotherF,"karena adanya agnasi perempuan");//because of female agnation
			deprive(sisterF,"karena adanya agnasi perempuan");
			depriveRange(nephew,treasury,"karena adanya agnasi perempuan");
		}
		else if (n==1) {
			sh = half;
			//One full sister and no full brothers, she gets half
			detail("Terdapat satu saudara kandung perempuan seayah seibu dan tidak ada saudara laki-laki seayah seibu, ia akan mendapatkan setengah (1/2)");
		}
		else {
		 	sh = twothirds;
			//More than one full sister and no full brothers, they share two thirds
			detail("Terdapat lebih dari satu saudara kandung perempuan seayah seibu dan tidak ada saudara laki-laki seayah seibu, mereka akan mendapatkan bagian dua pertiga (2/3)");
		}
		break;
	case brotherF:
		//because of half-brother from father
		if (n==1) depriveRange(nephew,treasury,"karena adanya saudara laki-laki seayah");
		else depriveRange(nephew,treasury,"karena adanya saudara laki-laki seayah");
		sh = toshare();
		//Half-brother from father will share by agnation
		if (n==1) detail("Saudara laki-laki seayah akan mendapatkan bagian dengan jalan agnasi");
		else detail("Saudara laki-laki seayah akan mendapatkan bagian dengan jalan agnasi");
		break;
	case sisterF:
		if (nheirs[brotherF]>0) {
			sh = multiply(has(brotherF), half);
			//Half-sister from father shares with half-brother from father by ratio of 1:2
			if (n==1 && nheirs[brotherF]==1) detail("Saudara perempuan seayah berbagi dengan saudara laki-laki seayah dengan perbandingan 1:2");
			else if (n==1 && nheirs[brotherF]>1) detail("Saudara perempuan seayah berbagi dengan saudara laki-laki seayah dengan perbandingan 1:2");
			else if (n>1 && nheirs[brotherF]==1) detail("Saudara perempuan seayah berbagi dengan saudara laki-laki seayah dengan perbandingan 1:2");
			else detail("Saudara perempuan seayah berbagi dengan saudara laki-laki seayah dengan perbandingan 1:2");
		}
		else if ((nheirs[sister]==1) && (fdec==false)) {
			sh = sixth;
			//One full sister and no half-brothers from father and no female decendants, so half-sister from father gets one sixth to complete two thirds
			if (n==1) detail("Satu orang saudara perempuan seayah seibu dan tidak ada saudara laki-laki seayah dan tidak adak keturunan perempuan, sehingga saudara perempuan seayah mendapatkan seperenam (1/6) untuk menggenapi dua pertiga (2/3)");
			else detail("Satu orang saudara perempuan seayah seibu dan tidak ada saudara laki-laki seayah dan tidak adak keturunan perempuan, sehingga saudara perempuan seayah mendapatkan seperenam (1/6) untuk menggenapi dua pertiga (2/3)");
		}
		else if (fdec==true) {
			sh = toshare();
			fasab = true;
			//Half sister(s) from father will share by agnation
			detail("Saudara perempuan seayah akan mendapatkan bagian melalui jalan agnasi");
			//because of female agnation
			depriveRange(nephew,treasury,"karena adanya agnasi perempuan");
		}
		else if (n==1) {
			sh = half;
			//One half-sister from father and no half-brothers from father, she gets half
			detail("Karena adanya satu saudara perempuan seayah dan tidak ada saudara laki-laki seyah, ia mendapatkan setengah (1/2)");
			//Case of nheirs[sister]>1 deprives sisterF is taken care of under sister above
		}
		else {
			sh = twothirds;
			//More than one half-sister from father and no half-brothers from father, they share two thirds
			detail("Terdapat lebih dari satu orang saudara perempuan seayah dan tidak ada saudara laki-laki seayah, mereka berbagai dua pertiga (2/3)");
		}
		break;
	case siblingM:
		debug(isVoid(brother)? "Tidak ada saudara laki-laki" : nheirs[brother]+" brother(s)");//No brothers
		if (n==1) {
			sh = sixth;
			detail("Satu saudara dari ibu, ia mendapatkan seperenam (1/6)");//One sibling from mother gets one sixth
		}
		else if (
			((school==Maliki) || (school==Shafii)) &&
			(nheirs[husband]>0) && (nheirs[mother]>0) &&
			isVoid(gfather) &&
			(!isVoid(brother)) && isVoid(sister)
		)
		{
			mushtarika = true;
			sh = toshare();
			//Mushtarika case: Sibling from mother shares with brothers (Malik/Shafii).
			detail("Kasus Mustharika: Saudara dari ibu berbagai dengan saudara laki-laki (Maliki/Syafi'i)");
		}
		else {
			sh = third;
			//More than one sibling from mother, they share in one third
			detail("Terdapat lebih dari satu saudara dari ibu, mereka berbagi sepertiga (1/3)");
		}
		break;
	case relativeM:
		if ((school==Maliki) || (school==Shafii)) deprive(relativeM, "dalam pendapat mahzab Maliki/Syafi'i");//in Maliki/Shafii opinions
		else sh = toshare();
		break;
	case treasury:
		sh = zero;
		break;
	default:	//e.g., uncle, etc.
		if (h<treasury) {
			sh = toshare();
			if (n==1) depriveRange(h+1, treasury, "karena "+heirCategory[h]);//because of
			else depriveRange(h+1, treasury, "karena "+heirsCategory[h]);
		}
	}
	gets(h, sh);
	return true;
}

//"Awl" (oversubscription), when sum of shares > 1
function redivide() {
	if (!assertTrue(isOversubscribed(), "pembagian ulang dipanggil ketika jumlah adalah " + toString(sum)))//redivide() called when sum is
		return;
	detail("<b" + ">*** Membagi ulang ***</b" + ">");//Redividing
	if (isNegative(shares[father])) {
		shares[father]=third;
		detail("Bagian ayah dikembalikan menjadi sepertiga (1/3) untuk pembagian ulang");//Father's share is restored to one third for redividing.
		sumUp();
	}
	//I don't think the above can happen
	if (isNegative(shares[gfather])) {
		if (school==Egypt) {
			shares[gfather]=sixth;
			//Father of father's share is restored to one sixth for redividing. (Egyptian law/Ali's opinion)
			detail("Bagian kakek dari ayah dikembalikan menjadi seperenam (1/6) untuk pembagian ulang. (Hukum Mesir/Pendapat Sayyidina Ali");
		}
		else {
			shares[gfather]=third;
			//Father of father's share is restored to one third for redividing. (Concensus/Zaid's opinion
			detail("Bagian kakek dari ayah dikembalikan menjadi sepertiga (1/3) untuk pembagian ulang (Konsensus/Pendapat Sayyidina Zaid");
		}
		sumUp();
	}
	//The above can happen, e.g., husband, mother, gfather, 2 sisters
	var sh = none;
	for (var i=firstHeir; i<=lastHeir; i++) {
		if ((!isVoid(i)) && isGt(shares[i],none)) {
		//if ( (nheirs[i]>0) && !isNegative(shares[i]) && !isZero(shares[i]) ) {
			gets(i, divide(shares[i], sum));
		}
	}
}

function isMaleAgnate(h) {
	return (h==son) || (h==gson) || (h==father) || (h==gfather) || (h==brother) || (h==brotherF) ||
		(h==nephew) || (h==nephewF) || (h==uncle) || (h==uncleF) || (h==cousin) || (h==cousinF);
}

function isFemaleAgnate(h) {
	return (h==daughter) || (h==gdaughter) || (h==sister) || (h==sisterF);
}

function existsFemaleAgnates() {
	return (
		(nheirs[daughter]>0 && ((!isVoid(sister)) || (!isVoid(sisterF))) ) ||
		(nheirs[gdaughter]>0 && ((!isVoid(sister)) || (!isVoid(sisterF))) )
	);
}

//Agnation
function sumOfParts(h1, h2) {
	var j,r;
	var rsum = none;
	for (var i=h1; i<=h2; i++) {
		j = has(i);
		if ((nheirs[i]>0) && isNegative(j)) {
			r = new Rational(j.num * nheirs[i], j.denom);
			rsum = subtract(rsum, r);		//Algebraic addition
		}
	}
	return rsum;
}

function agnate() {
	//We don't get here unless sum is less than 1
	//Agnation rules do not apply if estate is fully or oversubscribed
	if (!assertTrue(isUndersubscribed(), "Aturan agnasi tidak bisa diaplikasikan karena harta waris sudah terbagi semua")) return false;
	//divide remainder among agnates by their ratios
	//most of them are marked by -ve shares by now
	detail("<b" + ">*** Mengaplikasikan aturan agnasi  ***</b" + ">"); //Applying agnation rules
	var rsum = none;
	var j;
	var r;
	var special = (nheirs[father] != 0) && (mdec==false) && (fdec==true);
	if (special) {
		gets(father, toshare());		//his named share will be added later
		//Special case of father and no male descendants. He inherits his named share and by agnation.
		detail("");
	}
	var specialg = (!isVoid(gfather)) && (mdec==false) && (fdec==true);
	if (specialg) {
		gets(gfather, toshare());		//his named share will be added later
		//Special case of father of father and no male descendants. He inherits his named share and by agnation.
		detail("Kasus khusus kake dari ayah dan tidak ada keturunan laki-laki. Ia mewarisi bagian warisnya dan juga melalui jalan agnasi");
	}
	//Sum up again, father's or gfather's share may have changed
	sumUp();
	rsum = sumOfParts(firstHeir, lastHeir);
	detail("agnasi: Jumlah semua bagian adalah: " + toString(rsum));//agnate: Sum of parts is:

	for (i=firstHeir; i<=lastHeir; i++) {
		j = has(i);		//a -ve fraction indicating sharing
		if ((nheirs[i]>0) && isNegative(j)) {
			j.num = -(j.num) * nheirs[i];		//flip the -ve (sharing) mark
			r = divide(j, rsum);		//i's ratio in sharing
			//agnate: Share of ;in consolidation is:
			if (nheirs[i] == 1) detail("agnasi:Bagian dari " + heirCategory[i] + " dalam konsolidasi adalah " + toString(r));
			//agnate: Share of ; in consolidation is:
			else detail("agnasi: Bagian dari " + heirsCategory[i] + " dalam konsolidasi adalah " + toString(r));
			if ((i==gfather) && (school!=0) && (gfb==true)) {
				//Handle the grandfather-and-brothers case
				var gb;
				if ((school==Maliki) || (school==Shafii) || (school==Hanbali)) {
					gb = multiply(remain, third);
					//Father of father gets a third of remainder (Malik/Shafii/Ibn-Hanbal)
					detail("Kakek dari ayah mendapatkan sepertiga (1/3) dari sisa (Mahzab Maliki/Syafi'i/Hambali");
				}
				else {
					gb = multiply(r, remain);
				}
				if (isLt(gb, sixth)) {
					gets(gfather, sixth);
					//Share of father of father by agnation is increased to the minimum of one sixth.
					detail("Bagian kakek dari ayah melalui jalan agnasi ditambahkan minimum seperenam (1/6)");
				}
				else {
					gets(gfather, gb);		//regular share in agnation
				}
				sumUp();
				//Recalculate the sum of parts for everyone above gfather
				rsum = sumOfParts(gmotherF, lastHeir);
			}
			else if (mushtarika==true) {
				//Handle the Mushtarika case
				gets(i, multiply(r, remain));		//i's share in agnation									//That's all we need. Everything else appears to have been taken care of already
			}
			else {
				gets(i, multiply(r, remain));		//i's share in agnation
			}
		}
	}
	if (!addsUp()) {
		if (special==true) {
			var v = add(has(father), sixth);	//his named share added
			gets(father, min(v, remain));
		}
		else if (specialg==true)
			if (gfb==false) {
				var vg = add(has(gfather), sixth);	//his named share added
				gets(gfather, min(vg, remain));
			}
	}

	if (!addsUp()) {		//e.g., case of father with fdec
		//agnate: distribution still incomplete after applying agnation rules
		detail("agnasi: distribusi masih belum sempurna setelah mengaplikasikan semua aturan-aturan.\n" + getHeirList());
		//Again, the only possibility now is that sum < 1
		//Agnation rules do not apply if estate is fully or oversubscribed
		if (!assertTrue(isUndersubscribed(), "Aturan agnasi tidak bisa diaplikasikan jika harta waris sudah semuanya terbagikan")) return false;

		for (var k=firstHeir; k<=lastHeir; k++) {
			if ( isMaleAgnate(k) && !isVoid(k) ) {
				//gets(k, add(remain, has(k)));		//he gets the rest
				gets(k, remain);
				//gets the rest being the nearest male agnate
				if (nheirs[k] == 1) detail(heirCategory[k] + " mendapatkan semuanya karena menjadi kerabat laki-laki terdekat yang beragnasi");
				else detail(heirsCategory[k] + " mendapatkan semuanya karena menjadi kerabat laki-laki terdekat yang beragnasi");//get the rest being the nearest male agnate
				break;
			}
		}
	}
	for (var h=firstHeir; h<=lastHeir; h++) {
		if ((nheirs[h]>0) && isNegative(has(h)))
			deprive(h,"karena agnasi dan/atau sudah terbagikan semuanya sudah diaplikasikan");//because agnation and/or oversubscription have already been applied
		//if he didn't get it by now, he doesn't. e.g., brotherF
	}

	//By now sum is either 1 or less
	sumUp();
	if (isUndersubscribed()) {
		//See if there is female agnation
		var halfremain = multiply(remain, half);
		if (!existsFemaleAgnates()) {
			detail("Tidak ada agnasi perempuan");//No female agnation
			return true;
		}
		else if ((nheirs[daughter]>0) && (!isVoid(sister))) {
			gets(daughter, halfremain);
			gets(sister, halfremain);
		}
		else if ((nheirs[daughter]>0) && (!isVoid(sisterF))) {
			gets(daughter, halfremain);
			gets(sisterF, halfremain);
		}
		else if ((!isVoid(gdaughter)) && (!isVoid(sister))) {
			gets(gdaughter, halfremain);
			gets(sister, halfremain);
		}
		else if ((!isVoid(gdaughter)) && (!isVoid(sisterF))) {
			gets(gdaughter, halfremain);
			gets(sisterF, halfremain);
		}
	}
	return true;
}

function adjustIfBequest() {
	if (isGt(bequestShare, none)) {
		var multiplier = subtract(whole, bequestShare);
		for (var h=son; h<=treasury; h++) {
			if (!isZero(has(h))) {
				//Bug fix: isVoid() checks nheirs which doesn't apply to treasury
				//Reducing share of ;from;because of bequest
				debug("Menurunkan bagian waris " + heirsCategory[h] + " dari " + toString(has(h)) + " karena adanya hadiah waris");
				gets(h, multiply(has(h), multiplier));
				//Share of ;reduced to ;because of bequest
				debug("Bagian waris dari " + heirsCategory[h] + " dikurangi menjadi " + toString(has(h)) + " karena adanya hadiah waris");
			}
		}
		gets(bequest, bequestShare);
	}
}

function calculateShares() {
	var rsum = none;
	var r1 = none;
	var r2 = none;
	var j = none;

	getHeirRange();			//sets firstHeir and lastHeir
	//Calculation of heir range failed!
	assertTrue((firstHeir>=0) && (lastHeir<treasury), "Penghitungan jangkauan ahli waris gagal!");

	if (lastHeir == 0) {		//no heirs
		if (existsBequest) {
			shares[bequest] = bequestShare;
			for (i=son; i<treasury; i++) shares[i]=none;
			gets(treasury, subtract(whole,bequestShare));

		}
		else {
			gets(treasury, whole);
			//No heirs and no bequest to non-heirs, Islamic treasury gets entire estate
			detail("Tidak ada ahli waris dan tidak ada hadiah waris ke bukan ahli waris, Baitul mal mendapatkan seluruh harta waris");
		}
		return true;
	}

	else if (lastHeir == firstHeir) {	//sole heir
		if ((lastHeir==husband) || (lastHeir==wife)) {
			if (allowRuddToSpouses || (school==Egypt)) {
				gets(lastHeir, whole);
				//Spouse is sole heir and reversion to spouses is allowed. Spouse gets whole estate.
				detail("Suami/istri adalah ahli waris tunggal dan pengembalian ke suami/istri diperbolehkan. Suami/istri mendapatkah semua harta waris");
			}
			//Majority opinion do not include spouses in Rudd
			else {
				gets(lastHeir, namedShares[lastHeir]);
				gets(treasury, subtract(whole, has(lastHeir)));
				//Spouse is sole heir but reversion to spouses is not allowed. Islamic treasury gets remainder of estate.
				detail("Suami/istri adalah ahli waris tunggal namun pengembalian ke suami/istri tidak dibolehkan. Baitul mal mendapatkan sisa harta waris");
			}
		}
		else if ((lastHeir == relativeM) && ((school == Maliki) || (school == Shafii))) {
			if (existsBequest) {
				bequestShare = whole;
				//Relatives to mother do not inherit (Malik/Shafii). Bequest to non-heirs is increased to whole estate.
				detail("Kerabat ibu tidak mewarisi (Mahzab Maliki/Syafi'i). Hadiah waris ke bukan ahli waris ditambahkan sampai mencapai jumlah seluruh harta waris");
			}
			else {
				gets(treasury, whole);
				//Relatives to mother do not inherit (Malik/Shafii). Islamic treasury gets entire estate.
				detail("Kerabat ibu tidak mewarisi (Mahzab Maliki/Syafii. Baitul mal mendaptkan seluruh harta waris");
			}
			gets(relativeM, none);
		}
		else {
			gets(lastHeir, whole);
		}
	}
	else {
		for (var i=firstHeir; i<=lastHeir; i++)
			if (!calcShare(i)) return false;

		sumUp();
		if (isOversubscribed()) {		//Awl (oversubscription)
			detail("===> Terjadi pembagian berlebih. Memulai pembagian ulang...");//Oversubscription occurred. Redividing...
			redivide();
			//Sanity check:
			//Estate not fully subscribed after redivision
			if (!assertTrue(addsUp(), "Harta waris tidak terbagi habis setelah pembagian ulang")) return false;
		}
		else if (isUndersubscribed()) {	//Agnation then reversion (undersubscription)
			if (!agnate()) return false;
			//sum of shares must be <=1 by now
			if (isUndersubscribed()) {
				//no agnates; divide among named heirs, i.e., Rudd (undersubscription)
				if (school == Maliki) {
					if (allowRudd == false)
						//Following Maliki juristic school which does not allow reversion
						detail("Mengikuti Mahzab Maliki yang tidak membolehkan pengembalian");
					else
						detail("Pengguna mengatur adanya pengembalian");//User prefers to allow reversion
				}
				else if (allowRudd == false)
					//User prefers to not allow reversion
					detail("Pengguna mengatur tidak boleh ada pengembalian");
				if (allowRuddToSpouses == true)
					//User prefers to allow reversion to spouses
					detail("Pengguna mengatur adanya pengembalian ke suami/istri");
				if (allowRudd == true) {
					//No agnates, dividing remainder among named heirs by ratio of their named shares
					detail("===> Tidak ada agnasi, membagi sisa diantara ahli waris yang berhak dengan perbandingan menurut bagian warisnya");
					rsum = none;
					for (var k=firstHeir; k<=lastHeir; k++) {
						if ((nheirs[k]>0) && isRevertTo(k))
							rsum = add(rsum, has(k));
					}
					//calcualteShares: Sum of parts is:
					detail("hitungBagian: Jumlah semua bagian adalah: " + toString(rsum));
					for (var h=firstHeir; h<=lastHeir; h++) {
						if ((nheirs[h]>0) && isRevertTo(h)) {
							j = has(h);
							r1 = divide(j, rsum);
							r2 = multiply(r1, remain);	//additional share
							//Adding ; to share of
							if (nheirs[h]==1) detail("Menambahkan " + toString(r2) + " ke bagian " + heirCategory[h]);
							//Adding ; to share of
							else detail("Menambahan " + toString(r2) + " ke bagian " + heirsCategory[h]);
							gets(h, add(j, r2));
						}
					}
				}
				else {
					gets(treasury, remain);
				}
			}
		}
	}

	//sum = whole, so make sure any -ve share marks left are voided
	for (var i=son; i<=treasury; i++) {
		if ((nheirs[i] > 0) && isNegative(has(i)))
			//Because estate is now fully subscribed after applying all the rules
			deprive(i, "Karena sekarang harta waris sudah semuanya terbagikan setelah mengaplikasikan semua aturan-aturan");
	}

	detail("<b" + ">*** Menjumlahkan seluruhnya ***</b" + ">");//Summing up
	if (addsUp()) {
		detail("Harta waris semuanya terbagikan");//Estate is fully subscribed
	}
	else {
		detail("Harta waris tidak semuanya terbagikan");//Estate is not fully subscribed
		return false;
	}

	//Final sanity checks
	detail("<b" + ">*** Penjumlahan Akhir ***</b" + ">"); //Final sum-up
	//Final sum of shares is ; after agnation and reversion!
	if (!assertTrue(addsUp(), "Jumlah bagian waris terakhir adalah " + toString(sum) + " setelah melalui agnasi dan pengembalian")) return false;

	adjustIfBequest();

	if (nheirs[son]>0) if (!assertTrue(!isZero(has(son)), "Anak laki-laki tidak mewarisi!")) return false;
	if (nheirs[daughter]>0) if (!assertTrue(!isZero(has(daughter)), "Anak perempuan tidak mewarisi!")) return false;
	if (nheirs[husband]>0) if (!assertTrue(!isZero(has(husband)), "Suami tidak mewarisi!")) return false;
	if (nheirs[wife]>0) if (!assertTrue(!isZero(has(wife)), "Istri tidak mewarisi!")) return false;
	if (nheirs[father]>0) if (!assertTrue(!isZero(has(father)), "Ayah tidak mewarisi")) return false;
	if (nheirs[mother]>0) if (!assertTrue(!isZero(has(mother)), "Ibu tidak mewarisi!")) return false;//Mother did not inherit!

	detail("*** AKHIR Perhitungan ***"); //END Calculations
	return true;
}
