diff --git a/financials.png b/financials.png
index b7867cd..287bb1d 100644
Binary files a/financials.png and b/financials.png differ
diff --git a/financials10.png b/financials10.png
index 9c34145..9eaf8fe 100644
Binary files a/financials10.png and b/financials10.png differ
diff --git a/financials2.png b/financials2.png
index fa28df0..afd591f 100644
Binary files a/financials2.png and b/financials2.png differ
diff --git a/financials3.png b/financials3.png
index bb8e38a..5c6abfe 100644
Binary files a/financials3.png and b/financials3.png differ
diff --git a/financials6.png b/financials6.png
index a2d4b45..734df9f 100644
Binary files a/financials6.png and b/financials6.png differ
diff --git a/financials7.png b/financials7.png
index 7d4e1d4..3ebd02f 100644
Binary files a/financials7.png and b/financials7.png differ
diff --git a/financials9.png b/financials9.png
index 84854d5..52a16fe 100644
Binary files a/financials9.png and b/financials9.png differ
diff --git a/src/class/class_bullion.c b/src/class/class_bullion.c
index ce048b5..3438ac9 100644
--- a/src/class/class_bullion.c
+++ b/src/class/class_bullion.c
@@ -50,9 +50,10 @@ static metal *
MetalClassObject; /* A class handle to the bullion class object pointers. */
/* Class Method (also called Function) Definitions */
-static void convert_bullion_to_strings(bullion *B, guint8 digits_right) {
+static void convert_bullion_to_strings(bullion *B, gchar *metal_ch,
+ guint8 digits_right) {
/* Basic metal data */
- DoubleToFormattedStrPango(&B->ounce_mrkd_ch, B->ounce_f, 4, NUM_STR, BLACK);
+ SymbolStrPango(&B->metal_mrkd_ch, metal_ch, B->ounce_f, 4, BLUE);
DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right,
MON_STR, BLACK);
@@ -61,67 +62,47 @@ static void convert_bullion_to_strings(bullion *B, guint8 digits_right) {
B->prev_closing_metal_f, digits_right, MON_STR,
BLACK);
- DoubleToFormattedStrPango(&B->high_metal_mrkd_ch, B->high_metal_f,
- digits_right, MON_STR, BLACK);
-
- DoubleToFormattedStrPango(&B->low_metal_mrkd_ch, B->low_metal_f, digits_right,
+ DoubleToFormattedStrPango(&B->cost_mrkd_ch, B->cost_basis_f, digits_right,
MON_STR, BLACK);
+ RangeStrPango(&B->range_mrkd_ch, B->low_metal_f, B->high_metal_f,
+ digits_right);
+
DoubleToFormattedStrPango(&B->spot_price_mrkd_ch, B->spot_price_f,
digits_right, MON_STR, BLACK);
DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right,
MON_STR, BLACK);
- /* The total invested in this metal */
- DoubleToFormattedStrPango(&B->port_value_mrkd_ch, B->port_value_f,
- digits_right, MON_STR, BLACK);
-
- if (B->change_ounce_f > 0) {
- /* The change in spot price per ounce. */
- DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f,
- digits_right, MON_STR, GREEN);
-
- /* The change in total investment in this metal. */
- DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f,
- digits_right, MON_STR, GREEN);
-
- /* The change in total investment in this metal as a percentage. */
- DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f,
- digits_right, PER_STR, GREEN);
- } else if (B->change_ounce_f < 0) {
- DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f,
- digits_right, MON_STR, RED);
-
- DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f,
- digits_right, MON_STR, RED);
-
- DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f,
- digits_right, PER_STR, RED);
- } else {
- DoubleToFormattedStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f,
- digits_right, MON_STR, BLACK);
-
- DoubleToFormattedStrPango(&B->change_value_mrkd_ch, B->change_value_f,
- digits_right, MON_STR, BLACK);
+ /* The change in spot price per ounce. */
+ ChangeStrPango(&B->change_ounce_mrkd_ch, B->change_ounce_f,
+ B->change_percent_f, digits_right);
- DoubleToFormattedStrPango(&B->change_percent_mrkd_ch, B->change_percent_f,
- digits_right, PER_STR, BLACK);
- }
+ /* The total invested in this metal */
+ TotalStrPango(&B->port_value_mrkd_ch, B->port_value_f, B->change_value_f,
+ digits_right);
/* The raw change in bullion as a percentage. */
DoubleToFormattedStr(&B->change_percent_raw_ch, B->change_percent_raw_f, 2,
PER_STR);
+
+ /* The total cost of this metal. */
+ DoubleToFormattedStrPango(&B->total_cost_mrkd_ch, B->total_cost_f,
+ digits_right, MON_STR, BLACK);
+
+ /* The total gain since purchase [value and percentage]. */
+ ChangeStrPango(&B->total_gain_mrkd_ch, B->total_gain_value_f,
+ B->total_gain_percent_f, digits_right);
}
static void ToStrings(guint8 digits_right) {
metal *M = MetalClassObject;
- convert_bullion_to_strings(M->Gold, digits_right);
- convert_bullion_to_strings(M->Silver, digits_right);
+ convert_bullion_to_strings(M->Gold, "Gold", digits_right);
+ convert_bullion_to_strings(M->Silver, "Silver", digits_right);
if (M->Platinum->ounce_f > 0)
- convert_bullion_to_strings(M->Platinum, digits_right);
+ convert_bullion_to_strings(M->Platinum, "Platinum", digits_right);
if (M->Palladium->ounce_f > 0)
- convert_bullion_to_strings(M->Palladium, digits_right);
+ convert_bullion_to_strings(M->Palladium, "Palladium", digits_right);
/* The total investment in bullion. */
DoubleToFormattedStrPango(&M->bullion_port_value_mrkd_ch,
@@ -129,36 +110,23 @@ static void ToStrings(guint8 digits_right) {
BLACK);
/* The change in total investment in bullion. */
- if (M->bullion_port_value_chg_f > 0)
- DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch,
- M->bullion_port_value_chg_f, digits_right,
- MON_STR, GREEN);
- else if (M->bullion_port_value_chg_f < 0)
- DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch,
- M->bullion_port_value_chg_f, digits_right,
- MON_STR, RED);
- else
- DoubleToFormattedStrPango(&M->bullion_port_value_chg_mrkd_ch,
- M->bullion_port_value_chg_f, digits_right,
- MON_STR, BLACK);
-
- /* The change in total investment in bullion as a percentage. */
- if (M->bullion_port_value_p_chg_f > 0)
- DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch,
- M->bullion_port_value_p_chg_f, digits_right,
- PER_STR, GREEN);
- else if (M->bullion_port_value_p_chg_f < 0)
- DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch,
- M->bullion_port_value_p_chg_f, digits_right,
- PER_STR, RED);
- else
- DoubleToFormattedStrPango(&M->bullion_port_value_p_chg_mrkd_ch,
- M->bullion_port_value_p_chg_f, digits_right,
- PER_STR, BLACK);
+ ChangeStrPango(&M->bullion_port_day_gain_mrkd_ch,
+ M->bullion_port_day_gain_val_f, M->bullion_port_day_gain_per_f,
+ digits_right);
/* The Gold to Silver Ratio */
DoubleToFormattedStr(&M->gold_silver_ratio_ch, M->gold_silver_ratio_f, 2,
NUM_STR);
+
+ /* The total cost of the metal portfolio. */
+ DoubleToFormattedStrPango(&M->bullion_port_cost_mrkd_ch,
+ M->bullion_port_cost_f, digits_right, MON_STR,
+ BLACK);
+
+ /* The total portfolio gain since purchase [value and percentage]. */
+ ChangeStrPango(&M->bullion_port_total_gain_mrkd_ch,
+ M->bullion_port_total_gain_value_f,
+ M->bullion_port_total_gain_percent_f, digits_right);
}
static void bullion_calculations(bullion *B) {
@@ -189,6 +157,15 @@ static void bullion_calculations(bullion *B) {
else
B->change_percent_raw_f =
CalcGain(B->spot_price_f, B->prev_closing_metal_f);
+
+ /* The total cost */
+ B->total_cost_f = B->cost_basis_f * B->ounce_f;
+
+ /* The total gain since purchase */
+ B->total_gain_value_f = B->port_value_f - B->total_cost_f;
+
+ /* The total gain since purchase, percentage*/
+ B->total_gain_percent_f = CalcGain(B->port_value_f, B->total_cost_f);
}
static void Calculate() {
@@ -209,22 +186,35 @@ static void Calculate() {
M->Palladium->port_value_f;
/* The change in total investment in bullion. */
- M->bullion_port_value_chg_f = M->Gold->change_value_f;
- M->bullion_port_value_chg_f += M->Silver->change_value_f;
- M->bullion_port_value_chg_f += M->Platinum->change_value_f;
- M->bullion_port_value_chg_f += M->Palladium->change_value_f;
+ M->bullion_port_day_gain_val_f = M->Gold->change_value_f;
+ M->bullion_port_day_gain_val_f += M->Silver->change_value_f;
+ M->bullion_port_day_gain_val_f += M->Platinum->change_value_f;
+ M->bullion_port_day_gain_val_f += M->Palladium->change_value_f;
/* The change in total investment in bullion as a percentage. */
- gdouble prev_total = M->bullion_port_value_f - M->bullion_port_value_chg_f;
+ gdouble prev_total = M->bullion_port_value_f - M->bullion_port_day_gain_val_f;
if (prev_total == 0.0f)
- M->bullion_port_value_p_chg_f = 0.0f;
+ M->bullion_port_day_gain_per_f = 0.0f;
else
- M->bullion_port_value_p_chg_f =
+ M->bullion_port_day_gain_per_f =
CalcGain(M->bullion_port_value_f, prev_total);
/* The Gold to Silver Ratio */
if (M->Silver->spot_price_f > 0)
M->gold_silver_ratio_f = M->Gold->spot_price_f / M->Silver->spot_price_f;
+
+ /* The total cost of all bullion */
+ M->bullion_port_cost_f = M->Gold->total_cost_f + M->Silver->total_cost_f +
+ M->Platinum->total_cost_f +
+ M->Palladium->total_cost_f;
+
+ /* The total gain of all bullion, since purchase, value. */
+ M->bullion_port_total_gain_value_f =
+ M->bullion_port_value_f - M->bullion_port_cost_f;
+
+ /* The total gain of all bullion, since purchase, percentage. */
+ M->bullion_port_total_gain_percent_f =
+ CalcGain(M->bullion_port_value_f, M->bullion_port_cost_f);
}
static gint SetUpCurl(portfolio_packet *pkg) {
@@ -324,20 +314,25 @@ static bullion *class_init_bullion() {
new_class->change_percent_f = 0.0f;
new_class->change_percent_raw_f = 0.0f;
+ new_class->cost_basis_f = 0.0f;
+ new_class->total_cost_f = 0.0f;
+ new_class->total_gain_value_f = 0.0f;
+ new_class->total_gain_percent_f = 0.0f;
+
new_class->url_ch = NULL;
+ new_class->metal_mrkd_ch = NULL;
new_class->spot_price_mrkd_ch = NULL;
new_class->premium_mrkd_ch = NULL;
new_class->port_value_mrkd_ch = NULL;
- new_class->ounce_mrkd_ch = NULL;
- new_class->high_metal_mrkd_ch = NULL;
- new_class->low_metal_mrkd_ch = NULL;
+ new_class->cost_mrkd_ch = NULL;
+ new_class->range_mrkd_ch = NULL;
new_class->prev_closing_metal_mrkd_ch = NULL;
new_class->change_ounce_mrkd_ch = NULL;
- new_class->change_value_mrkd_ch = NULL;
- new_class->change_percent_mrkd_ch = NULL;
new_class->change_percent_raw_ch = NULL;
+ new_class->total_cost_mrkd_ch = NULL;
+ new_class->total_gain_mrkd_ch = NULL;
new_class->YAHOO_hnd = curl_easy_init();
new_class->CURLDATA.memory = NULL;
@@ -359,15 +354,21 @@ metal *ClassInitMetal() {
/* Initialize Variables */
new_class->bullion_port_value_f = 0.0f;
- new_class->bullion_port_value_chg_f = 0.0f;
- new_class->bullion_port_value_p_chg_f = 0.0f;
+ new_class->bullion_port_day_gain_val_f = 0.0f;
+ new_class->bullion_port_day_gain_per_f = 0.0f;
new_class->gold_silver_ratio_f = 0.0f;
+ new_class->bullion_port_cost_f = 0.0f;
+ new_class->bullion_port_total_gain_value_f = 0.0f;
+ new_class->bullion_port_total_gain_percent_f = 0.0f;
+
new_class->bullion_port_value_mrkd_ch = NULL;
- new_class->bullion_port_value_chg_mrkd_ch = NULL;
- new_class->bullion_port_value_p_chg_mrkd_ch = NULL;
+ new_class->bullion_port_day_gain_mrkd_ch = NULL;
new_class->gold_silver_ratio_ch = NULL;
+ new_class->bullion_port_cost_mrkd_ch = NULL;
+ new_class->bullion_port_total_gain_mrkd_ch = NULL;
+
/* Connect Function Pointers To Function Definitions */
new_class->ToStrings = ToStrings;
new_class->Calculate = Calculate;
@@ -384,6 +385,8 @@ metal *ClassInitMetal() {
/* Class Destruct Functions */
static void class_destruct_bullion(bullion *bullion_class) {
/* Free Memory */
+ if (bullion_class->metal_mrkd_ch)
+ g_free(bullion_class->metal_mrkd_ch);
if (bullion_class->url_ch)
g_free(bullion_class->url_ch);
if (bullion_class->spot_price_mrkd_ch)
@@ -392,23 +395,21 @@ static void class_destruct_bullion(bullion *bullion_class) {
g_free(bullion_class->premium_mrkd_ch);
if (bullion_class->port_value_mrkd_ch)
g_free(bullion_class->port_value_mrkd_ch);
- if (bullion_class->ounce_mrkd_ch)
- g_free(bullion_class->ounce_mrkd_ch);
- if (bullion_class->high_metal_mrkd_ch)
- g_free(bullion_class->high_metal_mrkd_ch);
- if (bullion_class->low_metal_mrkd_ch)
- g_free(bullion_class->low_metal_mrkd_ch);
+ if (bullion_class->cost_mrkd_ch)
+ g_free(bullion_class->cost_mrkd_ch);
+ if (bullion_class->range_mrkd_ch)
+ g_free(bullion_class->range_mrkd_ch);
if (bullion_class->prev_closing_metal_mrkd_ch)
g_free(bullion_class->prev_closing_metal_mrkd_ch);
if (bullion_class->change_ounce_mrkd_ch)
g_free(bullion_class->change_ounce_mrkd_ch);
- if (bullion_class->change_value_mrkd_ch)
- g_free(bullion_class->change_value_mrkd_ch);
- if (bullion_class->change_percent_mrkd_ch)
- g_free(bullion_class->change_percent_mrkd_ch);
if (bullion_class->change_percent_raw_ch)
g_free(bullion_class->change_percent_raw_ch);
+ if (bullion_class->total_cost_mrkd_ch)
+ g_free(bullion_class->total_cost_mrkd_ch);
+ if (bullion_class->total_gain_mrkd_ch)
+ g_free(bullion_class->total_gain_mrkd_ch);
if (bullion_class->YAHOO_hnd)
curl_easy_cleanup(bullion_class->YAHOO_hnd);
@@ -436,12 +437,14 @@ void ClassDestructMetal(metal *metal_handle) {
/* Free Pointer Memory */
if (metal_handle->bullion_port_value_mrkd_ch)
g_free(metal_handle->bullion_port_value_mrkd_ch);
- if (metal_handle->bullion_port_value_chg_mrkd_ch)
- g_free(metal_handle->bullion_port_value_chg_mrkd_ch);
- if (metal_handle->bullion_port_value_p_chg_mrkd_ch)
- g_free(metal_handle->bullion_port_value_p_chg_mrkd_ch);
+ if (metal_handle->bullion_port_day_gain_mrkd_ch)
+ g_free(metal_handle->bullion_port_day_gain_mrkd_ch);
if (metal_handle->gold_silver_ratio_ch)
g_free(metal_handle->gold_silver_ratio_ch);
+ if (metal_handle->bullion_port_cost_mrkd_ch)
+ g_free(metal_handle->bullion_port_cost_mrkd_ch);
+ if (metal_handle->bullion_port_total_gain_mrkd_ch)
+ g_free(metal_handle->bullion_port_total_gain_mrkd_ch);
if (metal_handle)
g_free(metal_handle);
diff --git a/src/class/class_equity.c b/src/class/class_equity.c
index fc5066e..54ef04d 100644
--- a/src/class/class_equity.c
+++ b/src/class/class_equity.c
@@ -60,97 +60,46 @@ static void convert_equity_to_strings(stock *S, guint8 digits_right) {
S->current_price_stock_f, digits_right, MON_STR,
BLACK);
- DoubleToFormattedStrPango(&S->high_stock_mrkd_ch, S->high_stock_f,
+ DoubleToFormattedStrPango(&S->opening_stock_mrkd_ch, S->opening_stock_f,
digits_right, MON_STR, BLACK);
- DoubleToFormattedStrPango(&S->low_stock_mrkd_ch, S->low_stock_f, digits_right,
+ DoubleToFormattedStrPango(&S->cost_mrkd_ch, S->cost_basis_f, digits_right,
MON_STR, BLACK);
- DoubleToFormattedStrPango(&S->opening_stock_mrkd_ch, S->opening_stock_f,
- digits_right, MON_STR, BLACK);
+ RangeStrPango(&S->range_mrkd_ch, S->low_stock_f, S->high_stock_f,
+ digits_right);
DoubleToFormattedStrPango(&S->prev_closing_stock_mrkd_ch,
S->prev_closing_stock_f, digits_right, MON_STR,
BLACK);
- if (S->change_value_f > 0)
- DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f,
- digits_right, MON_STR, GREEN);
- else if (S->change_value_f < 0)
- DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f,
- digits_right, MON_STR, RED);
- else
- DoubleToFormattedStrPango(&S->change_value_mrkd_ch, S->change_value_f,
- digits_right, MON_STR, BLACK);
+ ChangeStrPango(&S->change_share_stock_mrkd_ch, S->change_share_f,
+ S->change_percent_f, digits_right);
- DoubleToFormattedStrPango(&S->num_shares_stock_mrkd_ch,
- (gdouble)S->num_shares_stock_int, 0, NUM_STR,
- BLACK);
- switch (S->num_shares_stock_int) {
+ switch (S->quantity_int) {
case 0:
- if (S->change_share_f > 0) {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR,
- GREEN_ITALIC);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, GREEN_ITALIC);
-
- } else if (S->change_share_f < 0) {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR,
- RED_ITALIC);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, RED_ITALIC);
-
- } else {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR,
- BLACK_ITALIC);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, BLACK_ITALIC);
- }
-
- StringToStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch,
- BLACK_ITALIC);
+ SymbolStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch,
+ (gdouble)S->quantity_int, 0, BLACK_ITALIC);
break;
default:
- if (S->change_share_f > 0) {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR,
- GREEN);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, GREEN);
-
- } else if (S->change_share_f < 0) {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR, RED);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, RED);
-
- } else {
- DoubleToFormattedStrPango(&S->change_share_stock_mrkd_ch,
- S->change_share_f, digits_right, MON_STR,
- BLACK);
-
- DoubleToFormattedStrPango(&S->change_percent_mrkd_ch, S->change_percent_f,
- digits_right, PER_STR, BLACK);
- }
-
- StringToStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch, BLUE);
+ SymbolStrPango(&S->symbol_stock_mrkd_ch, S->symbol_stock_ch,
+ (gdouble)S->quantity_int, 0, BLUE);
break;
}
/* The total current investment in this equity. */
- DoubleToFormattedStrPango(&S->current_investment_stock_mrkd_ch,
- S->current_investment_stock_f, digits_right,
- MON_STR, BLACK);
+ TotalStrPango(&S->current_investment_stock_mrkd_ch,
+ S->current_investment_stock_f, S->change_value_f, digits_right);
+
+ /* The total cost of this investment. */
+ DoubleToFormattedStrPango(&S->total_cost_mrkd_ch, S->total_cost_f,
+ digits_right, MON_STR, BLACK);
+
+ /* The total investment gain since purchase [value and percentage]. */
+ ChangeStrPango(&S->total_gain_mrkd_ch, S->total_gain_value_f,
+ S->total_gain_percent_f, digits_right);
}
static void ToStrings(guint8 digits_right) {
@@ -163,45 +112,43 @@ static void ToStrings(guint8 digits_right) {
DoubleToFormattedStrPango(&F->stock_port_value_mrkd_ch, F->stock_port_value_f,
digits_right, MON_STR, BLACK);
- if (F->stock_port_value_chg_f > 0) {
- /* The equity portfolio's change in value. */
- DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch,
- F->stock_port_value_chg_f, digits_right, MON_STR,
- GREEN);
-
- /* The change in total investment in equity as a percentage. */
- DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch,
- F->stock_port_value_p_chg_f, digits_right,
- PER_STR, GREEN);
- } else if (F->stock_port_value_chg_f < 0) {
- DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch,
- F->stock_port_value_chg_f, digits_right, MON_STR,
- RED);
-
- DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch,
- F->stock_port_value_p_chg_f, digits_right,
- PER_STR, RED);
- } else {
- DoubleToFormattedStrPango(&F->stock_port_value_chg_mrkd_ch,
- F->stock_port_value_chg_f, digits_right, MON_STR,
- BLACK);
+ /* The equity portfolio's change in value. */
+ ChangeStrPango(&F->stock_port_day_gain_mrkd_ch, F->stock_port_day_gain_val_f,
+ F->stock_port_day_gain_per_f, digits_right);
- DoubleToFormattedStrPango(&F->stock_port_value_p_chg_mrkd_ch,
- F->stock_port_value_p_chg_f, digits_right,
- PER_STR, BLACK);
- }
+ /* The total cost of the equity portfolio. */
+ DoubleToFormattedStrPango(&F->stock_port_cost_mrkd_ch, F->stock_port_cost_f,
+ digits_right, MON_STR, BLACK);
+
+ /* The total portfolio gain since purchase [value and percentage]. */
+ ChangeStrPango(&F->stock_port_total_gain_mrkd_ch,
+ F->stock_port_total_gain_value_f,
+ F->stock_port_total_gain_percent_f, digits_right);
}
static void equity_calculations(stock *S) {
/* Calculate the stock holdings change. */
- if (S->num_shares_stock_int > 0)
- S->change_value_f = S->change_share_f * (gdouble)S->num_shares_stock_int;
+ if (S->quantity_int > 0)
+ S->change_value_f = S->change_share_f * (gdouble)S->quantity_int;
else
S->change_value_f = 0.0f;
/* The total current investment in this equity. */
S->current_investment_stock_f =
- (gdouble)S->num_shares_stock_int * S->current_price_stock_f;
+ (gdouble)S->quantity_int * S->current_price_stock_f;
+
+ /* The total cost of this investment. */
+ S->total_cost_f = S->cost_basis_f * (gdouble)S->quantity_int;
+
+ /* The total investment gain since purchase. */
+ S->total_gain_value_f = S->current_investment_stock_f - S->total_cost_f;
+
+ /* The total investment gain, as a percentage, since purchase. */
+ if (S->total_cost_f > 0)
+ S->total_gain_percent_f =
+ CalcGain(S->current_investment_stock_f, S->total_cost_f);
+ else
+ S->total_gain_percent_f = 0.0f;
}
static void Calculate() {
@@ -209,7 +156,8 @@ static void Calculate() {
/* Equity Calculations. */
F->stock_port_value_f = 0.0f;
- F->stock_port_value_chg_f = 0.0f;
+ F->stock_port_day_gain_val_f = 0.0f;
+ F->stock_port_cost_f = 0.0f;
for (guint8 g = 0; g < F->size; g++) {
equity_calculations(F->Equity[g]);
@@ -219,12 +167,26 @@ static void Calculate() {
/* Add the equity's change in value to the equity portfolio's change in
* value. */
- F->stock_port_value_chg_f += F->Equity[g]->change_value_f;
+ F->stock_port_day_gain_val_f += F->Equity[g]->change_value_f;
+
+ /* Add the equity cost to the portfolio cost. */
+ F->stock_port_cost_f += F->Equity[g]->total_cost_f;
}
/* The change in total investment in equity as a percentage. */
- gdouble prev_total = F->stock_port_value_f - F->stock_port_value_chg_f;
- F->stock_port_value_p_chg_f = CalcGain(F->stock_port_value_f, prev_total);
+ gdouble prev_total = F->stock_port_value_f - F->stock_port_day_gain_val_f;
+ F->stock_port_day_gain_per_f = CalcGain(F->stock_port_value_f, prev_total);
+
+ /* The gain as a value, since purchase. */
+ F->stock_port_total_gain_value_f =
+ F->stock_port_value_f - F->stock_port_cost_f;
+
+ /* The gain as a percentage, since purchase. */
+ if (F->stock_port_cost_f > 0)
+ F->stock_port_total_gain_percent_f =
+ CalcGain(F->stock_port_value_f, F->stock_port_cost_f);
+ else
+ F->stock_port_total_gain_percent_f = 0.0f;
}
static void GenerateURL(portfolio_packet *pkg) {
@@ -295,7 +257,8 @@ static void Reset() {
g_mutex_unlock(&mutexes[CLASS_MEMBER_MUTEX]);
}
-static void AddStock(const gchar *symbol, const gchar *shares)
+static void AddStock(const gchar *symbol, const gchar *shares,
+ const gchar *cost)
/* Adds a new stock object to our folder,
increments size. */
{
@@ -312,29 +275,29 @@ static void AddStock(const gchar *symbol, const gchar *shares)
/* class_init_equity returns an object pointer. */
F->Equity[F->size] = class_init_equity();
- /* Add The Shares To the stock object */
- F->Equity[F->size]->num_shares_stock_int =
+ /* Add the Shares to the stock object */
+ F->Equity[F->size]->quantity_int =
(guint)g_ascii_strtoll(shares ? shares : "0", NULL, 10);
- DoubleToFormattedStrPango(&F->Equity[F->size]->num_shares_stock_mrkd_ch,
- (gdouble)F->Equity[F->size]->num_shares_stock_int,
- 0, NUM_STR, BLACK);
+
+ /* Add the Cost to the stock object */
+ F->Equity[F->size]->cost_basis_f = g_ascii_strtod(cost ? cost : "0.0", NULL);
/* Add The Stock Symbol To the stock object */
/* This string is used to process the stock. */
CopyString(&F->Equity[F->size]->symbol_stock_ch, symbol);
- switch (F->Equity[F->size]->num_shares_stock_int) {
+ switch (F->Equity[F->size]->quantity_int) {
/* This string is used on TreeViews. */
case 0:
- StringToStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol,
- BLACK_ITALIC);
+ SymbolStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol,
+ (gdouble)F->Equity[F->size]->quantity_int, 0, BLACK_ITALIC);
break;
default:
- StringToStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol, BLUE);
+ SymbolStrPango(&F->Equity[F->size]->symbol_stock_mrkd_ch, symbol,
+ (gdouble)F->Equity[F->size]->quantity_int, 0, BLUE);
break;
}
F->size++;
-
g_mutex_unlock(&mutexes[CLASS_MEMBER_MUTEX]);
}
@@ -359,7 +322,7 @@ static void RemoveStock(const gchar *s)
j++;
}
/* g_realloc will free memory if assigned a smaller new value. */
- tmp = g_realloc(F->Equity, (F->size - 1) * sizeof(stock *));
+ tmp = g_realloc(F->Equity, (F->size * sizeof(stock *)));
if (tmp)
F->Equity = tmp;
F->size--;
@@ -462,7 +425,7 @@ static void SetSecurityNames(portfolio_packet *pkg) {
pkg->GetMetaClass());
remove_dash(security_name);
- if (F->Equity[g]->num_shares_stock_int)
+ if (F->Equity[g]->quantity_int)
StringToStrPango(&F->Equity[g]->security_name_mrkd_ch,
security_name ? security_name : "", BLUE);
else
@@ -484,7 +447,8 @@ static stock *class_init_equity() {
stock *new_class = (stock *)g_malloc(sizeof(*new_class));
/* Initialize Variables */
- new_class->num_shares_stock_int = 0;
+ new_class->quantity_int = 0;
+ new_class->cost_basis_f = 0.0f;
new_class->current_price_stock_f = 0.0f;
new_class->high_stock_f = 0.0f;
@@ -495,17 +459,20 @@ static stock *class_init_equity() {
new_class->change_value_f = 0.0f;
new_class->change_percent_f = 0.0f;
new_class->current_investment_stock_f = 0.0f;
+ new_class->total_cost_f = 0.0f;
+ new_class->total_gain_value_f = 0.0f;
+ new_class->total_gain_percent_f = 0.0f;
new_class->current_price_stock_mrkd_ch = NULL;
- new_class->high_stock_mrkd_ch = NULL;
- new_class->low_stock_mrkd_ch = NULL;
+ new_class->cost_mrkd_ch = NULL;
+ new_class->range_mrkd_ch = NULL;
new_class->opening_stock_mrkd_ch = NULL;
new_class->prev_closing_stock_mrkd_ch = NULL;
new_class->change_share_stock_mrkd_ch = NULL;
- new_class->change_value_mrkd_ch = NULL;
- new_class->change_percent_mrkd_ch = NULL;
new_class->current_investment_stock_mrkd_ch = NULL;
- new_class->num_shares_stock_mrkd_ch = NULL;
+ new_class->total_cost_mrkd_ch = NULL;
+ new_class->total_gain_mrkd_ch = NULL;
+
new_class->symbol_stock_mrkd_ch = NULL;
new_class->security_name_mrkd_ch = NULL;
@@ -530,12 +497,16 @@ equity_folder *ClassInitEquityFolder() {
/* Initialize Variables */
new_class->stock_port_value_mrkd_ch = NULL;
- new_class->stock_port_value_chg_mrkd_ch = NULL;
- new_class->stock_port_value_p_chg_mrkd_ch = NULL;
+ new_class->stock_port_day_gain_mrkd_ch = NULL;
+ new_class->stock_port_cost_mrkd_ch = NULL;
+ new_class->stock_port_total_gain_mrkd_ch = NULL;
new_class->stock_port_value_f = 0.0f;
- new_class->stock_port_value_chg_f = 0.0f;
- new_class->stock_port_value_p_chg_f = 0.0f;
+ new_class->stock_port_day_gain_val_f = 0.0f;
+ new_class->stock_port_day_gain_per_f = 0.0f;
+ new_class->stock_port_cost_f = 0.0f;
+ new_class->stock_port_total_gain_value_f = 0.0f;
+ new_class->stock_port_total_gain_percent_f = 0.0f;
/* Connect Function Pointers To Function Definitions */
new_class->ToStrings = ToStrings;
@@ -563,13 +534,13 @@ static void class_destruct_equity(stock *stock_class) {
g_free(stock_class->current_price_stock_mrkd_ch);
stock_class->current_price_stock_mrkd_ch = NULL;
}
- if (stock_class->high_stock_mrkd_ch) {
- g_free(stock_class->high_stock_mrkd_ch);
- stock_class->high_stock_mrkd_ch = NULL;
+ if (stock_class->cost_mrkd_ch) {
+ g_free(stock_class->cost_mrkd_ch);
+ stock_class->cost_mrkd_ch = NULL;
}
- if (stock_class->low_stock_mrkd_ch) {
- g_free(stock_class->low_stock_mrkd_ch);
- stock_class->low_stock_mrkd_ch = NULL;
+ if (stock_class->range_mrkd_ch) {
+ g_free(stock_class->range_mrkd_ch);
+ stock_class->range_mrkd_ch = NULL;
}
if (stock_class->opening_stock_mrkd_ch) {
g_free(stock_class->opening_stock_mrkd_ch);
@@ -583,23 +554,17 @@ static void class_destruct_equity(stock *stock_class) {
g_free(stock_class->change_share_stock_mrkd_ch);
stock_class->change_share_stock_mrkd_ch = NULL;
}
- if (stock_class->change_value_mrkd_ch) {
- g_free(stock_class->change_value_mrkd_ch);
- stock_class->change_value_mrkd_ch = NULL;
- }
- if (stock_class->change_percent_mrkd_ch) {
- g_free(stock_class->change_percent_mrkd_ch);
- stock_class->change_percent_mrkd_ch = NULL;
- }
-
if (stock_class->current_investment_stock_mrkd_ch) {
g_free(stock_class->current_investment_stock_mrkd_ch);
stock_class->current_investment_stock_mrkd_ch = NULL;
}
-
- if (stock_class->num_shares_stock_mrkd_ch) {
- g_free(stock_class->num_shares_stock_mrkd_ch);
- stock_class->num_shares_stock_mrkd_ch = NULL;
+ if (stock_class->total_cost_mrkd_ch) {
+ g_free(stock_class->total_cost_mrkd_ch);
+ stock_class->total_cost_mrkd_ch = NULL;
+ }
+ if (stock_class->total_gain_mrkd_ch) {
+ g_free(stock_class->total_gain_mrkd_ch);
+ stock_class->total_gain_mrkd_ch = NULL;
}
if (stock_class->symbol_stock_mrkd_ch) {
@@ -648,10 +613,13 @@ void ClassDestructEquityFolder(equity_folder *F) {
/* Free Pointer Memory */
if (F->stock_port_value_mrkd_ch)
g_free(F->stock_port_value_mrkd_ch);
- if (F->stock_port_value_chg_mrkd_ch)
- g_free(F->stock_port_value_chg_mrkd_ch);
- if (F->stock_port_value_p_chg_mrkd_ch)
- g_free(F->stock_port_value_p_chg_mrkd_ch);
+ if (F->stock_port_day_gain_mrkd_ch)
+ g_free(F->stock_port_day_gain_mrkd_ch);
+
+ if (F->stock_port_cost_mrkd_ch)
+ g_free(F->stock_port_cost_mrkd_ch);
+ if (F->stock_port_total_gain_mrkd_ch)
+ g_free(F->stock_port_total_gain_mrkd_ch);
if (F)
g_free(F);
diff --git a/src/class/class_meta.c b/src/class/class_meta.c
index 241cb4a..74ad69d 100644
--- a/src/class/class_meta.c
+++ b/src/class/class_meta.c
@@ -59,42 +59,23 @@ static void ToStringsPortfolio() {
Met->decimal_places_guint8, MON_STR, BLACK);
/* The total portfolio value. */
- DoubleToFormattedStrPango(&Met->portfolio_port_value_mrkd_ch,
- Met->portfolio_port_value_f,
- Met->decimal_places_guint8, MON_STR, BLACK);
-
- if (Met->portfolio_port_value_chg_f > 0) {
-
- /* The change in total portfolio value. */
- DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch,
- Met->portfolio_port_value_chg_f,
- Met->decimal_places_guint8, MON_STR, GREEN);
-
- /* The change in total portfolio value as a percentage. */
- DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch,
- Met->portfolio_port_value_p_chg_f,
- Met->decimal_places_guint8, PER_STR, GREEN);
-
- } else if (Met->portfolio_port_value_chg_f < 0) {
-
- DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch,
- Met->portfolio_port_value_chg_f,
- Met->decimal_places_guint8, MON_STR, RED);
+ DoubleToFormattedStrPango(&Met->portfolio_value_mrkd_ch,
+ Met->portfolio_value_f, Met->decimal_places_guint8,
+ MON_STR, BLACK);
- DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch,
- Met->portfolio_port_value_p_chg_f,
- Met->decimal_places_guint8, PER_STR, RED);
-
- } else {
+ /* The change in total portfolio value. */
+ ChangeStrPango(&Met->portfolio_day_gain_mrkd_ch,
+ Met->portfolio_day_gain_value_f,
+ Met->portfolio_day_gain_percent_f, Met->decimal_places_guint8);
- DoubleToFormattedStrPango(&Met->portfolio_port_value_chg_mrkd_ch,
- Met->portfolio_port_value_chg_f,
- Met->decimal_places_guint8, MON_STR, BLACK);
+ /* The total portfolio cost. */
+ DoubleToFormattedStrPango(&Met->portfolio_cost_mrkd_ch, Met->portfolio_cost_f,
+ Met->decimal_places_guint8, MON_STR, BLACK);
- DoubleToFormattedStrPango(&Met->portfolio_port_value_p_chg_mrkd_ch,
- Met->portfolio_port_value_p_chg_f,
- Met->decimal_places_guint8, PER_STR, BLACK);
- }
+ /* The total portfolio gain since purchase. */
+ ChangeStrPango(
+ &Met->portfolio_total_gain_mrkd_ch, Met->portfolio_total_gain_value_f,
+ Met->portfolio_total_gain_percent_f, Met->decimal_places_guint8);
}
static void CalculatePortfolio(portfolio_packet *pkg) {
@@ -103,20 +84,31 @@ static void CalculatePortfolio(portfolio_packet *pkg) {
equity_folder *F = pkg->GetEquityFolderClass();
/* The total portfolio value. */
- Met->portfolio_port_value_f =
+ Met->portfolio_value_f =
M->bullion_port_value_f + F->stock_port_value_f + Met->cash_f;
/* The change in total portfolio value. */
/* Edit the next line as needed, if you want to
add a change value besides equity and bullion to the portfolio. */
- Met->portfolio_port_value_chg_f =
- F->stock_port_value_chg_f + M->bullion_port_value_chg_f;
+ Met->portfolio_day_gain_value_f =
+ F->stock_port_day_gain_val_f + M->bullion_port_day_gain_val_f;
/* The change in total portfolio value as a percentage. */
- gdouble prev_total =
- Met->portfolio_port_value_f - Met->portfolio_port_value_chg_f;
- Met->portfolio_port_value_p_chg_f =
- CalcGain(Met->portfolio_port_value_f, prev_total);
+ gdouble prev_total = Met->portfolio_value_f - Met->portfolio_day_gain_value_f;
+ Met->portfolio_day_gain_percent_f =
+ CalcGain(Met->portfolio_value_f, prev_total);
+
+ /* The cost of the portfolio */
+ Met->portfolio_cost_f =
+ M->bullion_port_cost_f + F->stock_port_cost_f + Met->cash_f;
+
+ /* The gain of the portfolio, as a value */
+ Met->portfolio_total_gain_value_f =
+ Met->portfolio_value_f - Met->portfolio_cost_f;
+
+ /* The gain of the portfolio, as a percentage */
+ Met->portfolio_total_gain_percent_f =
+ CalcGain(Met->portfolio_value_f, Met->portfolio_cost_f);
}
static void StopHistoryCurl() {
@@ -283,165 +275,94 @@ static void ToStringsIndices() {
Met->crypto_bitcoin_value_p_chg_f, 2, PER_STR);
}
-/* The order of the strings, in these struct inits, is important,
- they match similar names within the struct definitions
+/* The order of the strings, in this struct init, is important,
+ they match similar names within the struct definition
(in class_types.h). */
-static const primary_heading primary_headings = {
- "Bullion", "Metal", "Ounces", "Premium", "High",
- "Low", "Pr. Close", "Chg", "Gain ($)", "Total",
- "Gain (%)", "Gold", "Silver", "Platinum", "Palladium",
- "Equity", "Symbol", "Shares", "Price", "Open",
- "Asset", "Value", "Cash", "Portfolio", "Portfolio has no assets."};
-
-static const default_heading default_headings = {"Bullion",
- "Metal",
- "Ounces",
- "Premium",
- "Gold",
- "Silver",
- "Platinum",
- "Palladium",
- "Equity",
- "Symbol",
- "Shares",
- "Cash",
- "Portfolio has no assets."};
-
-static void format_primary_headings_pango(primary_heading *pri_h_mkd) {
-
- StringToStrPango(&pri_h_mkd->metal, primary_headings.metal,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->ounces, primary_headings.ounces,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->price, primary_headings.price,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->premium, primary_headings.premium,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->high, primary_headings.high,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->low, primary_headings.low, HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->prev_closing, primary_headings.prev_closing,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->chg, primary_headings.chg, HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->gain_sym, primary_headings.gain_sym,
+static const heading_str_t heading_str = {
+ "Bullion", "Metal", "Premium", "Cost", "Range",
+ "Pr. Close", "Chg", "Gain", "Total", "Total Cost",
+ "Total Gain", "Equity", "Symbol", "Price", "Open",
+ "Asset", "Value", "Cash", "Portfolio", "Portfolio has no assets."};
+
+static void format_heading_str_pango(heading_str_t *headings_mkd) {
+
+ StringToStrPango(&headings_mkd->metal, heading_str.metal,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->total, primary_headings.total,
+ StringToStrPango(&headings_mkd->price, heading_str.price,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->gain_per, primary_headings.gain_per,
+ StringToStrPango(&headings_mkd->premium, heading_str.premium,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->symbol, primary_headings.symbol,
+ StringToStrPango(&headings_mkd->cost, heading_str.cost, HEADING_UNLN_FORMAT);
+ StringToStrPango(&headings_mkd->range, heading_str.range,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->shares, primary_headings.shares,
- HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->opening, primary_headings.opening,
+ StringToStrPango(&headings_mkd->prev_closing, heading_str.prev_closing,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->asset, primary_headings.asset,
+ StringToStrPango(&headings_mkd->chg, heading_str.chg, HEADING_UNLN_FORMAT);
+ StringToStrPango(&headings_mkd->day_gain, heading_str.day_gain,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->value, primary_headings.value,
+ StringToStrPango(&headings_mkd->total, heading_str.total,
HEADING_UNLN_FORMAT);
- StringToStrPango(&pri_h_mkd->cash, primary_headings.cash,
- HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&pri_h_mkd->bullion, primary_headings.bullion,
- HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&pri_h_mkd->equity, primary_headings.equity,
- HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&pri_h_mkd->portfolio, primary_headings.portfolio,
- HEADING_ASST_TYPE_FORMAT);
-
- StringToStrPango(&pri_h_mkd->gold, primary_headings.gold, BLUE);
- StringToStrPango(&pri_h_mkd->silver, primary_headings.silver, BLUE);
- StringToStrPango(&pri_h_mkd->platinum, primary_headings.platinum, BLUE);
- StringToStrPango(&pri_h_mkd->palladium, primary_headings.palladium, BLUE);
- StringToStrPango(&pri_h_mkd->no_assets, primary_headings.no_assets, BLUE);
-}
-
-static void format_default_headings_pango(default_heading *def_h_mkd) {
-
- StringToStrPango(&def_h_mkd->metal, default_headings.metal,
+ StringToStrPango(&headings_mkd->total_cost, heading_str.total_cost,
HEADING_UNLN_FORMAT);
- StringToStrPango(&def_h_mkd->ounces, default_headings.ounces,
+ StringToStrPango(&headings_mkd->total_gain, heading_str.total_gain,
HEADING_UNLN_FORMAT);
- StringToStrPango(&def_h_mkd->premium, default_headings.premium,
+ StringToStrPango(&headings_mkd->symbol, heading_str.symbol,
+ HEADING_UNLN_FORMAT);
+
+ StringToStrPango(&headings_mkd->opening, heading_str.opening,
HEADING_UNLN_FORMAT);
- StringToStrPango(&def_h_mkd->symbol, default_headings.symbol,
+ StringToStrPango(&headings_mkd->asset, heading_str.asset,
HEADING_UNLN_FORMAT);
- StringToStrPango(&def_h_mkd->shares, default_headings.shares,
+ StringToStrPango(&headings_mkd->value, heading_str.value,
HEADING_UNLN_FORMAT);
- StringToStrPango(&def_h_mkd->bullion, default_headings.bullion,
+ StringToStrPango(&headings_mkd->cash, heading_str.cash,
HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&def_h_mkd->equity, default_headings.equity,
+ StringToStrPango(&headings_mkd->bullion, heading_str.bullion,
HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&def_h_mkd->cash, default_headings.cash,
+ StringToStrPango(&headings_mkd->equity, heading_str.equity,
HEADING_ASST_TYPE_FORMAT);
- StringToStrPango(&def_h_mkd->gold, default_headings.gold, BLUE);
- StringToStrPango(&def_h_mkd->silver, default_headings.silver, BLUE);
- StringToStrPango(&def_h_mkd->platinum, default_headings.platinum, BLUE);
- StringToStrPango(&def_h_mkd->palladium, default_headings.palladium, BLUE);
- StringToStrPango(&def_h_mkd->no_assets, default_headings.no_assets, BLUE);
+ StringToStrPango(&headings_mkd->portfolio, heading_str.portfolio,
+ HEADING_ASST_TYPE_FORMAT);
+ StringToStrPango(&headings_mkd->no_assets, heading_str.no_assets, BLUE);
}
-static void free_primary_headings(primary_heading *pri_h_mkd) {
- g_free(pri_h_mkd->bullion);
- g_free(pri_h_mkd->metal);
- g_free(pri_h_mkd->ounces);
-
- g_free(pri_h_mkd->premium);
- g_free(pri_h_mkd->high);
- g_free(pri_h_mkd->low);
-
- g_free(pri_h_mkd->prev_closing);
- g_free(pri_h_mkd->chg);
- g_free(pri_h_mkd->gain_sym);
-
- g_free(pri_h_mkd->total);
- g_free(pri_h_mkd->gain_per);
- g_free(pri_h_mkd->gold);
-
- g_free(pri_h_mkd->silver);
- g_free(pri_h_mkd->platinum);
- g_free(pri_h_mkd->palladium);
+static void free_heading_str(heading_str_t *headings_mkd) {
+ g_free(headings_mkd->bullion);
+ g_free(headings_mkd->metal);
+ g_free(headings_mkd->premium);
- g_free(pri_h_mkd->equity);
- g_free(pri_h_mkd->symbol);
- g_free(pri_h_mkd->shares);
+ g_free(headings_mkd->cost);
+ g_free(headings_mkd->range);
+ g_free(headings_mkd->prev_closing);
- g_free(pri_h_mkd->price);
- g_free(pri_h_mkd->opening);
- g_free(pri_h_mkd->asset);
+ g_free(headings_mkd->chg);
+ g_free(headings_mkd->day_gain);
+ g_free(headings_mkd->total);
- g_free(pri_h_mkd->value);
- g_free(pri_h_mkd->cash);
- g_free(pri_h_mkd->portfolio);
+ g_free(headings_mkd->total_cost);
+ g_free(headings_mkd->total_gain);
+ g_free(headings_mkd->equity);
- g_free(pri_h_mkd->no_assets);
-}
-
-static void free_default_headings(default_heading *def_h_mkd) {
- g_free(def_h_mkd->bullion);
- g_free(def_h_mkd->metal);
- g_free(def_h_mkd->ounces);
-
- g_free(def_h_mkd->premium);
- g_free(def_h_mkd->gold);
- g_free(def_h_mkd->silver);
+ g_free(headings_mkd->symbol);
+ g_free(headings_mkd->price);
+ g_free(headings_mkd->opening);
- g_free(def_h_mkd->platinum);
- g_free(def_h_mkd->palladium);
- g_free(def_h_mkd->equity);
+ g_free(headings_mkd->asset);
+ g_free(headings_mkd->value);
+ g_free(headings_mkd->cash);
- g_free(def_h_mkd->symbol);
- g_free(def_h_mkd->shares);
+ g_free(headings_mkd->portfolio);
+ g_free(headings_mkd->no_assets);
}
static void ToStringsHeadings() {
meta *D = MetaClassObject;
- format_default_headings_pango(&D->def_h_mkd);
- format_primary_headings_pango(&D->pri_h_mkd);
+ format_heading_str_pango(&D->headings_mkd);
}
/* Class Init Functions */
@@ -462,9 +383,11 @@ meta *ClassInitMeta() {
new_class->NYSE_Symbol_url_ch = g_strdup(NYSE_SYMBOL_URL);
new_class->cash_mrkd_ch = NULL;
- new_class->portfolio_port_value_mrkd_ch = NULL;
- new_class->portfolio_port_value_chg_mrkd_ch = NULL;
- new_class->portfolio_port_value_p_chg_mrkd_ch = NULL;
+ new_class->portfolio_value_mrkd_ch = NULL;
+ new_class->portfolio_day_gain_mrkd_ch = NULL;
+
+ new_class->portfolio_cost_mrkd_ch = NULL;
+ new_class->portfolio_total_gain_mrkd_ch = NULL;
new_class->index_dow_value_ch = NULL;
new_class->index_dow_value_chg_ch = NULL;
@@ -498,13 +421,16 @@ meta *ClassInitMeta() {
/* The pango funcs require each dest string to point to allocated space
or NULL, they use realloc. */
- new_class->pri_h_mkd = (primary_heading){NULL};
- new_class->def_h_mkd = (default_heading){NULL};
+ new_class->headings_mkd = (heading_str_t){NULL};
new_class->cash_f = 0.0f;
- new_class->portfolio_port_value_f = 0.0f;
- new_class->portfolio_port_value_chg_f = 0.0f;
- new_class->portfolio_port_value_p_chg_f = 0.0f;
+ new_class->portfolio_value_f = 0.0f;
+ new_class->portfolio_day_gain_value_f = 0.0f;
+ new_class->portfolio_day_gain_percent_f = 0.0f;
+ new_class->portfolio_cost_f = 0.0f;
+ new_class->portfolio_total_gain_value_f = 0.0f;
+ new_class->portfolio_total_gain_percent_f = 0.0f;
+
new_class->updates_per_min_f = 6.0f;
new_class->updates_hours_f = 1.0f;
@@ -563,8 +489,7 @@ meta *ClassInitMeta() {
/* Class Destruct Functions */
void ClassDestructMeta(meta *meta_class) {
/* Free Memory */
- free_primary_headings(&meta_class->pri_h_mkd);
- free_default_headings(&meta_class->def_h_mkd);
+ free_heading_str(&meta_class->headings_mkd);
if (meta_class->rght_clk_data.type)
g_free(meta_class->rght_clk_data.type);
@@ -592,12 +517,15 @@ void ClassDestructMeta(meta *meta_class) {
if (meta_class->cash_mrkd_ch)
g_free(meta_class->cash_mrkd_ch);
- if (meta_class->portfolio_port_value_mrkd_ch)
- g_free(meta_class->portfolio_port_value_mrkd_ch);
- if (meta_class->portfolio_port_value_chg_mrkd_ch)
- g_free(meta_class->portfolio_port_value_chg_mrkd_ch);
- if (meta_class->portfolio_port_value_p_chg_mrkd_ch)
- g_free(meta_class->portfolio_port_value_p_chg_mrkd_ch);
+ if (meta_class->portfolio_value_mrkd_ch)
+ g_free(meta_class->portfolio_value_mrkd_ch);
+ if (meta_class->portfolio_day_gain_mrkd_ch)
+ g_free(meta_class->portfolio_day_gain_mrkd_ch);
+
+ if (meta_class->portfolio_cost_mrkd_ch)
+ g_free(meta_class->portfolio_cost_mrkd_ch);
+ if (meta_class->portfolio_total_gain_mrkd_ch)
+ g_free(meta_class->portfolio_total_gain_mrkd_ch);
if (meta_class->index_dow_value_ch)
g_free(meta_class->index_dow_value_ch);
diff --git a/src/class/class_packet.c b/src/class/class_packet.c
index 353c90b..11fe25e 100644
--- a/src/class/class_packet.c
+++ b/src/class/class_packet.c
@@ -216,9 +216,7 @@ static void StopMultiCurlAll() {
remove_main_curl_handles(packet);
}
-static gpointer GetPrimaryHeadings() { return &packet->meta_class->pri_h_mkd; }
-
-static gpointer GetDefaultHeadings() { return &packet->meta_class->def_h_mkd; }
+static gpointer GetHeadings() { return &packet->meta_class->headings_mkd; }
static gpointer GetWindowData() { return &packet->meta_class->window_struct; }
@@ -329,24 +327,33 @@ static void save_sql_data_bul(const bullion *gold, const bullion *silver,
gchar *gold_ounces_ch = SnPrint("%lf", gold->ounce_f);
gchar *gold_premium_ch = SnPrint("%lf", gold->premium_f);
+ gchar *gold_cost_ch = SnPrint("%lf", gold->cost_basis_f);
gchar *silver_ounces_ch = SnPrint("%lf", silver->ounce_f);
gchar *silver_premium_ch = SnPrint("%lf", silver->premium_f);
+ gchar *silver_cost_ch = SnPrint("%lf", silver->cost_basis_f);
gchar *platinum_ounces_ch = SnPrint("%lf", platinum->ounce_f);
gchar *platinum_premium_ch = SnPrint("%lf", platinum->premium_f);
+ gchar *platinum_cost_ch = SnPrint("%lf", platinum->cost_basis_f);
gchar *palladium_ounces_ch = SnPrint("%lf", palladium->ounce_f);
gchar *palladium_premium_ch = SnPrint("%lf", palladium->premium_f);
- SqliteBullionAdd(D, "gold", gold_ounces_ch, gold_premium_ch, "silver",
- silver_ounces_ch, silver_premium_ch, "platinum",
- platinum_ounces_ch, platinum_premium_ch, "palladium",
- palladium_ounces_ch, palladium_premium_ch, NULL);
+ gchar *palladium_cost_ch = SnPrint("%lf", palladium->cost_basis_f);
+ SqliteBullionAdd(
+ D, "gold", gold_ounces_ch, gold_premium_ch, gold_cost_ch, "silver",
+ silver_ounces_ch, silver_premium_ch, silver_cost_ch, "platinum",
+ platinum_ounces_ch, platinum_premium_ch, platinum_cost_ch, "palladium",
+ palladium_ounces_ch, palladium_premium_ch, palladium_cost_ch, NULL);
g_free(gold_ounces_ch);
g_free(gold_premium_ch);
+ g_free(gold_cost_ch);
g_free(silver_ounces_ch);
g_free(silver_premium_ch);
+ g_free(silver_cost_ch);
g_free(platinum_ounces_ch);
g_free(platinum_premium_ch);
+ g_free(platinum_cost_ch);
g_free(palladium_ounces_ch);
g_free(palladium_premium_ch);
+ g_free(palladium_cost_ch);
}
static void save_sql_data_app(portfolio_packet *pkg) {
@@ -470,8 +477,7 @@ void ClassInitPortfolioPacket() {
new_class->SetMainCurlCanceled = SetMainCurlCanceled;
new_class->GetHoursOfUpdates = GetHoursOfUpdates;
new_class->GetUpdatesPerMinute = GetUpdatesPerMinute;
- new_class->GetPrimaryHeadings = GetPrimaryHeadings;
- new_class->GetDefaultHeadings = GetDefaultHeadings;
+ new_class->GetHeadings = GetHeadings;
new_class->SaveSqlData = SaveSqlData;
new_class->GetWindowData = GetWindowData;
new_class->GetMetaClass = GetMetaClass;
diff --git a/src/financials.c b/src/financials.c
index 4c2f506..9a5ef9a 100644
--- a/src/financials.c
+++ b/src/financials.c
@@ -74,12 +74,13 @@ static void simple_arg_parse(gchar **argv, portfolio_packet *pkg) {
g_print("Help Message\n"
"---------------\n"
"-h --help\tPrint this help message.\n"
+ "-v --version\tDisplay the version.\n"
"-r --reset\tRemove %s database files.\n\n",
argv[0]);
- /* Free Class Instances. */
- class_package_destruct();
- exit(EXIT_SUCCESS);
+ } else if (!g_strcmp0("-v", argv[1]) || !g_strcmp0("--version", argv[1])) {
+
+ g_print(VERSION_STRING "\n");
} else if (!g_strcmp0("-r", argv[1]) || !g_strcmp0("--reset", argv[1])) {
@@ -95,12 +96,11 @@ static void simple_arg_parse(gchar **argv, portfolio_packet *pkg) {
} else {
g_print("Config file directory '%s' removed successfully.\n",
pkg->meta_class->config_dir_ch);
-
- /* Free Class Instances. */
- class_package_destruct();
- exit(EXIT_SUCCESS);
}
}
+ /* Free Class Instances. */
+ class_package_destruct();
+ exit(EXIT_SUCCESS);
}
gint main(gint argc, gchar *argv[]) {
diff --git a/src/financials.h b/src/financials.h
index 45cbb50..371c2b2 100644
--- a/src/financials.h
+++ b/src/financials.h
@@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "include/config.h" /* ReadConfig (), RemoveConfigFiles () */
#include "include/globals.h" /* portfolio_packet *packet */
#include "include/gui.h" /* GuiStart () */
+#include "include/macros.h" /* VERSION_STRING */
#include "include/mutex.h" /* GMutex mutexes[ MUTEX_NUMBER ] */
#endif /* FINANCIALS_HEADER_H */
\ No newline at end of file
diff --git a/src/gui/gui.c b/src/gui/gui.c
index 91c680f..ed54391 100644
--- a/src/gui/gui.c
+++ b/src/gui/gui.c
@@ -147,6 +147,10 @@ static void security_window_sig_connect() {
object = GetGObject("SecuritySharesEntryBox");
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)SECURITY_CURSOR_MOVE);
+
+ object = GetGObject("SecurityCostEntryBox");
+ g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
+ (gpointer)SECURITY_CURSOR_MOVE);
}
static void bullion_window_sig_connect() {
@@ -174,6 +178,10 @@ static void bullion_window_sig_connect() {
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
+ object = GetGObject("BullionGoldCostEntryBox");
+ g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
+ (gpointer)BUL_CURSOR_MOVE);
+
object = GetGObject("BullionSilverOuncesEntryBox");
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
@@ -182,6 +190,10 @@ static void bullion_window_sig_connect() {
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
+ object = GetGObject("BullionSilverCostEntryBox");
+ g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
+ (gpointer)BUL_CURSOR_MOVE);
+
object = GetGObject("BullionPlatinumOuncesEntryBox");
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
@@ -190,6 +202,10 @@ static void bullion_window_sig_connect() {
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
+ object = GetGObject("BullionPlatinumCostEntryBox");
+ g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
+ (gpointer)BUL_CURSOR_MOVE);
+
object = GetGObject("BullionPalladiumOuncesEntryBox");
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
@@ -198,6 +214,10 @@ static void bullion_window_sig_connect() {
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_CURSOR_MOVE);
+ object = GetGObject("BullionPalladiumCostEntryBox");
+ g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
+ (gpointer)BUL_CURSOR_MOVE);
+
object = GetGObject("BullionComboBox");
g_signal_connect(object, "changed", G_CALLBACK(GUICallbackHandler),
(gpointer)BUL_COMBO_BOX);
diff --git a/src/gui/gui_callbacks.c b/src/gui/gui_callbacks.c
index ed1fc41..0b88b77 100644
--- a/src/gui/gui_callbacks.c
+++ b/src/gui/gui_callbacks.c
@@ -150,6 +150,7 @@ void GUICallback_security_stack(GObject *gobject) {
GtkWidget *ComboBox = GetWidget("SecurityComboBox");
GtkWidget *EntryBoxSymbol = GetWidget("SecuritySymbolEntryBox");
GtkWidget *EntryBoxShares = GetWidget("SecuritySharesEntryBox");
+ GtkWidget *EntryBoxCost = GetWidget("SecurityCostEntryBox");
GtkWidget *Button = GetWidget("SecurityOkBTN");
if (g_strcmp0(name, "add") == 0) {
@@ -158,21 +159,25 @@ void GUICallback_security_stack(GObject *gobject) {
gtk_combo_box_set_active(GTK_COMBO_BOX(ComboBox), 0);
gtk_widget_set_sensitive(EntryBoxSymbol, TRUE);
gtk_widget_set_sensitive(EntryBoxShares, TRUE);
+ gtk_widget_set_sensitive(EntryBoxCost, TRUE);
gtk_widget_set_sensitive(Button, FALSE);
/* Reset EntryBoxes */
gtk_entry_set_text(GTK_ENTRY(EntryBoxSymbol), "");
gtk_entry_set_text(GTK_ENTRY(EntryBoxShares), "");
+ gtk_entry_set_text(GTK_ENTRY(EntryBoxCost), "");
} else {
gtk_combo_box_set_button_sensitivity(GTK_COMBO_BOX(ComboBox),
GTK_SENSITIVITY_AUTO);
gtk_widget_set_sensitive(EntryBoxSymbol, FALSE);
gtk_widget_set_sensitive(EntryBoxShares, FALSE);
+ gtk_widget_set_sensitive(EntryBoxCost, FALSE);
gtk_widget_set_sensitive(Button, FALSE);
/* Reset EntryBoxes */
gtk_entry_set_text(GTK_ENTRY(EntryBoxSymbol), "");
gtk_entry_set_text(GTK_ENTRY(EntryBoxShares), "");
+ gtk_entry_set_text(GTK_ENTRY(EntryBoxCost), "");
}
}
@@ -410,6 +415,7 @@ static void popup_menu_view_summary() {
static void zeroize_bullion(bullion *B) {
B->ounce_f = 0.0f;
B->premium_f = 0.0f;
+ B->cost_basis_f = 0.0f;
}
static void popup_menu_delete_bullion(GtkWidget *menuitem, gpointer userdata) {
diff --git a/src/gui/gui_history.c b/src/gui/gui_history.c
index c3c89e4..cdf9a75 100644
--- a/src/gui/gui_history.c
+++ b/src/gui/gui_history.c
@@ -96,8 +96,8 @@ gint HistoryTreeViewClear() {
}
static const gchar *col_names[HISTORY_N_COLUMNS] = {
- "Date", "Price", "High", "Low", "Open", "Pr. Close",
- "Chg", "Gain (%)", "Vol.", "RSI", "Indicator"};
+ "Date", "Price", "Open", "Range", "Pr. Close",
+ "Chg", "Gain (%)", "Vol.", "RSI", "Indicator"};
static void history_set_columns() {
GtkWidget *list = GetWidget("HistoryTreeView");
@@ -182,8 +182,7 @@ static gboolean history_rsi_ready(gdouble gain_f, gdouble *rsi_f, gint state) {
typedef struct {
gchar *date_ch;
gchar *price_ch;
- gchar *high_ch;
- gchar *low_ch;
+ gchar *range_ch;
gchar *opening_ch;
gchar *prev_closing_ch;
gchar *change_ch;
@@ -235,12 +234,11 @@ static gboolean history_rsi_calculate(gchar *line, history_strings *strings,
DoubleToFormattedStrPango(&strings->prev_closing_ch, prev_price_f, 2, MON_STR,
BLACK);
DoubleToFormattedStrPango(&strings->price_ch, cur_price_f, 2, MON_STR, BLACK);
- StringToStrPango(&strings->high_ch, token_arr[2] ? token_arr[2] : "0",
- STR_TO_MON_STR);
- StringToStrPango(&strings->low_ch, token_arr[3] ? token_arr[3] : "0",
- STR_TO_MON_STR);
StringToStrPango(&strings->opening_ch, token_arr[1] ? token_arr[1] : "0",
STR_TO_MON_STR);
+ double high_f = g_strtod(token_arr[2] ? token_arr[2] : "0", NULL);
+ double low_f = g_strtod(token_arr[3] ? token_arr[3] : "0", NULL);
+ RangeStrPango(&strings->range_ch, low_f, high_f, 2);
change_f = cur_price_f - prev_price_f;
if (change_f > 0) {
DoubleToFormattedStrPango(&strings->change_ch, change_f, 2, MON_STR, GREEN);
@@ -282,8 +280,7 @@ static void history_set_store_cleanup(history_strings *history_strs) {
g_free(history_strs->rsi_ch);
g_free(history_strs->volume_ch);
g_free(history_strs->price_ch);
- g_free(history_strs->high_ch);
- g_free(history_strs->low_ch);
+ g_free(history_strs->range_ch);
g_free(history_strs->opening_ch);
g_free(history_strs->change_ch);
g_free(history_strs->prev_closing_ch);
@@ -336,13 +333,11 @@ static void history_set_store(GtkListStore *store, const gchar *curl_data,
gtk_list_store_set(
store, &iter, HISTORY_COLUMN_ONE, history_strs.date_ch,
HISTORY_COLUMN_TWO, history_strs.price_ch, HISTORY_COLUMN_THREE,
- history_strs.high_ch, HISTORY_COLUMN_FOUR, history_strs.low_ch,
- HISTORY_COLUMN_FIVE, history_strs.opening_ch, HISTORY_COLUMN_SIX,
- history_strs.prev_closing_ch, HISTORY_COLUMN_SEVEN,
- history_strs.change_ch, HISTORY_COLUMN_EIGHT, history_strs.gain_ch,
- HISTORY_COLUMN_NINE, history_strs.volume_ch, HISTORY_COLUMN_TEN,
- history_strs.rsi_ch, HISTORY_COLUMN_ELEVEN, history_strs.indicator_ch,
- -1);
+ history_strs.opening_ch, HISTORY_COLUMN_FOUR, history_strs.range_ch,
+ HISTORY_COLUMN_FIVE, history_strs.prev_closing_ch, HISTORY_COLUMN_SIX,
+ history_strs.change_ch, HISTORY_COLUMN_SEVEN, history_strs.gain_ch,
+ HISTORY_COLUMN_EIGHT, history_strs.volume_ch, HISTORY_COLUMN_NINE,
+ history_strs.rsi_ch, HISTORY_COLUMN_TEN, history_strs.indicator_ch, -1);
}
g_free(line);
fclose(fp);
@@ -356,7 +351,7 @@ GtkListStore *HistoryMakeStore(const gchar *data_str, const gsize string_len) {
store = gtk_list_store_new(HISTORY_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ G_TYPE_STRING, G_TYPE_STRING);
/* Add data to the storage container, pass in the data_str pointer and the
* string length [not including null]. */
diff --git a/src/gui/gui_main.c b/src/gui/gui_main.c
index 4329edc..175be84 100644
--- a/src/gui/gui_main.c
+++ b/src/gui/gui_main.c
@@ -100,31 +100,29 @@ static gint main_set_columns(gint column_type) {
* symbol, etc] */
add_hidden_column("symbol_text", MAIN_COLUMN_SYMBOL, list);
- for (guint8 g = MAIN_COLUMN_ONE; g <= MAIN_COLUMN_THREE; g++)
+ for (guint8 g = MAIN_COLUMN_ONE; g <= MAIN_COLUMN_FOUR; g++)
AddColumnToTreeview("column_name", g, list);
if (column_type == GUI_COLUMN_PRIMARY)
/* if PRIMARY treeview */
- for (guint8 g = MAIN_COLUMN_FOUR; g < MAIN_N_COLUMNS; g++)
+ for (guint8 g = MAIN_COLUMN_FIVE; g < MAIN_N_COLUMNS; g++)
AddColumnToTreeview("column_name", g, list);
return 0;
}
static gint main_prmry_add_bul_store(bullion *B, const gchar *unmarked_name_ch,
- const gchar *marked_name_ch,
GtkListStore *store, GtkTreeIter *iter) {
gtk_list_store_append(store, iter);
gtk_list_store_set(
store, iter, MAIN_COLUMN_TYPE, "bullion", MAIN_COLUMN_SYMBOL,
- unmarked_name_ch, MAIN_COLUMN_ONE, marked_name_ch, MAIN_COLUMN_TWO,
- B->ounce_mrkd_ch, MAIN_COLUMN_THREE, B->spot_price_mrkd_ch,
- MAIN_COLUMN_FOUR, B->premium_mrkd_ch, MAIN_COLUMN_FIVE,
- B->high_metal_mrkd_ch, MAIN_COLUMN_SIX, B->low_metal_mrkd_ch,
- MAIN_COLUMN_SEVEN, B->prev_closing_metal_mrkd_ch, MAIN_COLUMN_EIGHT,
- B->change_ounce_mrkd_ch, MAIN_COLUMN_NINE, B->change_value_mrkd_ch,
- MAIN_COLUMN_TEN, B->port_value_mrkd_ch, MAIN_COLUMN_ELEVEN,
- B->change_percent_mrkd_ch, -1);
+ unmarked_name_ch, MAIN_COLUMN_ONE, B->metal_mrkd_ch, MAIN_COLUMN_TWO,
+ B->spot_price_mrkd_ch, MAIN_COLUMN_THREE, B->premium_mrkd_ch,
+ MAIN_COLUMN_FOUR, B->cost_mrkd_ch, MAIN_COLUMN_FIVE, B->range_mrkd_ch,
+ MAIN_COLUMN_SIX, B->prev_closing_metal_mrkd_ch, MAIN_COLUMN_SEVEN,
+ B->change_ounce_mrkd_ch, MAIN_COLUMN_EIGHT, B->port_value_mrkd_ch,
+ MAIN_COLUMN_NINE, B->total_cost_mrkd_ch, MAIN_COLUMN_TEN,
+ B->total_gain_mrkd_ch, -1);
return 0;
}
@@ -132,51 +130,47 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
metal *M = pkg->GetMetalClass();
equity_folder *F = pkg->GetEquityFolderClass();
meta *D = pkg->GetMetaClass();
- primary_heading *pri_h_mkd = pkg->GetPrimaryHeadings();
+ heading_str_t *headings_mkd = pkg->GetHeadings();
GtkListStore *store = NULL;
GtkTreeIter iter;
gboolean no_assets = TRUE;
/* Set up the storage container with the number of columns and column type */
- store = gtk_list_store_new(MAIN_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING);
+ store = gtk_list_store_new(
+ MAIN_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
/* Add data to the storage container. */
if (M->bullion_port_value_f) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->bullion, -1);
+ headings_mkd->bullion, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(
store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "",
- MAIN_COLUMN_ONE, pri_h_mkd->metal, MAIN_COLUMN_TWO, pri_h_mkd->ounces,
- MAIN_COLUMN_THREE, pri_h_mkd->price, MAIN_COLUMN_FOUR,
- pri_h_mkd->premium, MAIN_COLUMN_FIVE, pri_h_mkd->high, MAIN_COLUMN_SIX,
- pri_h_mkd->low, MAIN_COLUMN_SEVEN, pri_h_mkd->prev_closing,
- MAIN_COLUMN_EIGHT, pri_h_mkd->chg, MAIN_COLUMN_NINE,
- pri_h_mkd->gain_sym, MAIN_COLUMN_TEN, pri_h_mkd->total,
- MAIN_COLUMN_ELEVEN, pri_h_mkd->gain_per, -1);
+ MAIN_COLUMN_ONE, headings_mkd->metal, MAIN_COLUMN_TWO,
+ headings_mkd->price, MAIN_COLUMN_THREE, headings_mkd->premium,
+ MAIN_COLUMN_FOUR, headings_mkd->cost, MAIN_COLUMN_FIVE,
+ headings_mkd->range, MAIN_COLUMN_SIX, headings_mkd->prev_closing,
+ MAIN_COLUMN_SEVEN, headings_mkd->chg, MAIN_COLUMN_EIGHT,
+ headings_mkd->total, MAIN_COLUMN_NINE, headings_mkd->total_cost,
+ MAIN_COLUMN_TEN, headings_mkd->total_gain, -1);
if (M->Gold->ounce_f)
- main_prmry_add_bul_store(M->Gold, "gold", pri_h_mkd->gold, store, &iter);
+ main_prmry_add_bul_store(M->Gold, "gold", store, &iter);
if (M->Palladium->ounce_f)
- main_prmry_add_bul_store(M->Palladium, "palladium", pri_h_mkd->palladium,
- store, &iter);
+ main_prmry_add_bul_store(M->Palladium, "palladium", store, &iter);
if (M->Platinum->ounce_f)
- main_prmry_add_bul_store(M->Platinum, "platinum", pri_h_mkd->platinum,
- store, &iter);
+ main_prmry_add_bul_store(M->Platinum, "platinum", store, &iter);
if (M->Silver->ounce_f)
- main_prmry_add_bul_store(M->Silver, "silver", pri_h_mkd->silver, store,
- &iter);
+ main_prmry_add_bul_store(M->Silver, "silver", store, &iter);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
@@ -189,17 +183,18 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->equity, -1);
+ headings_mkd->equity, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(
store, &iter, MAIN_COLUMN_TYPE, "equity_total", MAIN_COLUMN_SYMBOL, "",
- MAIN_COLUMN_ONE, pri_h_mkd->symbol, MAIN_COLUMN_TWO, pri_h_mkd->shares,
- MAIN_COLUMN_THREE, pri_h_mkd->price, MAIN_COLUMN_FOUR, pri_h_mkd->high,
- MAIN_COLUMN_FIVE, pri_h_mkd->low, MAIN_COLUMN_SIX, pri_h_mkd->opening,
- MAIN_COLUMN_SEVEN, pri_h_mkd->prev_closing, MAIN_COLUMN_EIGHT,
- pri_h_mkd->chg, MAIN_COLUMN_NINE, pri_h_mkd->gain_sym, MAIN_COLUMN_TEN,
- pri_h_mkd->total, MAIN_COLUMN_ELEVEN, pri_h_mkd->gain_per, -1);
+ MAIN_COLUMN_ONE, headings_mkd->symbol, MAIN_COLUMN_TWO,
+ headings_mkd->price, MAIN_COLUMN_THREE, headings_mkd->opening,
+ MAIN_COLUMN_FOUR, headings_mkd->cost, MAIN_COLUMN_FIVE,
+ headings_mkd->range, MAIN_COLUMN_SIX, headings_mkd->prev_closing,
+ MAIN_COLUMN_SEVEN, headings_mkd->chg, MAIN_COLUMN_EIGHT,
+ headings_mkd->total, MAIN_COLUMN_NINE, headings_mkd->total_cost,
+ MAIN_COLUMN_TEN, headings_mkd->total_gain, -1);
guint8 c;
guint8 g = 0;
@@ -211,33 +206,31 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
c = 0;
while (c < F->size) {
if (g == 0) {
- if (!F->Equity[c]->num_shares_stock_int) {
+ if (!F->Equity[c]->quantity_int) {
c++;
continue;
}
} else {
- if (F->Equity[c]->num_shares_stock_int) {
+ if (F->Equity[c]->quantity_int) {
c++;
continue;
}
}
gtk_list_store_append(store, &iter);
-
gtk_list_store_set(
store, &iter, MAIN_COLUMN_TYPE, "equity", MAIN_COLUMN_SYMBOL,
F->Equity[c]->symbol_stock_ch, MAIN_COLUMN_ONE,
F->Equity[c]->symbol_stock_mrkd_ch, MAIN_COLUMN_TWO,
- F->Equity[c]->num_shares_stock_mrkd_ch, MAIN_COLUMN_THREE,
- F->Equity[c]->current_price_stock_mrkd_ch, MAIN_COLUMN_FOUR,
- F->Equity[c]->high_stock_mrkd_ch, MAIN_COLUMN_FIVE,
- F->Equity[c]->low_stock_mrkd_ch, MAIN_COLUMN_SIX,
- F->Equity[c]->opening_stock_mrkd_ch, MAIN_COLUMN_SEVEN,
- F->Equity[c]->prev_closing_stock_mrkd_ch, MAIN_COLUMN_EIGHT,
- F->Equity[c]->change_share_stock_mrkd_ch, MAIN_COLUMN_NINE,
- F->Equity[c]->change_value_mrkd_ch, MAIN_COLUMN_TEN,
- F->Equity[c]->current_investment_stock_mrkd_ch, MAIN_COLUMN_ELEVEN,
- F->Equity[c]->change_percent_mrkd_ch, -1);
+ F->Equity[c]->current_price_stock_mrkd_ch, MAIN_COLUMN_THREE,
+ F->Equity[c]->opening_stock_mrkd_ch, MAIN_COLUMN_FOUR,
+ F->Equity[c]->cost_mrkd_ch, MAIN_COLUMN_FIVE,
+ F->Equity[c]->range_mrkd_ch, MAIN_COLUMN_SIX,
+ F->Equity[c]->prev_closing_stock_mrkd_ch, MAIN_COLUMN_SEVEN,
+ F->Equity[c]->change_share_stock_mrkd_ch, MAIN_COLUMN_EIGHT,
+ F->Equity[c]->current_investment_stock_mrkd_ch, MAIN_COLUMN_NINE,
+ F->Equity[c]->total_cost_mrkd_ch, MAIN_COLUMN_TEN,
+ F->Equity[c]->total_gain_mrkd_ch, -1);
c++;
}
@@ -253,18 +246,20 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
if (D->cash_f || M->bullion_port_value_f || F->stock_port_value_f) {
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
- MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->asset, MAIN_COLUMN_TWO, pri_h_mkd->value,
- MAIN_COLUMN_THREE, pri_h_mkd->gain_sym, MAIN_COLUMN_FOUR,
- pri_h_mkd->gain_per, -1);
+ gtk_list_store_set(
+ store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
+ MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, headings_mkd->asset,
+ MAIN_COLUMN_TWO, headings_mkd->value, MAIN_COLUMN_THREE,
+ headings_mkd->day_gain, MAIN_COLUMN_FOUR, headings_mkd->total_cost,
+ MAIN_COLUMN_FIVE, headings_mkd->total_gain, -1);
}
if (D->cash_f) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "cash",
- MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, pri_h_mkd->cash,
- MAIN_COLUMN_TWO, D->cash_mrkd_ch, -1);
+ MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
+ headings_mkd->cash, MAIN_COLUMN_TWO, D->cash_mrkd_ch,
+ MAIN_COLUMN_FOUR, D->cash_mrkd_ch, -1);
no_assets = FALSE;
}
@@ -274,23 +269,25 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->bullion, MAIN_COLUMN_TWO,
+ headings_mkd->bullion, MAIN_COLUMN_TWO,
M->bullion_port_value_mrkd_ch, MAIN_COLUMN_THREE,
- M->bullion_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR,
- M->bullion_port_value_p_chg_mrkd_ch, -1);
+ M->bullion_port_day_gain_mrkd_ch, MAIN_COLUMN_FOUR,
+ M->bullion_port_cost_mrkd_ch, MAIN_COLUMN_FIVE,
+ M->bullion_port_total_gain_mrkd_ch, -1);
}
if (F->stock_port_value_f) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->equity, MAIN_COLUMN_TWO,
+ headings_mkd->equity, MAIN_COLUMN_TWO,
F->stock_port_value_mrkd_ch, MAIN_COLUMN_THREE,
- F->stock_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR,
- F->stock_port_value_p_chg_mrkd_ch, -1);
+ F->stock_port_day_gain_mrkd_ch, MAIN_COLUMN_FOUR,
+ F->stock_port_cost_mrkd_ch, MAIN_COLUMN_FIVE,
+ F->stock_port_total_gain_mrkd_ch, -1);
}
- if (D->portfolio_port_value_f) {
+ if (D->portfolio_value_f) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
MAIN_COLUMN_SYMBOL, "", -1);
@@ -298,10 +295,11 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->portfolio, MAIN_COLUMN_TWO,
- D->portfolio_port_value_mrkd_ch, MAIN_COLUMN_THREE,
- D->portfolio_port_value_chg_mrkd_ch, MAIN_COLUMN_FOUR,
- D->portfolio_port_value_p_chg_mrkd_ch, -1);
+ headings_mkd->portfolio, MAIN_COLUMN_TWO,
+ D->portfolio_value_mrkd_ch, MAIN_COLUMN_THREE,
+ D->portfolio_day_gain_mrkd_ch, MAIN_COLUMN_FOUR,
+ D->portfolio_cost_mrkd_ch, MAIN_COLUMN_FIVE,
+ D->portfolio_total_gain_mrkd_ch, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
@@ -312,7 +310,7 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_primary",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- pri_h_mkd->no_assets, -1);
+ headings_mkd->no_assets, -1);
}
/* Indicate that the default view is not displayed. */
@@ -322,13 +320,12 @@ static GtkListStore *main_primary_store(portfolio_packet *pkg) {
}
static gint main_def_add_bul_store(bullion *B, const gchar *unmarked_name_ch,
- const gchar *marked_name_ch,
GtkListStore *store, GtkTreeIter *iter) {
gtk_list_store_append(store, iter);
gtk_list_store_set(store, iter, MAIN_COLUMN_TYPE, "bullion",
MAIN_COLUMN_SYMBOL, unmarked_name_ch, MAIN_COLUMN_ONE,
- marked_name_ch, MAIN_COLUMN_TWO, B->ounce_mrkd_ch,
- MAIN_COLUMN_THREE, B->premium_mrkd_ch, -1);
+ B->metal_mrkd_ch, MAIN_COLUMN_TWO, B->premium_mrkd_ch,
+ MAIN_COLUMN_THREE, B->cost_mrkd_ch, -1);
return 0;
}
@@ -336,7 +333,7 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
metal *M = pkg->GetMetalClass();
equity_folder *F = pkg->GetEquityFolderClass();
meta *D = pkg->GetMetaClass();
- default_heading *def_h_mkd = pkg->GetDefaultHeadings();
+ heading_str_t *headings_mkd = pkg->GetHeadings();
gboolean no_assets = TRUE;
@@ -345,8 +342,8 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
/* Set up the storage container with the number of columns and column type
*/
- store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING, G_TYPE_STRING);
+ store = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
/* Add data to the storage container. */
if (M->Gold->ounce_f || M->Silver->ounce_f || M->Platinum->ounce_f ||
@@ -355,28 +352,25 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- def_h_mkd->bullion, -1);
+ headings_mkd->bullion, -1);
gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "bullion_total",
- MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- def_h_mkd->metal, MAIN_COLUMN_TWO, def_h_mkd->ounces,
- MAIN_COLUMN_THREE, def_h_mkd->premium, -1);
+ gtk_list_store_set(
+ store, &iter, MAIN_COLUMN_TYPE, "bullion_total", MAIN_COLUMN_SYMBOL, "",
+ MAIN_COLUMN_ONE, headings_mkd->metal, MAIN_COLUMN_TWO,
+ headings_mkd->premium, MAIN_COLUMN_THREE, headings_mkd->cost, -1);
if (M->Gold->ounce_f)
- main_def_add_bul_store(M->Gold, "gold", def_h_mkd->gold, store, &iter);
+ main_def_add_bul_store(M->Gold, "gold", store, &iter);
if (M->Palladium->ounce_f)
- main_def_add_bul_store(M->Palladium, "palladium", def_h_mkd->palladium,
- store, &iter);
+ main_def_add_bul_store(M->Palladium, "palladium", store, &iter);
if (M->Platinum->ounce_f)
- main_def_add_bul_store(M->Platinum, "platinum", def_h_mkd->platinum,
- store, &iter);
+ main_def_add_bul_store(M->Platinum, "platinum", store, &iter);
if (M->Silver->ounce_f)
- main_def_add_bul_store(M->Silver, "silver", def_h_mkd->silver, store,
- &iter);
+ main_def_add_bul_store(M->Silver, "silver", store, &iter);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default",
@@ -388,13 +382,13 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- def_h_mkd->equity, -1);
+ headings_mkd->equity, -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity_total",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- def_h_mkd->symbol, MAIN_COLUMN_TWO, def_h_mkd->shares,
- -1);
+ headings_mkd->symbol, MAIN_COLUMN_THREE,
+ headings_mkd->cost, -1);
guint8 c;
guint8 g = 0;
@@ -405,24 +399,24 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
c = 0;
while (c < F->size) {
if (g == 0) {
- if (!F->Equity[c]->num_shares_stock_int) {
+ if (!F->Equity[c]->quantity_int) {
c++;
continue;
}
} else {
- if (F->Equity[c]->num_shares_stock_int) {
+ if (F->Equity[c]->quantity_int) {
c++;
continue;
}
}
gtk_list_store_append(store, &iter);
- gtk_list_store_set(
- store, &iter, MAIN_COLUMN_TYPE, "equity", MAIN_COLUMN_SYMBOL,
- F->Equity[c]->symbol_stock_ch, MAIN_COLUMN_ONE,
- F->Equity[c]->symbol_stock_mrkd_ch, MAIN_COLUMN_TWO,
- F->Equity[c]->num_shares_stock_mrkd_ch, MAIN_COLUMN_THREE,
- F->Equity[c]->security_name_mrkd_ch, -1);
+ gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "equity",
+ MAIN_COLUMN_SYMBOL, F->Equity[c]->symbol_stock_ch,
+ MAIN_COLUMN_ONE, F->Equity[c]->symbol_stock_mrkd_ch,
+ MAIN_COLUMN_THREE, F->Equity[c]->cost_mrkd_ch,
+ MAIN_COLUMN_FOUR,
+ F->Equity[c]->security_name_mrkd_ch, -1);
c++;
}
g++;
@@ -436,8 +430,9 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
if (D->cash_f) {
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "cash",
- MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, def_h_mkd->cash,
- MAIN_COLUMN_THREE, D->cash_mrkd_ch, -1);
+ MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
+ headings_mkd->cash, MAIN_COLUMN_THREE, D->cash_mrkd_ch,
+ -1);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE, "", -1);
@@ -452,7 +447,7 @@ static GtkListStore *main_default_store(portfolio_packet *pkg) {
gtk_list_store_set(store, &iter, MAIN_COLUMN_TYPE, "blank_space_default",
MAIN_COLUMN_SYMBOL, "", MAIN_COLUMN_ONE,
- def_h_mkd->no_assets, -1);
+ headings_mkd->no_assets, -1);
}
/* Indicate that the default view is displayed. */
diff --git a/src/gui/gui_other_wins.c b/src/gui/gui_other_wins.c
index 6d64a06..0b5b204 100644
--- a/src/gui/gui_other_wins.c
+++ b/src/gui/gui_other_wins.c
@@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "../include/gui.h" /* MainPrimaryTreeview */
#include "../include/class_types.h" /* portfolio_packet, equity_folder, metal, meta */
+#include "../include/macros.h"
#include "../include/multicurl.h"
#include "../include/mutex.h"
#include "../include/workfuncs.h"
@@ -227,20 +228,27 @@ gint BullionShowHide(portfolio_packet *pkg) {
/* Set EntryBoxes */
set_bullion_entry_box("BullionGoldOuncesEntryBox", M->Gold->ounce_f, 4);
set_bullion_entry_box("BullionGoldPremiumEntryBox", M->Gold->premium_f, 2);
+ set_bullion_entry_box("BullionGoldCostEntryBox", M->Gold->cost_basis_f, 2);
set_bullion_entry_box("BullionSilverOuncesEntryBox", M->Silver->ounce_f, 4);
set_bullion_entry_box("BullionSilverPremiumEntryBox", M->Silver->premium_f,
2);
+ set_bullion_entry_box("BullionSilverCostEntryBox", M->Silver->cost_basis_f,
+ 2);
set_bullion_entry_box("BullionPlatinumOuncesEntryBox", M->Platinum->ounce_f,
4);
set_bullion_entry_box("BullionPlatinumPremiumEntryBox",
M->Platinum->premium_f, 2);
+ set_bullion_entry_box("BullionPlatinumCostEntryBox",
+ M->Platinum->cost_basis_f, 2);
set_bullion_entry_box("BullionPalladiumOuncesEntryBox",
M->Palladium->ounce_f, 4);
set_bullion_entry_box("BullionPalladiumPremiumEntryBox",
M->Palladium->premium_f, 2);
+ set_bullion_entry_box("BullionPalladiumCostEntryBox",
+ M->Palladium->cost_basis_f, 2);
GtkWidget *frame = GetWidget("BullionGoldFrame");
gtk_widget_set_visible(frame, TRUE);
@@ -260,12 +268,15 @@ gint BullionShowHide(portfolio_packet *pkg) {
}
static gboolean process_bullion_data(const gchar *new_ounces_ch,
- const gchar *new_premium_ch, bullion *B) {
+ const gchar *new_premium_ch,
+ const gchar *new_cost_ch, bullion *B) {
gboolean new_bullion = FALSE;
gdouble new_ounces_f = g_strtod(new_ounces_ch, NULL);
gdouble new_premium_f = g_strtod(new_premium_ch, NULL);
+ gdouble new_cost_f = g_strtod(new_cost_ch, NULL);
- if (new_ounces_f != B->ounce_f || new_premium_f != B->premium_f) {
+ if (new_ounces_f != B->ounce_f || new_premium_f != B->premium_f ||
+ new_cost_f != B->cost_basis_f) {
if (B->ounce_f > 0 || new_ounces_f == 0)
/* We already have data for this bullion.
Or we are deleting data for this bullion. */
@@ -276,6 +287,7 @@ static gboolean process_bullion_data(const gchar *new_ounces_ch,
B->ounce_f = new_ounces_f;
B->premium_f = new_premium_f;
+ B->cost_basis_f = new_cost_f;
}
return new_bullion;
}
@@ -283,12 +295,13 @@ static gboolean process_bullion_data(const gchar *new_ounces_ch,
static gboolean
process_bullion_entry_boxes(const gchar *ounces_entry_box_name_ch,
const gchar *premium_entry_box_name_ch,
- bullion *B) {
+ const gchar *cost_entry_box_name_ch, bullion *B) {
const gchar *new_ounces_ch = GetEntryText(ounces_entry_box_name_ch);
const gchar *new_premium_ch = GetEntryText(premium_entry_box_name_ch);
+ const gchar *new_cost_ch = GetEntryText(cost_entry_box_name_ch);
- return process_bullion_data(new_ounces_ch, new_premium_ch, B);
+ return process_bullion_data(new_ounces_ch, new_premium_ch, new_cost_ch, B);
}
enum { GOLD, SILVER, PLATINUM, PALLADIUM };
@@ -297,33 +310,38 @@ static gboolean process_bullion(const gint metal_int, portfolio_packet *pkg) {
const gchar *ounce_entry_name_ch;
const gchar *premium_entry_name_ch;
+ const gchar *cost_entry_name_ch;
bullion *B;
switch (metal_int) {
case GOLD:
ounce_entry_name_ch = "BullionGoldOuncesEntryBox";
premium_entry_name_ch = "BullionGoldPremiumEntryBox";
+ cost_entry_name_ch = "BullionGoldCostEntryBox";
B = M->Gold;
break;
case SILVER:
ounce_entry_name_ch = "BullionSilverOuncesEntryBox";
premium_entry_name_ch = "BullionSilverPremiumEntryBox";
+ cost_entry_name_ch = "BullionSilverCostEntryBox";
B = M->Silver;
break;
case PLATINUM:
ounce_entry_name_ch = "BullionPlatinumOuncesEntryBox";
premium_entry_name_ch = "BullionPlatinumPremiumEntryBox";
+ cost_entry_name_ch = "BullionPlatinumCostEntryBox";
B = M->Platinum;
break;
case PALLADIUM:
ounce_entry_name_ch = "BullionPalladiumOuncesEntryBox";
premium_entry_name_ch = "BullionPalladiumPremiumEntryBox";
+ cost_entry_name_ch = "BullionPalladiumCostEntryBox";
B = M->Palladium;
break;
}
return process_bullion_entry_boxes(ounce_entry_name_ch, premium_entry_name_ch,
- B);
+ cost_entry_name_ch, B);
}
gboolean BullionOk(portfolio_packet *pkg) {
@@ -344,36 +362,54 @@ gint BullionCursorMove() {
const gchar *Gold_Ounces = GetEntryText("BullionGoldOuncesEntryBox");
const gchar *Gold_Premium = GetEntryText("BullionGoldPremiumEntryBox");
+ const gchar *Gold_Cost = GetEntryText("BullionGoldCostEntryBox");
const gchar *Silver_Ounces = GetEntryText("BullionSilverOuncesEntryBox");
const gchar *Silver_Premium = GetEntryText("BullionSilverPremiumEntryBox");
+ const gchar *Silver_Cost = GetEntryText("BullionSilverCostEntryBox");
const gchar *Platinum_Ounces = GetEntryText("BullionPlatinumOuncesEntryBox");
const gchar *Platinum_Premium =
GetEntryText("BullionPlatinumPremiumEntryBox");
+ const gchar *Platinum_Cost = GetEntryText("BullionPlatinumCostEntryBox");
const gchar *Palladium_Ounces =
GetEntryText("BullionPalladiumOuncesEntryBox");
const gchar *Palladium_Premium =
GetEntryText("BullionPalladiumPremiumEntryBox");
+ const gchar *Palladium_Cost = GetEntryText("BullionPalladiumCostEntryBox");
gboolean valid_num = CheckIfStringDoublePositiveNumber(Gold_Ounces) &
- CheckIfStringDoublePositiveNumber(Gold_Premium);
+ CheckIfStringDoublePositiveNumber(Gold_Premium) &
+ CheckIfStringDoublePositiveNumber(Gold_Cost);
+
valid_num = valid_num & CheckIfStringDoublePositiveNumber(Silver_Ounces) &
- CheckIfStringDoublePositiveNumber(Silver_Premium);
+ CheckIfStringDoublePositiveNumber(Silver_Premium) &
+ CheckIfStringDoublePositiveNumber(Silver_Cost);
+
valid_num = valid_num & CheckIfStringDoublePositiveNumber(Platinum_Ounces) &
- CheckIfStringDoublePositiveNumber(Platinum_Premium);
+ CheckIfStringDoublePositiveNumber(Platinum_Premium) &
+ CheckIfStringDoublePositiveNumber(Platinum_Cost);
+
valid_num = valid_num & CheckIfStringDoublePositiveNumber(Palladium_Ounces) &
- CheckIfStringDoublePositiveNumber(Palladium_Premium);
+ CheckIfStringDoublePositiveNumber(Palladium_Premium) &
+ CheckIfStringDoublePositiveNumber(Palladium_Cost);
+
+ gboolean valid_string = CheckValidString(Gold_Ounces) &
+ CheckValidString(Gold_Premium) &
+ CheckValidString(Gold_Cost);
- gboolean valid_string =
- CheckValidString(Gold_Ounces) & CheckValidString(Gold_Premium);
valid_string = valid_string & CheckValidString(Silver_Ounces) &
- CheckValidString(Silver_Premium);
+ CheckValidString(Silver_Premium) &
+ CheckValidString(Silver_Cost);
+
valid_string = valid_string & CheckValidString(Platinum_Ounces) &
- CheckValidString(Platinum_Premium);
+ CheckValidString(Platinum_Premium) &
+ CheckValidString(Platinum_Cost);
+
valid_string = valid_string & CheckValidString(Palladium_Ounces) &
- CheckValidString(Palladium_Premium);
+ CheckValidString(Palladium_Premium) &
+ CheckValidString(Palladium_Cost);
if (valid_num && valid_string)
gtk_widget_set_sensitive(Button, TRUE);
@@ -459,6 +495,9 @@ void AboutSetLabel() {
"href=\"https://media.flaticon.com/license/license.pdf\">Flaticon";
label = GetWidget("AboutTrendsIconLabel");
gtk_label_set_markup(GTK_LABEL(label), text);
+
+ label = GetWidget("AboutVersionLabel");
+ gtk_label_set_label(GTK_LABEL(label), VERSION_STRING);
}
gint HotkeysShowHide() {
diff --git a/src/gui/gui_security.c b/src/gui/gui_security.c
index 7c72ebe..7fda565 100644
--- a/src/gui/gui_security.c
+++ b/src/gui/gui_security.c
@@ -47,9 +47,11 @@ gint SecurityCursorMove() {
GtkWidget *Button = GetWidget("SecurityOkBTN");
const gchar *symbol = GetEntryText("SecuritySymbolEntryBox");
const gchar *shares = GetEntryText("SecuritySharesEntryBox");
+ const gchar *cost = GetEntryText("SecurityCostEntryBox");
if (CheckValidString(symbol) && CheckValidString(shares) &&
- CheckIfStringLongPositiveNumber(shares))
+ CheckValidString(cost) && CheckIfStringLongPositiveNumber(shares) &&
+ CheckIfStringDoublePositiveNumber(cost))
gtk_widget_set_sensitive(Button, TRUE);
else
gtk_widget_set_sensitive(Button, FALSE);
@@ -138,14 +140,14 @@ static gpointer fetch_data_for_new_stock(gpointer data) {
}
static void add_equity_to_folder(gchar *symbol, const gchar *shares,
- portfolio_packet *pkg) {
+ const gchar *cost, portfolio_packet *pkg) {
equity_folder *F = pkg->GetEquityFolderClass();
/* Remove the stock if it already exists. */
F->RemoveStock(symbol);
/* Add a new stock object to the end of the folder's Equity array. */
- F->AddStock(symbol, shares);
+ F->AddStock(symbol, shares, cost);
/* Generate the Equity Request URLs. */
F->GenerateURL(pkg);
@@ -156,6 +158,7 @@ static void add_equity_to_folder(gchar *symbol, const gchar *shares,
if (pkg->IsDefaultView()) {
/* Sort the equity folder. */
F->Sort();
+ pkg->ToStrings();
gdk_threads_add_idle(MainDefaultTreeview, pkg);
} else {
/* Fetch the data for the new stock */
@@ -178,10 +181,10 @@ static gpointer add_security_ok_thd(gpointer data) {
/* Convert to uppercase letters, must free return value. */
gchar *symbol = g_ascii_strup(tmp, -1);
const gchar *shares = GetEntryText("SecuritySharesEntryBox");
+ const gchar *cost = GetEntryText("SecurityCostEntryBox");
- SqliteEquityAdd(symbol, shares, D);
- add_equity_to_folder(symbol, shares, package);
-
+ SqliteEquityAdd(symbol, shares, cost, D);
+ add_equity_to_folder(symbol, shares, cost, package);
g_free(symbol);
g_mutex_unlock(&mutexes[FETCH_DATA_MUTEX]);
@@ -274,6 +277,9 @@ gint SecurityShowHide(portfolio_packet *pkg) {
EntryBox = GetWidget("SecuritySharesEntryBox");
gtk_entry_set_text(GTK_ENTRY(EntryBox), "");
+
+ EntryBox = GetWidget("SecurityCostEntryBox");
+ gtk_entry_set_text(GTK_ENTRY(EntryBox), "");
g_object_set(G_OBJECT(EntryBox), "activates-default", TRUE, NULL);
/* Reset ComboBox */
diff --git a/src/include/class_types.h b/src/include/class_types.h
index 47c436e..c51393b 100644
--- a/src/include/class_types.h
+++ b/src/include/class_types.h
@@ -68,22 +68,17 @@ typedef struct {
typedef struct {
gchar *bullion;
gchar *metal;
- gchar *ounces;
gchar *premium;
- gchar *high;
- gchar *low;
+ gchar *cost;
+ gchar *range;
gchar *prev_closing;
gchar *chg;
- gchar *gain_sym;
+ gchar *day_gain;
gchar *total;
- gchar *gain_per;
- gchar *gold;
- gchar *silver;
- gchar *platinum;
- gchar *palladium;
+ gchar *total_cost;
+ gchar *total_gain;
gchar *equity;
gchar *symbol;
- gchar *shares;
gchar *price;
gchar *opening;
gchar *asset;
@@ -91,23 +86,7 @@ typedef struct {
gchar *cash;
gchar *portfolio;
gchar *no_assets;
-} primary_heading;
-
-typedef struct {
- gchar *bullion;
- gchar *metal;
- gchar *ounces;
- gchar *premium;
- gchar *gold;
- gchar *silver;
- gchar *platinum;
- gchar *palladium;
- gchar *equity;
- gchar *symbol;
- gchar *shares;
- gchar *cash;
- gchar *no_assets;
-} default_heading;
+} heading_str_t;
/* class type definitions */
struct bullion {
@@ -124,19 +103,25 @@ struct bullion {
gdouble change_value_f;
gdouble change_percent_f;
gdouble change_percent_raw_f; /* The gain not including premium values. */
+ gdouble cost_basis_f; /* Cost per ounce. */
+ gdouble total_cost_f; /* Total cost of this investment. */
+ gdouble total_gain_value_f; /* Total gain of this investment as a value [since
+ purchase]. */
+ gdouble
+ total_gain_percent_f; /* Total gain of this investment as a percent. */
/* Pango Markup language strings */
+ gchar *metal_mrkd_ch;
gchar *spot_price_mrkd_ch;
gchar *premium_mrkd_ch;
gchar *port_value_mrkd_ch;
- gchar *ounce_mrkd_ch;
- gchar *high_metal_mrkd_ch;
- gchar *low_metal_mrkd_ch;
+ gchar *cost_mrkd_ch;
+ gchar *range_mrkd_ch;
gchar *prev_closing_metal_mrkd_ch;
gchar *change_ounce_mrkd_ch;
- gchar *change_value_mrkd_ch;
- gchar *change_percent_mrkd_ch;
+ gchar *total_cost_mrkd_ch;
+ gchar *total_gain_mrkd_ch;
/* Unmarked strings */
gchar *change_percent_raw_ch;
@@ -155,16 +140,21 @@ struct metal {
/* Data Variables */
gdouble bullion_port_value_f;
- gdouble bullion_port_value_chg_f;
- gdouble bullion_port_value_p_chg_f;
+ gdouble bullion_port_day_gain_val_f;
+ gdouble bullion_port_day_gain_per_f;
gdouble gold_silver_ratio_f;
+ gdouble bullion_port_cost_f;
+ gdouble bullion_port_total_gain_value_f;
+ gdouble bullion_port_total_gain_percent_f;
+
/* Pango Markup language strings */
- gchar *bullion_port_value_mrkd_ch; /* Total value of bullion holdings */
- gchar *bullion_port_value_chg_mrkd_ch; /* Total value of bullion holdings
- change */
- gchar *bullion_port_value_p_chg_mrkd_ch; /* Total value of bullion holdings
- percent change */
+ gchar *bullion_port_value_mrkd_ch; /* Total value of bullion holdings */
+ gchar *bullion_port_day_gain_mrkd_ch; /* Total value of bullion holdings
+ change */
+
+ gchar *bullion_port_cost_mrkd_ch; /* Total cost of bullion holdings */
+ gchar *bullion_port_total_gain_mrkd_ch; /* Total gain of bullion holdings */
/* Unmarked strings */
gchar *gold_silver_ratio_ch;
@@ -178,7 +168,7 @@ struct metal {
struct stock {
/* Data Variables */
- guint num_shares_stock_int; /* Cannot hold more than 4294967295 shares
+ guint quantity_int; /* Cannot hold more than 4294967295 shares
of stock on most 64-bit machines */
gdouble current_price_stock_f;
@@ -189,6 +179,11 @@ struct stock {
gdouble change_share_f;
gdouble change_value_f;
gdouble change_percent_f;
+ gdouble cost_basis_f; /* Cost per share. */
+ gdouble total_cost_f; /* Total cost of this investment. */
+ gdouble total_gain_value_f; /* Total gain of this investment as a value. */
+ gdouble
+ total_gain_percent_f; /* Total gain of this investment as a percent. */
gdouble current_investment_stock_f; /* The total current investment in
the stock. */
@@ -196,16 +191,15 @@ struct stock {
/* Pango Markup language strings */
gchar *security_name_mrkd_ch;
gchar *current_price_stock_mrkd_ch;
- gchar *high_stock_mrkd_ch;
- gchar *low_stock_mrkd_ch;
+ gchar *cost_mrkd_ch;
+ gchar *range_mrkd_ch;
gchar *opening_stock_mrkd_ch;
gchar *prev_closing_stock_mrkd_ch;
gchar *change_share_stock_mrkd_ch;
- gchar *change_value_mrkd_ch;
- gchar *change_percent_mrkd_ch;
gchar *current_investment_stock_mrkd_ch;
gchar *symbol_stock_mrkd_ch;
- gchar *num_shares_stock_mrkd_ch;
+ gchar *total_cost_mrkd_ch;
+ gchar *total_gain_mrkd_ch;
/* Unmarked strings */
gchar *symbol_stock_ch; /* The stock symbol in all caps, it's used to create
@@ -223,18 +217,21 @@ struct equity_folder {
/* Data Variables */
gdouble stock_port_value_f;
- gdouble stock_port_value_chg_f;
- gdouble stock_port_value_p_chg_f;
+ gdouble stock_port_day_gain_val_f;
+ gdouble stock_port_day_gain_per_f;
+ gdouble stock_port_cost_f;
+ gdouble stock_port_total_gain_value_f;
+ gdouble stock_port_total_gain_percent_f;
/* Can have up to 255 stocks [0-254]: 8 bits. */
guint8 size;
/* Pango Markup language strings */
- gchar *stock_port_value_mrkd_ch; /* Total value of equity holdings */
- gchar
- *stock_port_value_chg_mrkd_ch; /* Total value of equity holdings change */
- gchar *stock_port_value_p_chg_mrkd_ch; /* Total value of equity holdings
- percent change */
+ gchar *stock_port_value_mrkd_ch; /* Total value of equity holdings */
+ gchar *stock_port_day_gain_mrkd_ch; /* Total value of equity holdings day
+ change */
+ gchar *stock_port_cost_mrkd_ch; /* Total cost of equity holdings */
+ gchar *stock_port_total_gain_mrkd_ch; /* Total gain of equity holdings */
/* Method/Function pointers */
void (*ToStrings)(guint8 digits_right);
@@ -242,7 +239,7 @@ struct equity_folder {
void (*GenerateURL)(portfolio_packet *pkg);
gint (*SetUpCurl)(portfolio_packet *pkg);
void (*ExtractData)();
- void (*AddStock)(const gchar *symbol, const gchar *shares);
+ void (*AddStock)(const gchar *symbol, const gchar *shares, const gchar *cost);
void (*Sort)();
void (*Reset)();
void (*RemoveStock)(const gchar *s);
@@ -259,11 +256,16 @@ struct meta {
gdouble cash_f; /* Total value of cash */
- gdouble portfolio_port_value_f; /* Total value of the entire portfolio */
- gdouble portfolio_port_value_chg_f; /* Total value of the entire
- portfolio change */
- gdouble portfolio_port_value_p_chg_f; /* Total value of the entire
- portfolio percent change */
+ gdouble portfolio_value_f; /* Total value of the entire portfolio */
+ gdouble portfolio_day_gain_value_f; /* Total daily gain of the entire
+ portfolio as a value */
+ gdouble portfolio_day_gain_percent_f; /* Total daily gain of the entire
+ portfolio as a percent change*/
+ gdouble portfolio_cost_f; /* Total cost of portfolio. */
+ gdouble portfolio_total_gain_value_f; /* Total gain of portfolio as a
+ value. */
+ gdouble portfolio_total_gain_percent_f; /* Total gain of portfolio as a
+ percent. */
gdouble index_dow_value_f;
gdouble index_dow_value_chg_f;
@@ -287,13 +289,14 @@ struct meta {
guint8 decimal_places_guint8;
/* Pango Markup language strings */
- primary_heading pri_h_mkd;
- default_heading def_h_mkd;
+ heading_str_t headings_mkd;
gchar *cash_mrkd_ch;
- gchar *portfolio_port_value_mrkd_ch;
- gchar *portfolio_port_value_chg_mrkd_ch;
- gchar *portfolio_port_value_p_chg_mrkd_ch;
+ gchar *portfolio_value_mrkd_ch;
+ gchar *portfolio_day_gain_mrkd_ch;
+
+ gchar *portfolio_cost_mrkd_ch; /* Total cost of portfolio holdings */
+ gchar *portfolio_total_gain_mrkd_ch; /* Total gain of portfolio holdings */
/* Unmarked strings */
gchar *stock_url_ch; /* First component of the stock request URL */
@@ -406,8 +409,7 @@ struct portfolio_packet {
void (*SetMainCurlCanceled)(gboolean canceled_bool);
gdouble (*GetHoursOfUpdates)();
gdouble (*GetUpdatesPerMinute)();
- gpointer (*GetPrimaryHeadings)();
- gpointer (*GetDefaultHeadings)();
+ gpointer (*GetHeadings)();
void (*SaveSqlData)();
gpointer (*GetWindowData)();
gpointer (*GetMetaClass)();
diff --git a/src/include/gui_types.h b/src/include/gui_types.h
index 48cf581..44253d3 100644
--- a/src/include/gui_types.h
+++ b/src/include/gui_types.h
@@ -75,7 +75,6 @@ enum {
MAIN_COLUMN_EIGHT,
MAIN_COLUMN_NINE,
MAIN_COLUMN_TEN,
- MAIN_COLUMN_ELEVEN,
MAIN_N_COLUMNS
};
@@ -91,7 +90,6 @@ enum {
HISTORY_COLUMN_EIGHT,
HISTORY_COLUMN_NINE,
HISTORY_COLUMN_TEN,
- HISTORY_COLUMN_ELEVEN,
HISTORY_N_COLUMNS
};
diff --git a/src/include/macros.h b/src/include/macros.h
index 031983b..4aa8a69 100644
--- a/src/include/macros.h
+++ b/src/include/macros.h
@@ -33,6 +33,11 @@ POSSIBILITY OF SUCH DAMAGE.
#ifndef MACROS_HEADER_H
#define MACROS_HEADER_H
+/* The application version */
+#ifndef VERSION_STRING
+#define VERSION_STRING "0.3.0"
+#endif
+
/* To suppress unused argument warnings. */
#ifndef UNUSED
#define UNUSED(x) (void)x;
@@ -68,24 +73,24 @@ POSSIBILITY OF SUCH DAMAGE.
/* The Yahoo! URL Macros are used by the GetYahooUrl ()
* function */
-#ifndef YAHOO_URL_START
-#define YAHOO_URL_START "https://query1.finance.yahoo.com/v7/finance/download/"
+#ifndef YAHOO_URL_ONE
+#define YAHOO_URL_ONE "https://query1.finance.yahoo.com/v7/finance/download/"
#endif
-#ifndef YAHOO_URL_MIDDLE_ONE
-#define YAHOO_URL_MIDDLE_ONE "?period1="
+#ifndef YAHOO_URL_TWO
+#define YAHOO_URL_TWO "?period1="
#endif
-#ifndef YAHOO_URL_MIDDLE_TWO
-#define YAHOO_URL_MIDDLE_TWO "&period2="
+#ifndef YAHOO_URL_THREE
+#define YAHOO_URL_THREE "&period2="
#endif
-#ifndef YAHOO_URL_END
-#define YAHOO_URL_END "&interval=1d&events=history&includeAdjustedClose=TRUE"
+#ifndef YAHOO_URL_FOUR
+#define YAHOO_URL_FOUR "&interval=1d&events=history&includeAdjustedClose=TRUE"
#endif
/* The symbol URL macros are used by the ClassInitMeta () [class_meta.c] and
- * api_callback () [sqlite.c] functions */
+ * app_callback () [sqlite.c] functions */
#ifndef NASDAQ_SYMBOL_URL
#define NASDAQ_SYMBOL_URL \
"http://www.nasdaqtrader.com/dynamic/SymDir/nasdaqlisted.txt"
diff --git a/src/include/sqlite.h b/src/include/sqlite.h
index 5f22a94..8d2e52b 100644
--- a/src/include/sqlite.h
+++ b/src/include/sqlite.h
@@ -41,7 +41,8 @@ void SqliteProcessing(portfolio_packet *pkg);
void SqliteAppAdd(meta *D, ...);
void SqliteBullionAdd(meta *D, ...);
-void SqliteEquityAdd(const gchar *symbol, const gchar *shares, meta *D);
+void SqliteEquityAdd(const gchar *symbol, const gchar *shares,
+ const gchar *cost, meta *D);
void SqliteEquityRemove(const gchar *symbol, meta *D);
void SqliteEquityRemoveAll(meta *D);
diff --git a/src/include/workfuncs.h b/src/include/workfuncs.h
index 30d3e69..8ff2bbd 100644
--- a/src/include/workfuncs.h
+++ b/src/include/workfuncs.h
@@ -63,6 +63,15 @@ void DoubleToFormattedStrPango(gchar **dst, const gdouble num,
const guint8 digits_right,
const guint format_type, const guint color);
void StringToStrPango(gchar **dst, const gchar *src, const guint color);
+void RangeStrPango(gchar **dest, const double low_f, const double high_f,
+ const guint8 digits_right);
+void ChangeStrPango(gchar **dest, const double value_f, const double percent_f,
+ const guint8 digits_right);
+void TotalStrPango(gchar **dest, const double total_f, const double gain_f,
+ const guint8 digits_right);
+void SymbolStrPango(gchar **dest, const gchar *symbol_ch,
+ const double quantity_f, const guint8 digits_right,
+ const guint color);
/* sn_map */
void AddSymbolToMap(const gchar *symbol, const gchar *name,
diff --git a/src/resources/financials.glade b/src/resources/financials.glade
index 29bc665..1363ab6 100644
--- a/src/resources/financials.glade
+++ b/src/resources/financials.glade
@@ -404,10 +404,9 @@
vertical
7
-
@@ -763,7 +796,7 @@ POSSIBILITY OF SUCH DAMAGE.
0
none
-
+
True
False
@@ -803,6 +836,7 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Number of ounces
center
center
10
@@ -819,11 +853,12 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Premium per ounce
center
center
10
0.5
- $$$
+ Premium per ounce
alpha
@@ -831,6 +866,38 @@ POSSIBILITY OF SUCH DAMAGE.
1
+
+
+ True
+ False
+ Cost
+ center
+
+
+
+
+
+ 2
+ 0
+
+
+
+
+ True
+ True
+ Cost per ounce
+ center
+ center
+ 10
+ 0.5
+ Cost per ounce
+ alpha
+
+
+ 2
+ 1
+
+
@@ -855,7 +922,7 @@ POSSIBILITY OF SUCH DAMAGE.
0
none
-
+
True
False
@@ -895,6 +962,7 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Number of ounces
center
center
10
@@ -911,11 +979,12 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Premium per ounce
center
center
10
0.5
- $$$
+ Premium per ounce
alpha
@@ -923,6 +992,38 @@ POSSIBILITY OF SUCH DAMAGE.
1
+
+
+ True
+ False
+ Cost
+ center
+
+
+
+
+
+ 2
+ 0
+
+
+
+
+ True
+ True
+ Cost per ounce
+ center
+ center
+ 10
+ 0.5
+ Cost per ounce
+ alpha
+
+
+ 2
+ 1
+
+
@@ -948,7 +1049,7 @@ POSSIBILITY OF SUCH DAMAGE.
0
none
-
+
True
False
@@ -988,6 +1089,7 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Number of ounces
center
center
10
@@ -1004,11 +1106,12 @@ POSSIBILITY OF SUCH DAMAGE.
True
True
+ Premium per ounce
center
center
10
0.5
- $$$
+ Premium per ounce
alpha
@@ -1016,6 +1119,38 @@ POSSIBILITY OF SUCH DAMAGE.
1
+
+
+ True
+ False
+ Cost
+ center
+
+
+
+
+
+ 2
+ 0
+
+
+
+
+ True
+ True
+ Cost per ounce
+ center
+ center
+ 10
+ 0.5
+ Cost per ounce
+ alpha
+
+
+ 2
+ 1
+
+
@@ -3931,7 +4066,7 @@ POSSIBILITY OF SUCH DAMAGE.
True
False
- gtk-add
+ list-add
1
@@ -3954,7 +4089,7 @@ POSSIBILITY OF SUCH DAMAGE.
True
False
- gtk-help
+ help-contents
1
@@ -4220,6 +4355,8 @@ POSSIBILITY OF SUCH DAMAGE.
Sans 12
en-us
+ False
+
1
@@ -4302,6 +4439,7 @@ POSSIBILITY OF SUCH DAMAGE.
False
5
vertical
+ 5
True
@@ -4311,7 +4449,7 @@ POSSIBILITY OF SUCH DAMAGE.
slide-left-right
True
-
+
True
False
@@ -4380,6 +4518,37 @@ POSSIBILITY OF SUCH DAMAGE.
3
+
+
+ True
+ False
+ Cost
+
+
+
+
+
+ 0
+ 4
+
+
+
+
+ True
+ True
+ Cost per share
+ center
+ center
+ 10
+ 0.5
+ Cost per share
+ digits
+
+
+ 0
+ 5
+
+
add
diff --git a/src/resources/resources.c b/src/resources/resources.c
index c83f087..74337be 100644
--- a/src/resources/resources.c
+++ b/src/resources/resources.c
@@ -6,7 +6,7 @@
# define SECTION
#endif
-static const SECTION union { const guint8 data[15982]; const double alignment; void * const ptr;} resources_resource_data = { {
+static const SECTION union { const guint8 data[16488]; const double alignment; void * const ptr;} resources_resource_data = { {
0107, 0126, 0141, 0162, 0151, 0141, 0156, 0164, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000,
0030, 0000, 0000, 0000, 0220, 0000, 0000, 0000, 0000, 0000, 0000, 0050, 0004, 0000, 0000, 0000,
0000, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0003, 0000, 0000, 0000,
@@ -15,7 +15,7 @@ static const SECTION union { const guint8 data[15982]; const double alignment; v
0057, 0020, 0000, 0000, 0017, 0000, 0166, 0000, 0100, 0020, 0000, 0000, 0052, 0030, 0000, 0000,
0324, 0265, 0002, 0000, 0377, 0377, 0377, 0377, 0052, 0030, 0000, 0000, 0001, 0000, 0114, 0000,
0054, 0030, 0000, 0000, 0070, 0030, 0000, 0000, 0267, 0013, 0072, 0345, 0002, 0000, 0000, 0000,
- 0070, 0030, 0000, 0000, 0020, 0000, 0166, 0000, 0110, 0030, 0000, 0000, 0155, 0076, 0000, 0000,
+ 0070, 0030, 0000, 0000, 0020, 0000, 0166, 0000, 0110, 0030, 0000, 0000, 0147, 0100, 0000, 0000,
0123, 0164, 0157, 0143, 0153, 0163, 0055, 0151, 0143, 0157, 0156, 0055, 0061, 0062, 0070, 0056,
0160, 0156, 0147, 0000, 0000, 0000, 0000, 0000, 0167, 0017, 0000, 0000, 0000, 0000, 0000, 0000,
0211, 0120, 0116, 0107, 0015, 0012, 0032, 0012, 0000, 0000, 0000, 0015, 0111, 0110, 0104, 0122,
@@ -395,617 +395,649 @@ static const SECTION union { const guint8 data[15982]; const double alignment; v
0202, 0122, 0203, 0266, 0020, 0074, 0000, 0000, 0000, 0000, 0111, 0105, 0116, 0104, 0256, 0102,
0140, 0202, 0000, 0000, 0050, 0165, 0165, 0141, 0171, 0051, 0057, 0000, 0000, 0000, 0000, 0000,
0001, 0000, 0000, 0000, 0003, 0000, 0000, 0000, 0146, 0151, 0156, 0141, 0156, 0143, 0151, 0141,
- 0154, 0163, 0056, 0147, 0154, 0141, 0144, 0145, 0122, 0107, 0003, 0000, 0001, 0000, 0000, 0000,
- 0170, 0332, 0355, 0135, 0353, 0162, 0343, 0066, 0226, 0376, 0357, 0247, 0300, 0250, 0246, 0262,
- 0223, 0232, 0246, 0055, 0311, 0355, 0164, 0146, 0222, 0366, 0224, 0154, 0313, 0155, 0155, 0273,
- 0055, 0217, 0045, 0047, 0351, 0371, 0323, 0103, 0221, 0260, 0205, 0061, 0111, 0060, 0044, 0150,
- 0133, 0251, 0175, 0241, 0175, 0215, 0175, 0262, 0005, 0110, 0311, 0226, 0054, 0136, 0000, 0136,
- 0044, 0112, 0072, 0133, 0265, 0231, 0266, 0110, 0200, 0270, 0234, 0357, 0334, 0161, 0360, 0363,
- 0077, 0236, 0155, 0013, 0075, 0142, 0317, 0047, 0324, 0371, 0330, 0150, 0355, 0067, 0033, 0010,
- 0073, 0006, 0065, 0211, 0163, 0377, 0261, 0161, 0073, 0074, 0327, 0176, 0154, 0374, 0343, 0170,
- 0357, 0347, 0077, 0151, 0032, 0372, 0204, 0035, 0354, 0351, 0014, 0233, 0350, 0211, 0260, 0061,
- 0272, 0267, 0164, 0023, 0243, 0303, 0375, 0367, 0315, 0375, 0046, 0322, 0064, 0376, 0022, 0161,
- 0030, 0366, 0356, 0164, 0003, 0037, 0357, 0041, 0364, 0263, 0207, 0177, 0017, 0210, 0207, 0175,
- 0144, 0221, 0321, 0307, 0306, 0075, 0173, 0370, 0153, 0343, 0365, 0103, 0207, 0373, 0355, 0367,
- 0215, 0203, 0360, 0075, 0072, 0372, 0017, 0066, 0030, 0062, 0054, 0335, 0367, 0077, 0066, 0076,
- 0261, 0207, 0057, 0330, 0011, 0032, 0210, 0230, 0037, 0033, 0235, 0353, 0136, 0370, 0207, 0170,
- 0217, 0277, 0351, 0172, 0324, 0305, 0036, 0233, 0040, 0107, 0267, 0361, 0307, 0306, 0043, 0361,
- 0311, 0310, 0302, 0215, 0343, 0241, 0027, 0340, 0237, 0017, 0146, 0117, 0343, 0137, 0066, 0164,
- 0107, 0273, 0243, 0106, 0340, 0067, 0216, 0317, 0165, 0313, 0137, 0176, 0337, 0030, 0023, 0313,
- 0214, 0376, 0235, 0064, 0250, 0036, 0303, 0366, 0302, 0300, 0116, 0055, 0352, 0343, 0306, 0254,
- 0221, 0342, 0010, 0363, 0214, 0062, 0256, 0215, 0245, 0217, 0260, 0325, 0100, 0314, 0323, 0035,
- 0337, 0322, 0231, 0316, 0077, 0370, 0261, 0061, 0301, 0274, 0213, 0157, 0341, 0370, 0144, 0372,
- 0010, 0174, 0254, 0005, 0216, 0211, 0075, 0213, 0070, 0151, 0303, 0325, 0015, 0003, 0133, 0202,
- 0010, 0250, 0207, 0036, 0360, 0204, 0017, 0270, 0201, 0174, 0162, 0357, 0350, 0326, 0307, 0206,
- 0156, 0060, 0362, 0310, 0311, 0243, 0201, 0154, 0116, 0076, 0167, 0204, 0157, 0065, 0137, 0271,
- 0263, 0317, 0337, 0116, 0373, 0127, 0303, 0233, 0376, 0345, 0267, 0057, 0235, 0301, 0347, 0150,
- 0317, 0303, 0276, 0016, 0242, 0065, 0236, 0056, 0377, 0301, 0313, 0372, 0317, 0077, 0130, 0336,
- 0207, 0137, 0211, 0143, 0322, 0247, 0351, 0056, 0270, 0144, 0372, 0147, 0316, 0075, 0217, 0171,
- 0337, 0304, 0167, 0172, 0140, 0061, 0071, 0242, 0342, 0324, 0115, 0376, 0320, 0303, 0035, 0226,
- 0372, 0300, 0264, 0163, 0355, 0211, 0230, 0154, 0334, 0070, 0076, 0072, 0152, 0312, 0266, 0030,
- 0143, 0162, 0077, 0346, 0243, 0152, 0313, 0064, 0361, 0231, 0107, 0047, 0232, 0000, 0251, 0346,
- 0352, 0036, 0166, 0044, 0147, 0103, 0014, 0352, 0064, 0216, 0007, 0214, 0032, 0017, 0276, 0046,
- 0376, 0330, 0167, 0235, 0373, 0254, 0106, 0376, 0003, 0161, 0371, 0127, 0356, 0261, 0247, 0215,
- 0111, 0342, 0227, 0062, 0300, 0165, 0102, 0237, 0327, 0215, 0042, 0133, 0367, 0356, 0211, 0243,
- 0061, 0352, 0362, 0105, 0156, 0052, 0264, 0030, 0121, 0306, 0250, 0335, 0070, 0156, 0111, 0065,
- 0242, 0036, 0341, 0373, 0241, 0063, 0042, 0226, 0232, 0163, 0103, 0106, 0014, 0335, 0222, 0151,
- 0350, 0273, 0272, 0301, 0171, 0262, 0354, 0340, 0106, 0272, 0217, 0005, 0226, 0065, 0227, 0372,
- 0044, 0372, 0032, 0237, 0132, 0154, 0313, 0205, 0275, 0211, 0337, 0237, 0053, 0312, 0360, 0210,
- 0322, 0207, 0027, 0346, 0367, 0362, 0303, 0174, 0273, 0034, 0073, 0227, 0261, 0173, 0052, 0315,
- 0374, 0061, 0175, 0342, 0233, 0341, 0161, 0046, 0226, 0262, 0355, 0361, 0063, 0226, 0241, 0312,
- 0102, 0163, 0314, 0113, 0245, 0031, 0264, 0347, 0063, 0335, 0143, 0111, 0244, 0227, 0321, 0026,
- 0073, 0146, 0316, 0226, 0041, 0106, 0216, 0162, 0064, 0234, 0101, 0105, 0251, 0255, 0064, 0142,
- 0062, 0221, 0223, 0061, 0331, 0220, 0052, 0020, 0233, 0270, 0142, 0157, 0260, 0120, 0145, 0142,
- 0166, 0077, 0216, 0116, 0272, 0016, 0363, 0046, 0057, 0022, 0351, 0326, 0263, 0076, 0343, 0111,
- 0370, 0133, 0074, 0001, 0025, 0042, 0242, 0002, 0200, 0111, 0152, 0316, 0050, 0265, 0030, 0147,
- 0342, 0014, 0077, 0263, 0130, 0065, 0242, 0343, 0272, 0234, 0130, 0120, 0343, 0073, 0335, 0166,
- 0177, 0142, 0364, 0001, 0163, 0375, 0015, 0215, 0360, 0035, 0365, 0060, 0232, 0320, 0300, 0103,
- 0167, 0304, 0161, 0306, 0301, 0150, 0237, 0120, 0241, 0024, 0354, 0357, 0355, 0315, 0277, 0372,
- 0235, 0305, 0176, 0372, 0332, 0277, 0275, 0101, 0235, 0323, 0323, 0376, 0355, 0325, 0020, 0175,
- 0356, 0176, 0375, 0356, 0236, 0375, 0324, 0120, 0035, 0347, 0243, 0156, 0161, 0115, 0243, 0161,
- 0034, 0355, 0215, 0152, 0353, 0105, 0304, 0034, 0345, 0154, 0036, 0202, 0046, 0157, 0143, 0051,
- 0362, 0217, 0153, 0377, 0074, 0235, 0171, 0163, 0137, 0271, 0251, 0153, 0161, 0165, 0174, 0114,
- 0055, 0316, 0025, 0223, 0067, 0130, 0142, 0267, 0124, 0277, 0113, 0034, 0067, 0140, 0232, 0033,
- 0170, 0156, 0250, 0041, 0353, 0226, 0073, 0326, 0323, 0373, 0130, 0324, 0007, 0337, 0366, 0256,
- 0033, 0017, 0034, 0303, 0162, 0337, 0306, 0317, 0256, 0056, 0366, 0051, 0223, 0253, 0306, 0065,
- 0276, 0043, 0226, 0225, 0017, 0107, 0257, 0222, 0366, 0175, 0326, 0114, 0023, 0247, 0063, 0247,
- 0006, 0307, 0161, 0047, 0071, 0176, 0164, 0031, 0032, 0004, 0253, 0145, 0074, 0271, 0326, 0072,
- 0331, 0162, 0071, 0177, 0345, 0050, 0302, 0214, 0344, 0032, 0055, 0012, 0074, 0113, 0265, 0377,
- 0377, 0004, 0076, 0043, 0167, 0023, 0151, 0226, 0241, 0063, 0346, 0221, 0121, 0300, 0260, 0037,
- 0377, 0302, 0374, 0053, 0063, 0162, 0241, 0016, 0343, 0066, 0203, 0317, 0355, 0040, 0316, 0237,
- 0002, 0376, 0113, 0377, 0171, 0162, 0217, 0035, 0155, 0300, 0347, 0204, 0132, 0315, 0127, 0173,
- 0347, 0355, 0106, 0247, 0177, 0154, 0213, 0320, 0320, 0134, 0057, 0032, 0026, 0245, 0163, 0367,
- 0367, 0200, 0260, 0011, 0227, 0321, 0333, 0044, 0240, 0207, 0143, 0074, 0057, 0203, 0161, 0070,
- 0307, 0171, 0340, 0274, 0103, 0016, 0145, 0210, 0070, 0206, 0025, 0010, 0307, 0016, 0322, 0221,
- 0077, 0261, 0107, 0324, 0102, 0221, 0031, 0037, 0221, 0256, 0220, 0333, 0143, 0306, 0134, 0377,
- 0357, 0007, 0007, 0257, 0275, 0035, 0350, 0056, 0071, 0170, 0154, 0035, 0374, 0036, 0160, 0225,
- 0377, 0037, 0121, 0263, 0217, 0040, 0273, 0153, 0043, 0273, 0045, 0167, 0014, 0344, 0267, 0002,
- 0307, 0152, 0255, 0227, 0143, 0015, 0260, 0253, 0207, 0056, 0266, 0372, 0311, 0360, 0055, 0332,
- 0344, 0066, 0050, 0151, 0345, 0051, 0151, 0134, 0210, 0200, 0162, 0266, 0211, 0050, 0070, 0054,
- 0033, 0005, 0361, 0153, 0023, 0373, 0362, 0202, 0307, 0205, 0023, 0126, 0043, 0333, 0045, 0227,
- 0204, 0232, 0052, 0234, 0162, 0252, 0115, 0223, 0201, 0022, 0051, 0235, 0250, 0163, 0335, 0113,
- 0355, 0057, 0203, 0350, 0312, 0240, 0356, 0064, 0312, 0116, 0242, 0352, 0144, 0212, 0136, 0122,
- 0124, 0365, 0221, 0026, 0021, 0145, 0006, 0075, 0047, 0220, 0125, 0012, 0225, 0200, 0267, 0026,
- 0274, 0265, 0125, 0170, 0153, 0257, 0276, 0016, 0272, 0203, 0120, 0105, 0366, 0267, 0320, 0050,
- 0024, 0263, 0103, 0134, 0300, 0040, 0312, 0306, 0330, 0103, 0026, 0361, 0105, 0364, 0076, 0062,
- 0011, 0174, 0141, 0030, 0116, 0115, 0076, 0156, 0077, 0074, 0075, 0075, 0355, 0073, 0272, 0157,
- 0352, 0277, 0363, 0276, 0270, 0305, 0261, 0157, 0120, 0373, 0300, 0234, 0360, 0217, 0021, 0343,
- 0200, 0257, 0320, 0031, 0361, 0016, 0302, 0136, 0242, 0116, 0366, 0031, 0377, 0054, 0130, 0201,
- 0165, 0262, 0002, 0363, 0155, 0042, 0030, 0206, 0340, 0330, 0135, 0241, 0315, 0160, 0025, 0122,
- 0347, 0074, 0013, 0002, 0273, 0001, 0234, 0272, 0005, 0235, 0272, 0021, 0121, 0155, 0261, 0030,
- 0237, 0007, 0215, 0272, 0330, 0216, 0236, 0203, 0334, 0336, 0154, 0271, 0375, 0166, 0027, 0101,
- 0160, 0203, 0107, 0027, 0074, 0272, 0340, 0321, 0055, 0125, 0073, 0313, 0262, 0027, 0101, 0131,
- 0003, 0047, 0157, 0051, 0256, 0102, 0051, 0326, 0254, 0356, 0046, 0334, 0001, 0147, 0162, 0244,
- 0346, 0042, 0256, 0346, 0372, 0333, 0355, 0115, 0226, 0224, 0336, 0053, 0160, 0102, 0307, 0315,
- 0045, 0176, 0036, 0271, 0240, 0257, 0016, 0171, 0145, 0273, 0054, 0146, 0256, 0113, 0363, 0224,
- 0111, 0004, 0077, 0011, 0270, 0042, 0355, 0274, 0030, 0136, 0375, 0317, 0047, 0303, 0253, 0032,
- 0345, 0200, 0147, 0036, 0340, 0110, 0152, 0070, 0326, 0375, 0174, 0015, 0075, 0154, 0140, 0362,
- 0210, 0163, 0266, 0316, 0264, 0376, 0116, 0251, 0155, 0023, 0206, 0116, 0307, 0272, 0163, 0217,
- 0175, 0371, 0331, 0310, 0330, 0153, 0371, 0254, 0074, 0331, 0160, 0314, 0052, 0231, 0253, 0162,
- 0100, 0046, 0231, 0273, 0366, 0077, 0257, 0220, 0251, 0266, 0312, 0141, 0252, 0361, 0362, 0160,
- 0351, 0250, 0026, 0175, 0075, 0252, 0145, 0130, 0304, 0170, 0300, 0246, 0344, 0111, 0255, 0015,
- 0143, 0201, 0255, 0274, 0054, 0060, 0361, 0104, 0332, 0133, 0355, 0202, 0060, 0013, 0217, 0364,
- 0127, 0143, 0156, 0231, 0372, 0057, 0260, 0060, 0343, 0117, 0164, 0157, 0335, 0307, 0232, 0302,
- 0123, 0061, 0206, 0070, 0006, 0250, 0215, 0042, 0336, 0235, 0374, 0271, 0245, 0071, 0066, 0322,
- 0205, 0101, 0034, 0304, 0313, 0346, 0376, 0112, 0124, 0223, 0014, 0353, 0224, 0320, 0173, 0012,
- 0246, 0013, 0053, 0111, 0111, 0130, 0136, 0106, 0123, 0056, 0151, 0054, 0216, 0240, 0116, 0045,
- 0162, 0175, 0144, 0160, 0330, 0104, 0243, 0216, 0026, 0062, 0031, 0305, 0035, 0054, 0046, 0116,
- 0075, 0154, 0021, 0174, 0327, 0070, 0166, 0250, 0243, 0300, 0067, 0334, 0300, 0015, 0011, 0104,
- 0254, 0246, 0154, 0053, 0161, 0136, 0226, 0267, 0244, 0217, 0171, 0017, 0233, 0315, 0171, 0007,
- 0017, 0162, 0161, 0363, 0273, 0162, 0271, 0271, 0054, 0053, 0114, 0077, 0234, 0073, 0167, 0162,
- 0173, 0104, 0003, 0126, 0323, 0263, 0333, 0263, 0241, 0301, 0351, 0355, 0365, 0236, 0336, 0026,
- 0373, 0120, 0352, 0371, 0155, 0325, 0343, 0330, 0073, 0175, 0340, 0071, 0333, 0110, 0120, 0067,
- 0020, 0312, 0077, 0355, 0174, 0224, 0367, 0310, 0162, 0317, 0346, 0133, 0124, 0047, 0345, 0244,
- 0122, 0243, 0354, 0255, 0120, 0043, 0317, 0243, 0340, 0156, 0201, 0264, 0265, 0126, 0373, 0307,
- 0070, 0362, 0006, 0017, 0307, 0306, 0052, 0265, 0347, 0304, 0321, 0035, 0203, 0350, 0226, 0264,
- 0143, 0100, 0322, 0035, 0277, 0204, 0106, 0056, 0065, 0014, 0246, 0147, 0117, 0271, 0064, 0125,
- 0372, 0204, 0153, 0106, 0250, 0325, 0136, 0266, 0217, 0227, 0372, 0171, 0212, 0012, 0143, 0314,
- 0072, 0031, 0143, 0375, 0161, 0222, 0137, 0015, 0337, 0076, 0243, 0126, 0216, 0352, 0007, 0214,
- 0167, 0063, 0047, 0226, 0243, 0277, 0153, 0204, 0202, 0220, 0374, 0303, 0265, 0320, 0314, 0300,
- 0233, 0112, 0224, 0243, 0146, 0063, 0107, 0173, 0141, 0340, 0066, 0216, 0175, 0213, 0230, 0134,
- 0153, 0162, 0065, 0256, 0176, 0070, 0262, 0275, 0204, 0005, 0216, 0134, 0312, 0141, 0210, 0065,
- 0256, 0152, 0144, 0315, 0175, 0363, 0063, 0227, 0313, 0113, 0347, 0375, 0220, 0235, 0315, 0273,
- 0063, 0141, 0326, 0346, 0176, 0173, 0277, 0275, 0171, 0241, 0324, 0026, 0204, 0122, 0327, 0235,
- 0367, 0266, 0005, 0304, 0337, 0341, 0046, 0247, 0355, 0132, 0341, 0211, 0345, 0110, 0175, 0101,
- 0304, 0361, 0231, 0027, 0330, 0234, 0256, 0367, 0001, 0025, 0220, 0136, 0225, 0023, 0025, 0163,
- 0116, 0005, 0074, 0342, 0043, 0303, 0133, 0000, 0226, 0351, 0114, 0000, 0025, 0220, 0217, 0266,
- 0213, 0262, 0342, 0224, 0272, 0023, 0117, 0330, 0167, 0350, 0377, 0376, 0027, 0265, 0233, 0355,
- 0266, 0246, 0361, 0377, 0036, 0162, 0363, 0320, 0147, 0324, 0071, 0031, 0234, 0125, 0015, 0214,
- 0234, 0206, 0160, 0271, 0300, 0012, 0021, 0365, 0143, 0022, 0240, 0142, 0272, 0360, 0331, 0204,
- 0217, 0160, 0326, 0334, 0241, 0236, 0255, 0133, 0012, 0315, 0337, 0230, 0324, 0076, 0266, 0211,
- 0025, 0376, 0042, 0337, 0305, 0243, 0356, 0021, 0335, 0141, 0222, 0143, 0200, 0124, 0274, 0165,
- 0111, 0312, 0241, 0207, 0035, 0323, 0357, 0031, 0324, 0331, 0002, 0156, 0021, 0115, 0006, 0011,
- 0157, 0047, 0342, 0000, 0042, 0367, 0016, 0066, 0321, 0150, 0202, 0316, 0075, 0214, 0135, 0362,
- 0200, 0356, 0074, 0152, 0243, 0163, 0336, 0106, 0274, 0001, 0234, 0003, 0070, 0007, 0234, 0075,
- 0334, 0051, 0155, 0142, 0070, 0046, 0076, 0342, 0157, 0337, 0173, 0272, 0215, 0014, 0152, 0143,
- 0077, 0052, 0144, 0256, 0217, 0174, 0152, 0161, 0012, 0262, 0170, 0027, 0024, 0075, 0351, 0036,
- 0157, 0312, 0046, 0373, 0300, 0041, 0200, 0103, 0154, 0024, 0207, 0070, 0252, 0137, 0232, 0277,
- 0370, 0157, 0343, 0130, 0104, 0313, 0225, 0112, 0127, 0104, 0331, 0147, 0261, 0336, 0043, 0241,
- 0265, 0254, 0266, 0260, 0310, 0300, 0360, 0250, 0145, 0141, 0163, 0051, 0167, 0341, 0315, 0203,
- 0172, 0036, 0044, 0170, 0234, 0221, 0245, 0152, 0303, 0261, 0037, 0116, 0157, 0244, 0173, 0232,
- 0113, 0055, 0142, 0160, 0306, 0346, 0340, 0307, 0164, 0276, 0266, 0234, 0175, 0250, 0363, 0225,
- 0231, 0106, 0134, 0210, 0243, 0124, 0204, 0204, 0070, 0032, 0127, 0323, 0030, 0347, 0245, 0263,
- 0162, 0371, 0355, 0146, 0063, 0157, 0017, 0263, 0362, 0371, 0255, 0037, 0233, 0145, 0305, 0041,
- 0176, 0041, 0370, 0311, 0245, 0342, 0110, 0153, 0375, 0145, 0242, 0064, 0021, 0144, 0156, 0042,
- 0146, 0306, 0030, 0233, 0032, 0311, 0326, 0237, 0023, 0227, 0122, 0316, 0062, 0271, 0044, 0134,
- 0214, 0372, 0251, 0076, 0274, 0302, 0313, 0134, 0306, 0122, 0347, 0165, 0150, 0374, 0305, 0370,
- 0076, 0362, 0150, 0054, 0072, 0064, 0366, 0121, 0307, 0262, 0120, 0370, 0212, 0217, 0074, 0354,
- 0143, 0357, 0021, 0233, 0373, 0173, 0173, 0067, 0330, 0044, 0176, 0044, 0307, 0070, 0257, 0017,
- 0317, 0350, 0005, 0076, 0106, 0304, 0101, 0076, 0015, 0074, 0003, 0207, 0277, 0214, 0210, 0243,
- 0173, 0023, 0164, 0307, 0005, 0242, 0377, 0056, 0322, 0155, 0250, 0027, 0376, 0057, 0137, 0320,
- 0275, 0050, 0257, 0313, 0010, 0203, 0171, 0357, 0220, 0356, 0141, 0304, 0307, 0154, 0023, 0046,
- 0216, 0370, 0361, 0011, 0074, 0022, 0223, 0377, 0203, 0215, 0165, 0306, 0377, 0203, 0171, 0047,
- 0226, 0105, 0237, 0104, 0261, 0120, 0216, 0041, 0063, 0224, 0060, 0276, 0150, 0264, 0147, 0143,
- 0366, 0367, 0275, 0160, 0051, 0376, 0322, 0372, 0036, 0055, 0216, 0313, 0107, 0364, 0156, 0066,
- 0040, 0203, 0232, 0030, 0331, 0134, 0047, 0342, 0323, 0140, 0072, 0037, 0250, 0350, 0125, 0037,
- 0321, 0107, 0361, 0150, 0272, 0012, 0141, 0067, 0016, 0345, 0006, 0031, 0176, 0307, 0237, 0023,
- 0077, 0074, 0162, 0050, 0072, 0231, 0377, 0250, 0143, 0276, 0031, 0021, 0377, 0044, 0047, 0034,
- 0142, 0143, 0157, 0177, 0072, 0222, 0366, 0362, 0110, 0370, 0027, 0347, 0326, 0143, 0066, 0022,
- 0076, 0121, 0063, 0340, 0243, 0253, 0142, 0060, 0374, 0223, 0141, 0037, 0342, 0271, 0311, 0111,
- 0310, 0236, 0205, 0116, 0105, 0253, 0003, 0276, 0023, 0321, 0251, 0112, 0133, 0347, 0332, 0241,
- 0310, 0332, 0170, 0135, 0365, 0160, 0253, 0370, 0303, 0260, 0371, 0374, 0064, 0146, 0363, 0073,
- 0374, 0136, 0324, 0001, 0020, 0324, 0045, 0306, 0023, 0016, 0076, 0340, 0273, 0052, 0072, 0233,
- 0204, 0265, 0135, 0107, 0130, 0320, 0003, 0037, 0033, 0015, 0033, 0160, 0103, 0230, 0172, 0234,
- 0076, 0370, 0033, 0374, 0043, 0066, 0345, 0312, 0123, 0064, 0163, 0116, 0125, 0046, 0377, 0072,
- 0047, 0252, 0310, 0034, 0016, 0347, 0351, 0323, 0073, 0366, 0044, 0010, 0142, 0106, 0052, 0242,
- 0013, 0337, 0305, 0206, 0240, 0027, 0336, 0220, 0010, 0052, 0362, 0004, 0245, 0070, 0021, 0315,
- 0370, 0176, 0064, 0266, 0341, 0105, 0157, 0200, 0006, 0375, 0363, 0341, 0257, 0235, 0233, 0056,
- 0342, 0377, 0276, 0276, 0351, 0377, 0322, 0073, 0353, 0236, 0241, 0223, 0257, 0150, 0170, 0321,
- 0105, 0235, 0333, 0341, 0105, 0377, 0006, 0375, 0373, 0337, 0235, 0001, 0177, 0374, 0137, 0377,
- 0205, 0072, 0127, 0147, 0374, 0377, 0277, 0242, 0356, 0157, 0327, 0067, 0335, 0301, 0000, 0365,
- 0157, 0366, 0172, 0137, 0256, 0057, 0173, 0274, 0011, 0357, 0343, 0246, 0163, 0065, 0354, 0165,
- 0007, 0357, 0120, 0357, 0352, 0364, 0362, 0366, 0254, 0167, 0365, 0351, 0035, 0072, 0271, 0035,
- 0242, 0253, 0376, 0020, 0135, 0366, 0276, 0364, 0206, 0374, 0265, 0141, 0377, 0135, 0330, 0365,
- 0264, 0331, 0336, 0153, 0063, 0324, 0077, 0107, 0137, 0272, 0067, 0247, 0027, 0374, 0317, 0316,
- 0111, 0357, 0262, 0067, 0374, 0032, 0176, 0357, 0274, 0067, 0274, 0022, 0337, 0072, 0347, 0043,
- 0351, 0240, 0353, 0316, 0315, 0260, 0167, 0172, 0173, 0331, 0271, 0101, 0327, 0267, 0067, 0327,
- 0375, 0001, 0037, 0345, 0115, 0167, 0357, 0254, 0067, 0070, 0275, 0354, 0364, 0276, 0164, 0071,
- 0004, 0173, 0127, 0374, 0213, 0250, 0373, 0113, 0367, 0152, 0210, 0006, 0027, 0235, 0313, 0313,
- 0371, 0271, 0234, 0164, 0371, 0120, 0072, 0047, 0227, 0335, 0250, 0077, 0076, 0227, 0263, 0336,
- 0115, 0367, 0164, 0370, 0156, 0257, 0167, 0065, 0375, 0227, 0030, 0076, 0137, 0005, 0076, 0212,
- 0313, 0167, 0150, 0160, 0335, 0075, 0355, 0211, 0177, 0164, 0177, 0353, 0362, 0041, 0167, 0156,
- 0276, 0276, 0343, 0263, 0106, 0247, 0375, 0253, 0101, 0367, 0237, 0267, 0374, 0045, 0376, 0020,
- 0235, 0165, 0276, 0164, 0076, 0165, 0007, 0173, 0177, 0311, 0230, 0070, 0137, 0337, 0323, 0333,
- 0233, 0356, 0027, 0061, 0062, 0076, 0333, 0301, 0355, 0311, 0140, 0330, 0033, 0336, 0016, 0273,
- 0350, 0123, 0277, 0177, 0026, 0056, 0347, 0240, 0173, 0363, 0113, 0357, 0264, 0073, 0370, 0011,
- 0135, 0366, 0007, 0341, 0232, 0334, 0016, 0272, 0357, 0370, 0027, 0206, 0235, 0360, 0303, 0274,
- 0013, 0276, 0040, 0374, 0261, 0230, 0313, 0355, 0240, 0027, 0056, 0115, 0357, 0152, 0330, 0275,
- 0271, 0271, 0275, 0036, 0366, 0372, 0127, 0337, 0357, 0135, 0364, 0177, 0345, 0223, 0347, 0143,
- 0354, 0360, 0246, 0147, 0341, 0032, 0366, 0257, 0302, 0251, 0362, 0165, 0350, 0337, 0174, 0025,
- 0235, 0212, 0065, 0010, 0227, 0370, 0035, 0372, 0365, 0242, 0313, 0177, 0277, 0021, 0313, 0026,
- 0046, 0213, 0166, 0304, 0142, 0014, 0206, 0067, 0275, 0323, 0341, 0374, 0153, 0374, 0173, 0303,
- 0376, 0315, 0020, 0275, 0316, 0021, 0135, 0165, 0077, 0135, 0366, 0076, 0165, 0257, 0116, 0273,
- 0342, 0151, 0137, 0364, 0362, 0153, 0157, 0320, 0375, 0236, 0357, 0110, 0217, 0217, 0354, 0023,
- 0137, 0322, 0360, 0263, 0277, 0166, 0370, 0067, 0157, 0303, 0051, 0213, 0235, 0340, 0243, 0212,
- 0376, 0071, 0107, 0175, 0357, 0302, 0375, 0102, 0275, 0163, 0324, 0071, 0373, 0245, 0047, 0206,
- 0035, 0275, 0274, 0307, 0167, 0170, 0320, 0233, 0122, 0103, 0270, 0144, 0247, 0027, 0323, 0345,
- 0336, 0317, 0303, 0333, 0125, 0315, 0064, 0111, 0123, 0055, 0107, 0214, 0345, 0103, 0262, 0315,
- 0124, 0202, 0345, 0126, 0222, 0365, 0126, 0202, 0005, 0047, 0143, 0305, 0145, 0131, 0162, 0051,
- 0116, 0220, 0264, 0206, 0053, 0260, 0213, 0132, 0345, 0330, 0105, 0123, 0165, 0111, 0245, 0263,
- 0222, 0217, 0140, 0157, 0120, 0062, 0135, 0033, 0116, 0210, 0255, 0346, 0204, 0130, 0230, 0106,
- 0070, 0340, 0132, 0005, 0067, 0032, 0274, 0132, 0045, 0143, 0163, 0235, 0210, 0063, 0122, 0114,
- 0225, 0157, 0231, 0212, 0022, 0043, 0137, 0223, 0044, 0145, 0363, 0251, 0341, 0200, 0327, 0232,
- 0017, 0170, 0315, 0116, 0375, 0300, 0021, 0257, 0222, 0216, 0170, 0235, 0004, 0226, 0305, 0331,
- 0151, 0075, 0017, 0171, 0315, 0015, 0016, 0216, 0171, 0255, 0365, 0230, 0327, 0164, 0047, 0066,
- 0355, 0242, 0116, 0270, 0103, 0063, 0367, 0035, 0232, 0151, 0225, 0376, 0224, 0253, 0373, 0051,
- 0127, 0265, 0316, 0123, 0002, 0260, 0264, 0163, 0153, 0122, 0172, 0105, 0251, 0167, 0165, 0212,
- 0213, 0231, 0205, 0237, 0333, 0012, 0154, 0307, 0377, 0330, 0342, 0377, 0366, 0350, 0223, 0377,
- 0361, 0050, 0274, 0221, 0071, 0115, 0267, 0370, 0344, 0021, 0263, 0116, 0052, 0231, 0154, 0221,
- 0364, 0174, 0005, 0322, 0227, 0066, 0112, 0306, 0043, 0236, 0313, 0215, 0276, 0264, 0036, 0341,
- 0326, 0150, 0362, 0032, 0247, 0144, 0130, 0352, 0334, 0023, 0066, 0344, 0074, 0213, 0375, 0304,
- 0165, 0215, 0350, 0327, 0072, 0227, 0135, 0321, 0136, 0152, 0152, 0346, 0216, 0044, 0245, 0251,
- 0177, 0031, 0141, 0234, 0105, 0270, 0264, 0147, 0160, 0151, 0277, 0201, 0213, 0022, 0154, 0152,
- 0031, 0362, 0231, 0222, 0135, 0372, 0101, 0332, 0062, 0351, 0266, 0130, 0340, 0147, 0153, 0042,
- 0074, 0375, 0300, 0061, 0260, 0237, 0247, 0117, 0305, 0374, 0221, 0352, 0034, 0213, 0311, 0065,
- 0023, 0313, 0161, 0305, 0145, 0045, 0126, 0304, 0056, 0070, 0276, 0143, 0032, 0377, 0260, 0156,
- 0214, 0063, 0017, 0341, 0044, 0370, 0316, 0250, 0253, 0322, 0101, 0112, 0266, 0104, 0206, 0073,
- 0121, 0035, 0002, 0163, 0325, 0254, 0347, 0130, 0171, 0104, 0111, 0031, 0265, 0254, 0253, 0106,
- 0110, 0336, 0056, 0306, 0112, 0045, 0243, 0143, 0147, 0121, 0270, 0007, 0133, 0177, 0326, 0054,
- 0354, 0334, 0213, 0334, 0201, 0126, 0056, 0232, 0121, 0050, 0377, 0034, 0353, 0172, 0220, 0051,
- 0001, 0115, 0377, 0310, 0025, 0207, 0120, 0057, 0347, 0274, 0011, 0300, 0154, 0325, 0013, 0230,
- 0133, 0046, 0233, 0256, 0075, 0154, 0223, 0300, 0006, 0341, 0124, 0045, 0006, 0132, 0073, 0041,
- 0234, 0246, 0244, 0004, 0322, 0151, 0313, 0245, 0323, 0237, 0377, 0374, 0347, 0255, 0221, 0116,
- 0255, 0132, 0113, 0047, 0345, 0050, 0364, 0233, 0170, 0234, 0225, 0050, 0253, 0266, 0062, 0231,
- 0137, 0060, 0241, 0355, 0050, 0047, 0137, 0131, 0222, 0201, 0274, 0152, 0226, 0123, 0034, 0125,
- 0221, 0155, 0275, 0354, 0326, 0032, 0020, 0353, 0021, 0173, 0262, 0216, 0055, 0360, 0117, 0201,
- 0177, 0012, 0374, 0123, 0340, 0237, 0002, 0377, 0024, 0230, 0301, 0140, 0006, 0203, 0031, 0134,
- 0235, 0031, 0034, 0351, 0045, 0340, 0245, 0005, 0057, 0055, 0170, 0151, 0153, 0011, 0115, 0360,
- 0121, 0201, 0217, 0012, 0174, 0124, 0340, 0243, 0132, 0233, 0217, 0052, 0142, 0103, 0340, 0245,
- 0132, 0201, 0227, 0252, 0265, 0156, 0057, 0325, 0265, 0250, 0053, 0344, 0004, 0066, 0370, 0251,
- 0300, 0117, 0005, 0176, 0052, 0360, 0123, 0201, 0237, 0012, 0374, 0124, 0340, 0247, 0002, 0077,
- 0325, 0372, 0215, 0341, 0231, 0146, 0002, 0236, 0052, 0360, 0124, 0201, 0247, 0252, 0246, 0340,
- 0004, 0137, 0025, 0370, 0252, 0300, 0127, 0005, 0276, 0252, 0212, 0255, 0131, 0331, 0103, 0166,
- 0071, 0224, 0325, 0051, 0043, 0003, 0157, 0327, 0012, 0274, 0135, 0355, 0265, 0173, 0273, 0164,
- 0313, 0322, 0115, 0002, 0356, 0056, 0160, 0167, 0201, 0273, 0013, 0334, 0135, 0340, 0356, 0002,
- 0167, 0027, 0270, 0273, 0300, 0335, 0125, 0013, 0213, 0172, 0246, 0232, 0200, 0277, 0013, 0374,
- 0135, 0340, 0357, 0252, 0053, 0072, 0301, 0341, 0005, 0016, 0057, 0160, 0170, 0201, 0303, 0153,
- 0155, 0311, 0131, 0057, 0234, 0010, 0074, 0126, 0053, 0360, 0130, 0035, 0126, 0352, 0261, 0132,
- 0164, 0317, 0034, 0316, 0334, 0063, 0255, 0030, 0367, 0214, 0264, 0153, 0246, 0026, 0025, 0263,
- 0062, 0253, 0335, 0045, 0065, 0344, 0363, 0127, 0363, 0301, 0224, 0341, 0307, 0121, 0271, 0076,
- 0345, 0224, 0332, 0043, 0312, 0005, 0377, 0060, 0024, 0034, 0163, 0032, 0302, 0354, 0301, 0046,
- 0160, 0027, 0065, 0065, 0340, 0155, 0353, 0260, 0026, 0047, 0226, 0320, 0372, 0342, 0033, 0152,
- 0202, 0154, 0263, 0333, 0022, 0206, 0355, 0144, 0306, 0045, 0236, 0046, 0037, 0257, 0026, 0117,
- 0225, 0233, 0316, 0262, 0136, 0163, 0065, 0176, 0015, 0043, 0344, 0153, 0376, 0312, 0324, 0223,
- 0333, 0107, 0317, 0052, 0276, 0015, 0114, 0115, 0257, 0057, 0140, 0161, 0127, 0175, 0361, 0337,
- 0264, 0376, 0364, 0074, 0104, 0373, 0237, 0117, 0206, 0127, 0053, 0306, 0147, 0336, 0346, 0122,
- 0165, 0246, 0223, 0361, 0355, 0027, 0353, 0100, 0255, 0334, 0165, 0062, 0065, 0120, 0213, 0021,
- 0067, 0131, 0311, 0346, 0074, 0323, 0046, 0014, 0235, 0216, 0165, 0347, 0076, 0333, 0213, 0134,
- 0056, 0027, 0123, 0063, 0144, 0166, 0335, 0315, 0377, 0171, 0173, 0175, 0223, 0351, 0236, 0203,
- 0245, 0242, 0324, 0264, 0110, 0165, 0363, 0212, 0371, 0165, 0173, 0163, 0370, 0165, 0162, 0225,
- 0371, 0015, 0260, 0012, 0336, 0357, 0330, 0305, 0043, 0115, 0270, 0170, 0144, 0065, 0027, 0217,
- 0304, 0211, 0215, 0265, 0126, 0267, 0116, 0026, 0011, 0123, 0235, 0052, 0261, 0243, 0144, 0266,
- 0134, 0230, 0377, 0047, 0361, 0174, 0270, 0275, 0244, 0024, 0165, 0256, 0304, 0333, 0113, 0346,
- 0256, 0263, 0200, 0373, 0113, 0062, 0130, 0142, 0372, 0325, 0024, 0035, 0123, 0004, 0213, 0305,
- 0325, 0214, 0221, 0111, 0163, 0252, 0373, 0343, 0271, 0337, 0342, 0057, 0150, 0010, 0134, 0127,
- 0254, 0142, 0253, 0071, 0367, 0177, 0231, 0227, 0072, 0060, 0354, 0152, 0304, 0061, 0074, 0034,
- 0165, 0334, 0312, 0156, 0042, 0256, 0200, 0130, 0154, 0262, 0330, 0102, 0366, 0146, 0026, 0061,
- 0247, 0172, 0136, 0313, 0062, 0033, 0031, 0334, 0311, 0262, 0326, 0073, 0131, 0304, 0066, 0300,
- 0205, 0054, 0273, 0166, 0041, 0113, 0174, 0220, 0120, 0375, 0076, 0215, 0265, 0336, 0260, 0122,
- 0305, 0145, 0051, 0255, 0115, 0275, 0054, 0045, 0075, 0056, 0220, 0147, 0237, 0142, 0375, 0103,
- 0171, 0256, 0075, 0121, 0012, 0100, 0254, 0352, 0316, 0224, 0201, 0113, 0234, 0171, 0177, 0246,
- 0340, 0203, 0341, 0157, 0261, 0356, 0314, 0052, 0042, 0100, 0252, 0115, 0063, 0135, 0177, 0342,
- 0136, 0150, 0161, 0015, 0375, 0035, 0345, 0012, 0042, 0062, 0370, 0204, 0042, 0335, 0177, 0137,
- 0345, 0053, 0362, 0036, 0300, 0374, 0336, 0277, 0064, 0022, 0156, 0035, 0345, 0150, 0071, 0243,
- 0143, 0325, 0306, 0163, 0131, 0023, 0077, 0250, 0264, 0174, 0042, 0046, 0227, 0075, 0306, 0130,
- 0367, 0174, 0325, 0246, 0211, 0273, 0327, 0334, 0157, 0052, 0071, 0117, 0044, 0063, 0066, 0362,
- 0146, 0152, 0374, 0131, 0245, 0323, 0067, 0051, 0032, 0046, 0271, 0047, 0314, 0127, 0357, 0100,
- 0010, 0130, 0021, 0160, 0032, 0176, 0376, 0326, 0273, 0272, 0276, 0035, 0176, 0273, 0350, 0135,
- 0015, 0277, 0135, 0365, 0277, 0165, 0277, 0364, 0377, 0273, 0207, 0376, 0007, 0055, 0075, 0271,
- 0352, 0252, 0174, 0105, 0237, 0123, 0356, 0027, 0225, 0175, 0045, 0010, 0133, 0304, 0036, 0151,
- 0236, 0320, 0322, 0102, 0063, 0100, 0245, 0155, 0264, 0062, 0031, 0136, 0305, 0245, 0033, 0202,
- 0003, 0033, 0173, 0304, 0310, 0342, 0030, 0133, 0125, 0045, 0170, 0055, 0236, 0074, 0245, 0046,
- 0045, 0270, 0362, 0044, 0024, 0223, 0303, 0315, 0125, 0114, 0252, 0222, 0334, 0157, 0245, 0166,
- 0122, 0010, 0262, 0016, 0062, 0133, 0051, 0354, 0130, 0050, 0344, 0130, 0074, 0334, 0130, 0141,
- 0250, 0161, 0055, 0112, 0206, 0102, 0140, 0173, 0013, 0162, 0330, 0262, 0303, 0211, 0033, 0235,
- 0274, 0126, 0111, 0330, 0260, 0144, 0211, 0331, 0252, 0147, 0135, 0175, 0125, 0347, 0155, 0011,
- 0275, 0154, 0222, 0364, 0156, 0101, 0040, 0016, 0002, 0161, 0157, 0045, 0033, 0127, 0053, 0040,
- 0012, 0007, 0121, 0270, 0344, 0050, 0334, 0054, 0172, 0001, 0041, 0270, 0102, 0221, 0210, 0327,
- 0100, 0325, 0005, 0361, 0371, 0120, 0047, 0365, 0214, 0125, 0315, 0015, 0056, 0014, 0007, 0055,
- 0032, 0034, 0020, 0261, 0132, 0151, 0304, 0152, 0272, 0031, 0245, 0006, 0255, 0246, 0354, 0103,
- 0013, 0035, 0173, 0215, 0343, 0277, 0265, 0217, 0144, 0133, 0214, 0061, 0271, 0037, 0163, 0276,
- 0363, 0041, 0073, 0246, 0053, 0027, 0177, 0312, 0040, 0314, 0201, 0341, 0121, 0313, 0302, 0146,
- 0314, 0212, 0274, 0171, 0124, 0015, 0201, 0312, 0066, 0131, 0050, 0267, 0101, 0034, 0251, 0100,
- 0020, 0147, 0216, 0226, 0076, 0321, 0374, 0160, 0036, 0141, 0315, 0211, 0144, 0070, 0110, 0210,
- 0273, 0137, 0010, 0176, 0022, 0376, 0360, 0265, 0352, 0034, 0062, 0247, 0124, 0136, 0242, 0117,
- 0207, 0273, 0175, 0112, 0105, 0256, 0324, 0210, 0164, 0155, 0226, 0303, 0264, 0145, 0125, 0132,
- 0332, 0332, 0371, 0001, 0126, 0133, 0132, 0145, 0201, 0311, 0010, 0366, 0065, 0230, 0330, 0043,
- 0152, 0155, 0100, 0102, 0366, 0116, 0237, 0002, 0315, 0334, 0356, 0364, 0204, 0141, 0350, 0035,
- 0172, 0337, 0250, 0336, 0341, 0304, 0126, 0226, 0266, 0130, 0377, 0163, 0132, 0122, 0011, 0046,
- 0211, 0003, 0057, 0322, 0330, 0046, 0102, 0163, 0160, 0030, 0166, 0136, 0225, 0172, 0365, 0252,
- 0210, 0342, 0117, 0375, 0236, 0333, 0103, 0232, 0243, 0263, 0300, 0323, 0255, 0227, 0276, 0252,
- 0020, 0317, 0103, 0017, 0143, 0241, 0345, 0056, 0110, 0350, 0227, 0037, 0067, 0253, 0216, 0206,
- 0207, 0251, 0307, 0141, 0257, 0027, 0032, 0307, 0130, 0330, 0020, 0232, 0317, 0255, 0125, 0043,
- 0362, 0356, 0346, 0355, 0010, 0073, 0142, 0040, 0332, 0075, 0327, 0007, 0065, 0141, 0035, 0363,
- 0211, 0215, 0050, 0033, 0027, 0350, 0212, 0361, 0155, 0231, 0165, 0225, 0167, 0124, 0063, 0143,
- 0133, 0270, 0313, 0174, 0316, 0065, 0170, 0267, 0123, 0257, 0231, 0164, 0217, 0221, 0327, 0226,
- 0210, 0350, 0031, 0267, 0337, 0265, 0360, 0117, 0156, 0255, 0275, 0256, 0130, 0332, 0051, 0263,
- 0130, 0002, 0034, 0274, 0264, 0115, 0075, 0123, 0226, 0116, 0332, 0171, 0217, 0223, 0325, 0221,
- 0347, 0267, 0126, 0312, 0363, 0023, 0154, 0236, 0355, 0253, 0107, 0251, 0134, 0307, 0140, 0235,
- 0206, 0323, 0134, 0271, 0243, 0231, 0341, 0024, 0332, 0114, 0033, 0132, 0344, 0050, 0063, 0027,
- 0240, 0203, 0174, 0141, 0030, 0042, 0077, 0234, 0345, 0376, 0066, 0024, 0122, 0072, 0254, 0155,
- 0041, 0245, 0210, 0224, 0240, 0226, 0122, 0115, 0013, 0021, 0316, 0047, 0050, 0115, 0301, 0177,
- 0216, 0231, 0061, 0076, 0343, 0233, 0230, 0134, 0055, 0241, 0256, 0320, 0127, 0256, 0234, 0120,
- 0070, 0225, 0251, 0274, 0224, 0246, 0334, 0354, 0354, 0214, 0076, 0071, 0026, 0325, 0115, 0144,
- 0362, 0237, 0321, 0235, 0107, 0155, 0364, 0125, 0037, 0123, 0372, 0047, 0164, 0116, 0034, 0335,
- 0061, 0326, 0134, 0051, 0016, 0073, 0146, 0076, 0356, 0046, 0351, 0234, 0055, 0172, 0154, 0100,
- 0036, 0075, 0262, 0156, 0307, 0127, 0000, 0061, 0047, 0313, 0357, 0130, 0012, 0222, 0312, 0361,
- 0077, 0252, 0306, 0356, 0076, 0141, 0206, 0304, 0054, 0363, 0366, 0234, 0243, 0372, 0255, 0144,
- 0152, 0130, 0351, 0051, 0142, 0051, 0135, 0372, 0154, 0302, 0267, 0152, 0326, 0235, 0103, 0075,
- 0133, 0267, 0162, 0164, 0363, 0024, 0131, 0336, 0205, 0373, 0171, 0324, 0075, 0242, 0073, 0252,
- 0035, 0311, 0124, 0321, 0220, 0021, 0256, 0231, 0266, 0123, 0134, 0200, 0326, 0054, 0243, 0242,
- 0006, 0070, 0320, 0301, 0325, 0012, 0216, 0134, 0271, 0072, 0060, 0352, 0106, 0175, 0374, 0044,
- 0245, 0222, 0051, 0167, 0040, 0021, 0061, 0112, 0050, 0214, 0023, 0221, 0221, 0102, 0040, 0316,
- 0210, 0046, 0112, 0312, 0245, 0134, 0204, 0140, 0224, 0334, 0237, 0350, 0004, 0135, 0173, 0364,
- 0221, 0230, 0330, 0104, 0243, 0211, 0204, 0242, 0127, 0070, 0153, 0022, 0322, 0364, 0126, 0224,
- 0246, 0067, 0227, 0270, 0005, 0371, 0166, 0213, 0371, 0166, 0224, 0361, 0141, 0372, 0065, 0315,
- 0267, 0173, 0035, 0034, 0224, 0207, 0130, 0157, 0262, 0135, 0264, 0023, 0353, 0255, 0020, 0061,
- 0063, 0173, 0303, 0342, 0005, 0131, 0057, 0247, 0106, 0020, 0213, 0327, 0236, 0130, 0310, 0023,
- 0324, 0132, 0252, 0151, 0202, 0062, 0055, 0352, 0136, 0336, 0042, 0041, 0342, 0360, 0176, 0056,
- 0342, 0220, 0031, 0145, 0330, 0376, 0032, 0030, 0321, 0151, 0366, 0074, 0125, 0063, 0344, 0032,
- 0055, 0044, 0314, 0265, 0244, 0052, 0155, 0274, 0275, 0321, 0113, 0251, 0225, 0124, 0310, 0044,
- 0363, 0074, 0353, 0373, 0070, 0152, 0221, 0216, 0113, 0255, 0365, 0270, 0310, 0342, 0202, 0067,
- 0025, 0217, 0301, 0146, 0347, 0066, 0312, 0236, 0177, 0355, 0370, 0056, 0377, 0101, 0366, 0266,
- 0275, 0265, 0144, 0201, 0226, 0165, 0115, 0037, 0015, 0330, 0316, 0035, 0361, 0344, 0322, 0313,
- 0314, 0223, 0171, 0062, 0011, 0333, 0035, 0225, 0167, 0242, 0364, 0224, 0171, 0226, 0152, 0157,
- 0112, 0376, 0307, 0215, 0275, 0301, 0240, 0271, 0332, 0073, 0067, 0001, 0360, 0000, 0170, 0000,
- 0374, 0072, 0001, 0337, 0002, 0300, 0003, 0340, 0001, 0360, 0273, 0003, 0370, 0025, 0337, 0252,
- 0235, 0104, 0272, 0265, 0200, 0372, 0163, 0066, 0331, 0311, 0223, 0334, 0137, 0125, 0272, 0221,
- 0246, 0265, 0335, 0050, 0344, 0001, 0162, 0002, 0344, 0304, 0132, 0344, 0304, 0371, 0126, 0013,
- 0211, 0066, 0240, 0035, 0320, 0016, 0150, 0177, 0101, 0373, 0015, 0240, 0275, 0006, 0066, 0140,
- 0255, 0125, 0302, 0161, 0132, 0100, 0056, 0247, 0214, 0041, 0326, 0352, 0152, 0233, 0036, 0156,
- 0010, 0313, 0337, 0065, 0042, 0230, 0246, 0153, 0324, 0237, 0016, 0200, 0031, 0124, 0112, 0007,
- 0377, 0014, 0010, 0253, 0077, 0021, 0200, 0223, 0240, 0122, 0042, 0310, 0316, 0205, 0257, 0013,
- 0041, 0034, 0202, 0041, 0000, 0206, 0300, 0366, 0031, 0002, 0147, 0140, 0010, 0000, 0332, 0001,
- 0355, 0020, 0014, 0332, 0361, 0140, 0020, 0000, 0036, 0000, 0277, 0205, 0200, 0377, 0047, 0210,
- 0167, 0260, 0352, 0040, 0364, 0133, 0122, 0350, 0027, 0074, 0102, 0100, 0066, 0300, 0155, 0200,
- 0154, 0126, 0103, 0066, 0207, 0353, 0275, 0143, 0115, 0116, 0257, 0316, 0301, 0056, 0163, 0336,
- 0231, 0126, 0377, 0273, 0106, 0244, 0374, 0243, 0052, 0276, 0121, 0007, 0173, 0272, 0125, 0306,
- 0035, 0045, 0157, 0252, 0144, 0214, 0250, 0145, 0346, 0277, 0226, 0144, 0165, 0004, 0124, 0345,
- 0245, 0173, 0057, 0207, 0224, 0176, 0200, 0103, 0112, 0160, 0110, 0011, 0214, 0130, 0360, 0132,
- 0301, 0041, 0045, 0000, 0074, 0000, 0036, 0000, 0017, 0207, 0224, 0000, 0360, 0000, 0170, 0000,
- 0374, 0056, 0036, 0122, 0002, 0300, 0003, 0340, 0001, 0360, 0020, 0210, 0006, 0300, 0003, 0340,
- 0001, 0360, 0053, 0001, 0374, 0173, 0000, 0074, 0000, 0036, 0000, 0277, 0073, 0200, 0077, 0002,
- 0300, 0003, 0340, 0267, 0017, 0360, 0135, 0110, 0065, 0003, 0027, 0075, 0240, 0175, 0107, 0320,
- 0076, 0000, 0264, 0203, 0177, 0036, 0320, 0276, 0043, 0150, 0077, 0001, 0264, 0203, 0163, 0036,
- 0320, 0276, 0053, 0246, 0073, 0240, 0035, 0074, 0363, 0200, 0366, 0035, 0101, 0173, 0017, 0320,
- 0016, 0156, 0171, 0100, 0373, 0216, 0240, 0375, 0032, 0320, 0136, 0003, 0237, 0374, 0256, 0225,
- 0371, 0351, 0232, 0204, 0155, 0302, 0131, 0055, 0250, 0031, 0127, 0117, 0372, 0031, 0140, 0043,
- 0360, 0010, 0043, 0330, 0337, 0152, 0052, 0202, 0363, 0305, 0225, 0122, 0321, 0111, 0140, 0131,
- 0204, 0072, 0133, 0115, 0102, 0160, 0326, 0270, 0122, 0022, 0072, 0325, 0375, 0361, 0126, 0323,
- 0317, 0041, 0320, 0117, 0225, 0364, 0323, 0271, 0356, 0155, 0065, 0371, 0274, 0007, 0362, 0251,
- 0222, 0174, 0256, 0075, 0174, 0207, 0075, 0354, 0030, 0133, 0256, 0010, 0201, 0071, 0006, 0025,
- 0063, 0300, 0012, 0003, 0262, 0131, 0015, 0331, 0200, 0331, 0005, 0144, 0003, 0246, 0026, 0220,
- 0315, 0152, 0310, 0006, 0054, 0054, 0040, 0033, 0260, 0254, 0200, 0154, 0126, 0103, 0066, 0107,
- 0065, 0052, 0042, 0327, 0132, 0177, 0021, 0271, 0204, 0032, 0140, 0207, 0120, 0003, 0154, 0002,
- 0036, 0030, 0251, 0333, 0213, 0260, 0345, 0102, 0044, 0023, 0362, 0136, 0040, 0357, 0145, 0263,
- 0362, 0136, 0056, 0040, 0357, 0005, 0320, 0016, 0150, 0337, 0021, 0264, 0177, 0006, 0264, 0303,
- 0351, 0064, 0100, 0373, 0216, 0240, 0275, 0003, 0150, 0207, 0323, 0151, 0200, 0366, 0035, 0101,
- 0073, 0024, 0226, 0001, 0145, 0036, 0000, 0017, 0200, 0007, 0300, 0203, 0076, 0017, 0200, 0007,
- 0300, 0103, 0065, 0150, 0110, 0257, 0055, 0053, 0270, 0103, 0331, 0003, 0236, 0300, 0031, 0043,
- 0040, 0241, 0374, 0276, 0210, 0121, 0226, 0350, 0200, 0023, 0106, 0220, 0210, 0002, 0271, 0331,
- 0100, 0066, 0100, 0066, 0040, 0256, 0200, 0154, 0352, 0234, 0233, 0135, 0122, 0332, 0133, 0033,
- 0356, 0116, 0135, 0371, 0335, 0251, 0027, 0304, 0147, 0324, 0233, 0240, 0137, 0211, 0303, 0215,
- 0372, 0035, 0276, 0102, 0265, 0275, 0212, 0364, 0311, 0066, 0244, 0117, 0102, 0372, 0244, 0344,
- 0235, 0306, 0014, 0235, 0361, 0137, 0040, 0205, 0022, 0114, 0354, 0334, 0356, 0101, 0213, 0252,
- 0215, 0001, 0174, 0064, 0340, 0327, 0007, 0277, 0376, 0372, 0375, 0372, 0147, 0220, 0247, 0003,
- 0141, 0173, 0100, 0373, 0256, 0104, 0361, 0000, 0355, 0040, 0333, 0001, 0355, 0020, 0263, 0207,
- 0254, 0074, 0000, 0074, 0000, 0036, 0000, 0017, 0131, 0171, 0020, 0262, 0202, 0220, 0025, 0170,
- 0015, 0201, 0154, 0152, 0027, 0040, 0137, 0147, 0204, 0352, 0020, 0042, 0235, 0105, 0042, 0235,
- 0163, 0045, 0101, 0267, 0052, 0332, 0331, 0252, 0155, 0264, 0363, 0075, 0104, 0073, 0041, 0332,
- 0051, 0167, 0155, 0301, 0230, 0076, 0241, 0123, 0213, 0032, 0017, 0076, 0004, 0074, 0041, 0340,
- 0131, 0210, 0214, 0172, 0216, 0111, 0014, 0270, 0377, 0002, 0350, 0250, 0130, 0362, 0305, 0140,
- 0142, 0163, 0141, 0356, 0103, 0206, 0072, 0220, 0021, 0344, 0137, 0300, 0115, 0237, 0340, 0262,
- 0335, 0041, 0227, 0355, 0277, 0040, 0042, 0013, 0001, 0032, 0100, 0373, 0216, 0240, 0375, 0067,
- 0100, 0073, 0344, 0137, 0000, 0332, 0167, 0004, 0355, 0003, 0100, 0073, 0324, 0100, 0003, 0264,
- 0103, 0156, 0345, 0056, 0243, 0035, 0354, 0166, 0100, 0073, 0244, 0132, 0101, 0156, 0045, 0000,
- 0036, 0000, 0017, 0200, 0207, 0334, 0112, 0000, 0074, 0000, 0036, 0000, 0277, 0321, 0200, 0007,
- 0003, 0036, 0000, 0017, 0200, 0337, 0041, 0300, 0303, 0365, 0250, 0220, 0006, 0017, 0051, 0210,
- 0100, 0066, 0033, 0164, 0172, 0002, 0310, 0006, 0312, 0013, 0002, 0331, 0000, 0331, 0254, 0106,
- 0267, 0131, 0347, 0371, 0032, 0070, 0253, 0125, 0350, 0254, 0126, 0237, 0215, 0261, 0067, 0075,
- 0245, 0345, 0157, 0307, 0061, 0255, 0166, 0155, 0217, 0151, 0301, 0235, 0336, 0160, 0114, 0113,
- 0016, 0226, 0347, 0304, 0302, 0160, 0076, 0013, 0016, 0104, 0344, 0245, 0237, 0376, 0147, 0070,
- 0225, 0005, 0324, 0003, 0307, 0151, 0300, 0207, 0017, 0076, 0174, 0110, 0302, 0203, 0224, 0133,
- 0100, 0073, 0240, 0175, 0353, 0320, 0336, 0007, 0264, 0103, 0102, 0016, 0240, 0175, 0107, 0320,
- 0176, 0016, 0150, 0207, 0174, 0133, 0100, 0073, 0144, 0343, 0100, 0202, 0075, 0000, 0036, 0000,
- 0017, 0200, 0207, 0004, 0173, 0000, 0074, 0000, 0036, 0000, 0017, 0011, 0366, 0220, 0312, 0004,
- 0251, 0114, 0020, 0122, 0006, 0262, 0201, 0130, 0062, 0220, 0015, 0134, 0347, 0275, 0226, 0304,
- 0111, 0327, 0322, 0015, 0074, 0246, 0226, 0211, 0275, 0203, 0012, 0132, 0056, 0056, 0324, 0302,
- 0303, 0250, 0113, 0044, 0064, 0132, 0076, 0101, 0302, 0054, 0074, 0322, 0275, 0027, 0200, 0055,
- 0003, 0360, 0002, 0353, 0374, 0123, 0047, 0163, 0357, 0344, 0000, 0137, 0036, 0320, 0055, 0253,
- 0342, 0134, 0021, 0067, 0104, 0252, 0205, 0066, 0012, 0030, 0243, 0116, 0312, 0347, 0226, 0346,
- 0330, 0330, 0260, 0264, 0325, 0224, 0173, 0321, 0051, 0173, 0300, 0223, 0122, 0162, 0117, 0357,
- 0250, 0303, 0064, 0023, 0373, 0306, 0113, 0372, 0151, 0377, 0171, 0162, 0217, 0035, 0155, 0300,
- 0277, 0212, 0132, 0315, 0374, 0211, 0250, 0271, 0162, 0207, 0277, 0140, 0047, 0070, 0231, 0356,
- 0154, 0245, 0073, 0241, 0322, 0054, 0154, 0242, 0121, 0207, 0123, 0036, 0061, 0036, 0124, 0323,
- 0101, 0261, 0201, 0311, 0043, 0366, 0371, 0042, 0337, 0351, 0201, 0305, 0324, 0076, 0355, 0141,
- 0213, 0340, 0273, 0306, 0261, 0103, 0035, 0351, 0066, 0056, 0165, 0003, 0367, 0205, 0110, 0304,
- 0212, 0312, 0266, 0014, 0070, 0256, 0170, 0153, 0372, 0210, 0275, 0254, 0131, 0306, 0213, 0356,
- 0170, 0306, 0224, 0254, 0000, 0350, 0206, 0201, 0055, 0354, 0351, 0214, 0172, 0210, 0017, 0226,
- 0057, 0165, 0003, 0371, 0334, 0102, 0327, 0055, 0276, 0131, 0142, 0261, 0261, 0331, 0100, 0066,
- 0065, 0311, 0035, 0301, 0236, 0240, 0220, 0263, 0317, 0337, 0116, 0373, 0127, 0303, 0233, 0376,
- 0345, 0267, 0057, 0235, 0301, 0347, 0105, 0352, 0314, 0244, 0301, 0104, 0226, 0070, 0377, 0040,
- 0236, 0050, 0033, 0210, 0230, 0037, 0033, 0137, 0164, 0342, 0164, 0115, 0302, 0302, 0137, 0246,
- 0275, 0250, 0020, 0246, 0052, 0153, 0130, 0134, 0346, 0370, 0221, 0365, 0030, 0266, 0227, 0107,
- 0067, 0300, 0106, 0340, 0021, 0066, 0131, 0067, 0307, 0116, 0146, 0142, 0337, 0246, 0103, 0044,
- 0361, 0345, 0360, 0343, 0150, 0063, 0160, 0070, 0141, 0131, 0304, 0111, 0033, 0363, 0022, 0111,
- 0371, 0257, 0044, 0245, 0033, 0214, 0074, 0352, 0014, 0113, 0322, 0124, 0246, 0004, 0315, 0263,
- 0061, 0047, 0201, 0145, 0221, 0005, 0366, 0126, 0267, 0175, 0231, 0216, 0260, 0322, 0115, 0031,
- 0325, 0153, 0123, 0116, 0165, 0177, 0134, 0343, 0035, 0021, 0303, 0253, 0164, 0073, 0214, 0165,
- 0154, 0307, 0000, 0273, 0172, 0070, 0206, 0227, 0175, 0131, 0351, 0016, 0124, 0102, 0110, 0235,
- 0353, 0136, 0175, 0351, 0250, 0163, 0375, 0255, 0127, 0051, 0031, 0221, 0172, 0241, 0132, 0134,
- 0252, 0125, 0143, 0124, 0317, 0335, 0371, 0125, 0351, 0256, 0270, 0345, 0357, 0212, 0212, 0276,
- 0044, 0316, 0345, 0324, 0127, 0137, 0232, 0215, 0356, 0202, 0370, 0174, 0301, 0152, 0254, 0056,
- 0205, 0003, 0374, 0346, 0115, 0052, 0045, 0025, 0017, 0344, 0100, 0061, 0326, 0063, 0043, 0247,
- 0177, 0006, 0204, 0325, 0230, 0365, 0210, 0341, 0125, 0112, 0110, 0277, 0257, 0227, 0347, 0134,
- 0140, 0313, 0255, 0057, 0317, 0231, 0215, 0156, 0152, 0241, 0327, 0230, 0347, 0120, 0366, 0055,
- 0311, 0321, 0124, 0032, 0251, 0074, 0324, 0103, 0151, 0230, 0155, 0112, 0147, 0104, 0203, 0072,
- 0103, 0067, 0034, 0137, 0245, 0033, 0242, 0257, 0032, 0273, 0035, 0327, 0265, 0210, 0241, 0063,
- 0156, 0164, 0106, 0247, 0352, 0137, 0167, 0145, 0372, 0167, 0271, 0060, 0226, 0171, 0175, 0352,
- 0255, 0323, 0236, 0210, 0311, 0270, 0151, 0370, 0343, 0207, 0043, 0331, 0026, 0343, 0350, 0064,
- 0377, 0361, 0217, 0355, 0314, 0046, 0304, 0020, 0216, 0200, 0001, 0023, 0127, 0113, 0152, 0342,
- 0217, 0175, 0327, 0271, 0317, 0152, 0024, 0372, 0300, 0155, 0116, 0251, 0241, 0317, 0076, 0027,
- 0113, 0032, 0030, 0036, 0265, 0054, 0154, 0056, 0254, 0156, 0331, 0304, 0056, 0333, 0144, 0041,
- 0275, 0206, 0070, 0311, 0276, 0374, 0164, 0317, 0361, 0057, 0004, 0077, 0271, 0324, 0143, 0153,
- 0365, 0340, 0307, 0173, 0105, 0027, 0113, 0033, 0264, 0222, 0112, 0033, 0110, 0227, 0067, 0130,
- 0137, 0354, 0123, 0041, 0273, 0351, 0204, 0076, 0157, 0102, 0156, 0023, 0365, 0010, 0166, 0130,
- 0310, 0173, 0032, 0307, 0217, 0374, 0001, 0147, 0104, 0331, 0071, 0106, 0211, 0353, 0020, 0277,
- 0026, 0067, 0370, 0021, 0353, 0234, 0307, 0276, 0362, 0265, 0360, 0072, 0331, 0227, 0237, 0223,
- 0172, 0052, 0270, 0126, 0145, 0254, 0127, 0154, 0110, 0124, 0210, 0045, 0042, 0226, 0154, 0212,
- 0132, 0337, 0042, 0046, 0027, 0066, 0156, 0301, 0316, 0314, 0300, 0233, 0156, 0304, 0141, 0263,
- 0231, 0247, 0057, 0057, 0134, 0120, 0055, 0334, 0035, 0205, 0045, 0112, 0335, 0315, 0030, 0004,
- 0037, 0316, 0020, 0334, 0212, 0101, 0260, 0004, 0232, 0027, 0251, 0040, 0001, 0340, 0245, 0122,
- 0101, 0131, 0224, 0020, 0073, 0230, 0151, 0116, 0245, 0114, 0176, 0135, 0312, 0221, 0174, 0374,
- 0354, 0352, 0216, 0251, 0070, 0245, 0314, 0235, 0313, 0223, 0257, 0132, 0311, 0352, 0227, 0271,
- 0003, 0205, 0112, 0032, 0124, 0262, 0021, 0005, 0063, 0156, 0225, 0062, 0160, 0323, 0102, 0241,
- 0371, 0211, 0104, 0125, 0210, 0125, 0106, 0044, 0145, 0023, 0112, 0151, 0102, 0057, 0377, 0272,
- 0246, 0345, 0133, 0204, 0274, 0360, 0012, 0077, 0175, 0245, 0336, 0303, 0220, 0330, 0070, 0055,
- 0051, 0272, 0362, 0165, 0257, 0142, 0355, 0323, 0300, 0252, 0306, 0062, 0323, 0172, 0264, 0165,
- 0357, 0236, 0070, 0132, 0210, 0376, 0214, 0032, 0037, 0212, 0135, 0142, 0301, 0013, 0112, 0351,
- 0060, 0331, 0250, 0345, 0373, 0217, 0004, 0001, 0040, 0101, 0001, 0352, 0237, 0112, 0316, 0332,
- 0116, 0032, 0130, 0122, 0336, 0233, 0354, 0124, 0146, 0074, 0262, 0064, 0212, 0270, 0043, 0226,
- 0125, 0036, 0315, 0272, 0064, 0322, 0250, 0024, 0331, 0156, 0152, 0052, 0136, 0362, 0353, 0012,
- 0174, 0240, 0114, 0236, 0361, 0025, 0330, 0105, 0005, 0120, 0154, 0066, 0377, 0336, 0154, 0226,
- 0361, 0011, 0245, 0163, 0027, 0200, 0152, 0045, 0124, 0267, 0352, 0204, 0152, 0371, 0175, 0222,
- 0354, 0124, 0266, 0103, 0371, 0015, 0317, 0177, 0346, 0246, 0244, 0303, 0024, 0071, 0167, 0103,
- 0152, 0301, 0300, 0010, 0132, 0142, 0224, 0134, 0147, 0001, 0023, 0010, 0114, 0240, 0115, 0062,
- 0201, 0276, 0350, 0336, 0003, 0146, 0141, 0025, 0101, 0320, 0151, 0166, 0320, 0004, 0212, 0366,
- 0037, 0205, 0004, 0340, 0243, 0236, 0003, 0372, 0022, 0130, 0101, 0022, 0154, 0043, 0264, 0201,
- 0270, 0066, 0003, 0074, 0243, 0012, 0073, 0010, 0114, 0041, 0060, 0205, 0166, 0311, 0024, 0152,
- 0357, 0206, 0051, 0224, 0174, 0112, 0051, 0307, 0127, 0263, 0267, 0050, 0243, 0223, 0254, 0016,
- 0262, 0367, 0266, 0060, 0170, 0213, 0201, 0265, 0220, 0334, 0315, 0330, 0376, 0324, 0265, 0053,
- 0036, 0206, 0357, 0071, 0046, 0061, 0260, 0017, 0201, 0370, 0242, 0201, 0370, 0154, 0230, 0310,
- 0047, 0041, 0255, 0043, 0002, 0136, 0244, 0233, 0162, 0002, 0340, 0217, 0176, 0270, 0036, 0043,
- 0335, 0323, 0134, 0152, 0021, 0203, 0253, 0013, 0016, 0047, 0113, 0257, 0352, 0130, 0170, 0102,
- 0336, 0324, 0306, 0372, 0200, 0036, 0163, 0053, 0211, 0340, 0162, 0251, 0326, 0345, 0362, 0130,
- 0110, 0175, 0257, 0245, 0003, 0347, 0345, 0350, 0302, 0166, 0231, 0136, 0140, 0157, 0154, 0251,
- 0053, 0141, 0061, 0217, 0355, 0203, 0154, 0036, 0133, 0072, 0010, 0026, 0163, 0332, 0246, 0052,
- 0125, 0124, 0062, 0104, 0042, 0267, 0155, 0343, 0275, 0022, 0323, 0213, 0273, 0306, 0324, 0246,
- 0367, 0330, 0301, 0124, 0125, 0235, 0310, 0277, 0235, 0231, 0336, 0241, 0063, 0372, 0244, 0352,
- 0030, 0252, 0144, 0033, 0252, 0332, 0212, 0152, 0234, 0104, 0152, 0216, 0042, 0276, 0306, 0145,
- 0175, 0244, 0260, 0237, 0050, 0017, 0357, 0316, 0307, 0277, 0313, 0215, 0252, 0126, 0340, 0126,
- 0050, 0300, 0200, 0225, 0231, 0160, 0005, 0310, 0275, 0322, 0175, 0123, 0377, 0035, 0300, 0133,
- 0061, 0170, 0243, 0145, 0006, 0374, 0052, 0026, 0171, 0003, 0374, 0146, 0341, 0167, 0160, 0015,
- 0330, 0255, 0030, 0273, 0203, 0357, 0164, 0333, 0375, 0351, 0032, 0035, 0065, 0233, 0033, 0215,
- 0264, 0066, 0040, 0255, 0010, 0322, 0116, 0010, 0063, 0050, 0161, 0000, 0156, 0025, 0303, 0155,
- 0272, 0316, 0033, 0015, 0265, 0103, 0200, 0132, 0021, 0250, 0175, 0032, 0000, 0312, 0052, 0106,
- 0331, 0047, 0152, 0231, 0007, 0003, 0142, 0075, 0156, 0270, 0372, 0370, 0003, 0040, 0255, 0020,
- 0322, 0070, 0031, 0000, 0326, 0126, 0200, 0265, 0215, 0006, 0331, 0173, 0000, 0131, 0041, 0033,
- 0055, 0144, 0263, 0000, 0263, 0252, 0355, 0264, 0315, 0227, 0146, 0107, 0073, 0005, 0064, 0210,
- 0376, 0155, 0106, 0266, 0041, 0204, 0257, 0201, 0200, 0125, 0011, 0270, 0015, 0341, 0153, 0251,
- 0360, 0365, 0057, 0342, 0056, 0004, 0210, 0136, 0257, 0073, 0172, 0315, 0167, 0003, 0077, 0207,
- 0173, 0001, 0032, 0132, 0165, 0032, 0332, 0341, 0341, 0273, 0243, 0303, 0037, 0366, 0077, 0064,
- 0367, 0016, 0333, 0357, 0217, 0016, 0337, 0037, 0101, 0100, 0014, 0002, 0332, 0225, 0004, 0264,
- 0001, 0317, 0253, 0300, 0163, 0253, 0365, 0256, 0365, 0267, 0037, 0366, 0333, 0155, 0300, 0061,
- 0004, 0266, 0113, 0017, 0154, 0003, 0206, 0127, 0042, 0223, 0337, 0375, 0355, 0350, 0303, 0176,
- 0033, 0104, 0061, 0104, 0314, 0053, 0212, 0230, 0003, 0204, 0053, 0206, 0360, 0217, 0115, 0000,
- 0057, 0304, 0340, 0113, 0217, 0301, 0003, 0156, 0001, 0267, 0153, 0300, 0055, 0104, 0364, 0213,
- 0341, 0226, 0132, 0046, 0040, 0027, 0220, 0273, 0006, 0344, 0102, 0232, 0100, 0061, 0213, 0067,
- 0214, 0137, 0003, 0166, 0001, 0273, 0153, 0300, 0056, 0144, 0036, 0224, 0273, 0340, 0033, 0033,
- 0270, 0075, 0204, 0072, 0107, 0120, 0215, 0247, 0130, 0065, 0236, 0126, 0225, 0325, 0170, 0322,
- 0326, 0055, 0175, 0315, 0212, 0105, 0335, 0012, 0360, 0271, 0224, 0311, 0046, 0116, 0124, 0345,
- 0006, 0044, 0251, 0002, 0067, 0125, 0135, 0206, 0224, 0247, 0271, 0122, 0335, 0333, 0245, 0201,
- 0027, 0151, 0154, 0023, 0221, 0326, 0301, 0245, 0265, 0363, 0172, 0177, 0132, 0113, 0171, 0357,
- 0305, 0237, 0372, 0275, 0316, 0260, 0346, 0350, 0054, 0360, 0164, 0353, 0245, 0057, 0251, 0061,
- 0051, 0126, 0223, 0032, 0172, 0030, 0213, 0342, 0071, 0257, 0271, 0043, 0057, 0277, 0254, 0247,
- 0214, 0124, 0336, 0056, 0074, 0114, 0075, 0023, 0173, 0172, 0241, 0161, 0214, 0051, 0127, 0222,
- 0065, 0037, 0133, 0174, 0221, 0102, 0156, 0223, 0267, 0043, 0354, 0210, 0201, 0150, 0367, 0036,
- 0061, 0065, 0161, 0163, 0041, 0237, 0330, 0210, 0262, 0161, 0201, 0256, 0030, 0337, 0226, 0131,
- 0127, 0171, 0107, 0065, 0273, 0010, 0121, 0243, 0216, 0346, 0163, 0226, 0301, 0273, 0065, 0054,
- 0142, 0074, 0250, 0336, 0062, 0205, 0210, 0120, 0111, 0235, 0331, 0045, 0125, 0037, 0033, 0163,
- 0053, 0246, 0124, 0075, 0113, 0320, 0332, 0340, 0245, 0355, 0101, 0105, 0362, 0156, 0303, 0030,
- 0176, 0153, 0245, 0014, 0077, 0341, 0122, 0260, 0166, 0102, 0066, 0232, 0364, 0325, 0176, 0125,
- 0212, 0205, 0134, 0167, 0344, 0115, 0313, 0040, 0163, 0030, 0062, 0152, 0113, 0330, 0044, 0113,
- 0014, 0206, 0076, 0251, 0047, 0230, 0225, 0225, 0250, 0246, 0312, 0326, 0257, 0075, 0172, 0357,
- 0141, 0337, 0077, 0321, 0247, 0165, 0002, 0347, 0177, 0330, 0260, 0372, 0200, 0352, 0066, 0374,
- 0222, 0110, 0015, 0370, 0247, 0065, 0237, 0141, 0227, 0103, 0163, 0277, 0235, 0353, 0126, 0076,
- 0206, 0237, 0131, 0254, 0311, 0177, 0116, 0034, 0335, 0061, 0210, 0156, 0241, 0123, 0113, 0024,
- 0363, 0312, 0323, 0171, 0170, 0033, 0152, 0370, 0005, 0311, 0225, 0056, 0137, 0301, 0127, 0117,
- 0057, 0051, 0150, 0234, 0257, 0262, 0146, 0346, 0111, 0300, 0101, 0357, 0104, 0110, 0070, 0307,
- 0314, 0030, 0237, 0361, 0055, 0074, 0031, 0136, 0155, 0234, 0216, 0143, 0140, 0362, 0210, 0175,
- 0155, 0172, 0113, 0157, 0376, 0236, 0030, 0245, 0026, 0043, 0256, 0226, 0110, 0325, 0147, 0364,
- 0311, 0261, 0250, 0156, 0042, 0223, 0377, 0214, 0356, 0074, 0152, 0043, 0116, 0350, 0316, 0070,
- 0030, 0355, 0023, 0212, 0270, 0212, 0214, 0276, 0352, 0143, 0112, 0377, 0204, 0042, 0362, 0137,
- 0023, 0260, 0037, 0325, 0256, 0312, 0310, 0123, 0340, 0163, 0316, 0207, 0372, 0112, 0071, 0114,
- 0352, 0244, 0176, 0255, 0057, 0274, 0114, 0071, 0121, 0210, 0031, 0022, 0263, 0314, 0333, 0163,
- 0116, 0317, 0345, 0317, 0234, 0167, 0170, 0144, 0024, 0060, 0354, 0147, 0072, 0132, 0136, 0136,
- 0235, 0071, 0027, 0270, 0325, 0305, 0101, 0341, 0033, 0015, 0364, 0050, 0134, 0334, 0037, 0033,
- 0375, 0347, 0011, 0027, 0260, 0332, 0200, 0317, 0016, 0265, 0232, 0215, 0314, 0012, 0311, 0162,
- 0037, 0057, 0354, 0230, 0211, 0273, 0251, 0334, 0174, 0275, 0251, 0074, 0324, 0306, 0261, 0051,
- 0171, 0121, 0371, 0246, 0011, 0205, 0326, 0132, 0205, 0102, 0166, 0275, 0154, 0350, 0075, 0107,
- 0357, 0165, 0264, 0240, 0332, 0145, 0133, 0120, 0361, 0223, 0214, 0171, 0171, 0371, 0305, 0067,
- 0057, 0055, 0276, 0260, 0360, 0160, 0152, 0133, 0213, 0112, 0275, 0174, 0072, 0204, 0131, 0170,
- 0064, 0247, 0254, 0057, 0113, 0246, 0250, 0070, 0345, 0213, 0206, 0057, 0174, 0067, 0257, 0077,
- 0045, 0337, 0124, 0237, 0051, 0205, 0362, 0110, 0234, 0130, 0205, 0326, 0020, 0327, 0300, 0150,
- 0243, 0110, 0367, 0112, 0376, 0334, 0322, 0264, 0027, 0304, 0152, 0222, 0104, 0116, 0277, 0353,
- 0136, 0112, 0324, 0346, 0025, 0255, 0362, 0242, 0364, 0305, 0066, 0360, 0023, 0373, 0112, 0026,
- 0074, 0205, 0245, 0134, 0222, 0124, 0313, 0044, 0322, 0070, 0216, 0261, 0274, 0017, 0137, 0260,
- 0023, 0314, 0053, 0326, 0202, 0000, 0317, 0211, 0205, 0303, 0337, 0227, 0164, 0353, 0262, 0167,
- 0110, 0245, 0131, 0330, 0104, 0070, 0275, 0246, 0336, 0056, 0245, 0335, 0125, 0123, 0272, 0227,
- 0133, 0163, 0243, 0360, 0056, 0275, 0362, 0366, 0162, 0260, 0303, 0015, 0134, 0161, 0231, 0322,
- 0353, 0172, 0312, 0066, 0015, 0070, 0340, 0170, 0163, 0341, 0306, 0314, 0232, 0146, 0074, 0243,
- 0113, 0226, 0005, 0261, 0254, 0161, 0131, 0233, 0271, 0053, 0242, 0315, 0124, 0110, 0231, 0135,
- 0223, 0060, 0240, 0314, 0362, 0050, 0163, 0266, 0236, 0053, 0243, 0314, 0245, 0135, 0356, 0331,
- 0372, 0175, 0134, 0062, 0113, 0156, 0263, 0253, 0210, 0251, 0265, 0044, 0000, 0031, 0025, 0373,
- 0171, 0317, 0036, 0064, 0335, 0064, 0125, 0132, 0022, 0203, 0072, 0337, 0174, 0362, 0007, 0116,
- 0125, 0230, 0245, 0065, 0222, 0070, 0214, 0342, 0162, 0061, 0232, 0244, 0350, 0051, 0007, 0161,
- 0143, 0024, 0263, 0322, 0360, 0177, 0201, 0055, 0027, 0360, 0137, 0036, 0376, 0147, 0353, 0011,
- 0370, 0317, 0302, 0377, 0230, 0257, 0124, 0315, 0030, 0300, 0170, 0335, 0014, 0240, 0235, 0227,
- 0001, 0044, 0332, 0117, 0363, 0017, 0142, 0256, 0011, 0066, 0205, 0127, 0312, 0306, 0016, 0233,
- 0205, 0103, 0360, 0335, 0005, 0015, 0074, 0177, 0356, 0301, 0264, 0313, 0267, 0164, 0353, 0272,
- 0202, 0142, 0077, 0274, 0035, 0360, 0362, 0206, 0143, 0127, 0043, 0216, 0341, 0341, 0250, 0263,
- 0126, 0126, 0003, 0227, 0123, 0357, 0174, 0203, 0037, 0336, 0230, 0274, 0351, 0023, 0022, 0320,
- 0173, 0235, 0112, 0370, 0127, 0374, 0147, 0122, 0251, 0137, 0225, 0342, 0027, 0241, 0031, 0077,
- 0252, 0036, 0303, 0366, 0342, 0310, 0302, 0353, 0100, 0327, 0155, 0221, 0046, 0033, 0151, 0337,
- 0302, 0361, 0311, 0364, 0041, 0170, 0130, 0340, 0160, 0325, 0130, 0304, 0341, 0123, 0206, 0273,
- 0204, 0067, 0343, 0025, 0157, 0263, 0030, 0274, 0044, 0340, 0162, 0322, 0373, 0064, 0133, 0347,
- 0145, 0033, 0026, 0262, 0167, 0224, 0167, 0075, 0346, 0375, 0124, 0221, 0263, 0054, 0152, 0070,
- 0073, 0213, 0062, 0063, 0244, 0076, 0300, 0155, 0134, 0346, 0321, 0211, 0366, 0104, 0330, 0130,
- 0163, 0165, 0057, 0304, 0207, 0314, 0207, 0004, 0353, 0154, 0034, 0017, 0004, 0357, 0365, 0065,
- 0361, 0307, 0276, 0353, 0334, 0147, 0042, 0367, 0201, 0270, 0232, 0100, 0243, 0247, 0215, 0111,
- 0342, 0227, 0026, 0051, 0177, 0061, 0152, 0336, 0236, 0105, 0315, 0077, 0314, 0105, 0315, 0063,
- 0043, 0345, 0153, 0201, 0301, 0342, 0375, 0302, 0107, 0012, 0115, 0302, 0373, 0203, 0125, 0032,
- 0060, 0352, 0252, 0065, 0110, 0015, 0315, 0307, 0205, 0343, 0175, 0056, 0055, 0270, 0260, 0340,
- 0342, 0244, 0051, 0265, 0136, 0012, 0301, 0167, 0031, 0065, 0163, 0136, 0305, 0024, 0040, 0013,
- 0351, 0156, 0060, 0261, 0107, 0324, 0272, 0165, 0115, 0216, 0361, 0172, 0351, 0232, 0313, 0352,
- 0242, 0222, 0266, 0051, 0037, 0062, 0364, 0303, 0045, 0100, 0026, 0361, 0131, 0024, 0071, 0214,
- 0312, 0146, 0014, 0075, 0341, 0234, 0334, 0067, 0250, 0055, 0373, 0111, 0271, 0000, 0141, 0256,
- 0004, 0300, 0134, 0211, 0177, 0262, 0232, 0151, 0122, 0160, 0260, 0026, 0232, 0151, 0172, 0340,
- 0057, 0042, 0137, 0077, 0265, 0303, 0364, 0130, 0131, 0051, 0301, 0271, 0264, 0200, 0134, 0041,
- 0315, 0327, 0137, 0217, 0346, 0053, 0027, 0110, 0113, 0213, 0151, 0034, 0125, 0153, 0062, 0157,
- 0220, 0123, 0075, 0144, 0263, 0123, 0102, 0105, 0227, 0234, 0311, 0324, 0333, 0267, 0236, 0213,
- 0104, 0232, 0100, 0042, 0205, 0110, 0144, 0114, 0237, 0320, 0264, 0010, 0036, 0120, 0107, 0352,
- 0001, 0312, 0262, 0250, 0143, 0300, 0225, 0165, 0376, 0231, 0127, 0145, 0150, 0034, 0026, 0276,
- 0023, 0073, 0060, 0175, 0124, 0037, 0115, 0050, 0123, 0225, 0221, 0242, 0237, 0122, 0224, 0225,
- 0320, 0034, 0314, 0232, 0365, 0222, 0024, 0173, 0316, 0155, 0117, 0256, 0133, 0214, 0255, 0201,
- 0012, 0271, 0171, 0317, 0315, 0301, 0015, 0045, 0302, 0150, 0360, 0165, 0244, 0301, 0077, 0066,
- 0226, 0006, 0017, 0101, 0116, 0052, 0220, 0330, 0216, 0211, 0111, 0040, 0216, 0031, 0161, 0204,
- 0376, 0161, 0104, 0357, 0120, 0344, 0314, 0000, 0012, 0111, 0317, 0056, 0053, 0115, 0204, 0271,
- 0304, 0171, 0353, 0131, 0012, 0267, 0042, 0174, 0260, 0164, 0251, 0172, 0255, 0105, 0230, 0064,
- 0011, 0225, 0042, 0307, 0036, 0163, 0265, 0262, 0365, 0147, 0315, 0302, 0316, 0075, 0123, 0022,
- 0047, 0111, 0063, 0226, 0356, 0341, 0171, 0072, 0330, 0346, 0376, 0221, 0374, 0056, 0271, 0276,
- 0046, 0230, 0265, 0366, 0244, 0173, 0116, 0350, 0370, 0124, 0202, 0072, 0161, 0334, 0200, 0151,
- 0156, 0340, 0271, 0141, 0074, 0306, 0011, 0354, 0221, 0202, 0222, 0060, 0027, 0050, 0213, 0211,
- 0236, 0111, 0317, 0301, 0042, 0366, 0110, 0363, 0204, 0262, 0040, 0277, 0126, 0276, 0243, 0163,
- 0042, 0243, 0032, 0043, 0134, 0120, 0251, 0221, 0050, 0237, 0044, 0366, 0210, 0241, 0326, 0350,
- 0311, 0323, 0135, 0265, 0026, 0101, 0110, 0337, 0232, 0113, 0055, 0142, 0114, 0032, 0307, 0344,
- 0116, 0023, 0304, 0150, 0052, 0120, 0156, 0200, 0123, 0322, 0042, 0326, 0247, 0053, 0125, 0314,
- 0354, 0116, 0251, 0075, 0242, 0234, 0251, 0015, 0103, 0074, 0315, 0330, 0335, 0255, 0173, 0215,
- 0275, 0057, 0304, 0231, 0075, 0255, 0223, 0274, 0314, 0344, 0171, 0123, 0126, 0207, 0370, 0024,
- 0020, 0237, 0003, 0227, 0134, 0165, 0344, 0172, 0141, 0110, 0016, 0153, 0134, 0137, 0347, 0353,
- 0106, 0154, 0033, 0233, 0104, 0227, 0037, 0351, 0314, 0142, 0150, 0052, 0045, 0216, 0150, 0167,
- 0344, 0031, 0233, 0332, 0023, 0061, 0005, 0257, 0115, 0137, 0165, 0302, 0260, 0275, 0254, 0116,
- 0210, 0137, 0343, 0326, 0234, 0217, 0103, 0074, 0222, 0176, 0277, 0245, 0370, 0176, 0133, 0361,
- 0375, 0103, 0305, 0367, 0337, 0053, 0276, 0177, 0244, 0370, 0376, 0017, 0161, 0357, 0107, 0277,
- 0371, 0165, 0341, 0064, 0055, 0120, 0274, 0325, 0071, 0310, 0216, 0251, 0336, 0100, 0043, 0057,
- 0301, 0126, 0154, 0020, 0133, 0267, 0320, 0265, 0310, 0327, 0006, 0323, 0054, 0275, 0121, 0265,
- 0332, 0012, 0337, 0212, 0150, 0027, 0066, 0122, 0135, 0221, 0044, 0044, 0120, 0125, 0112, 0122,
- 0125, 0112, 0121, 0045, 0152, 0046, 0272, 0053, 0206, 0335, 0071, 0347, 0114, 0157, 0075, 0042,
- 0342, 0267, 0323, 0061, 0345, 0206, 0254, 0127, 0367, 0054, 0233, 0122, 0075, 0052, 0247, 0143,
- 0335, 0271, 0307, 0210, 0215, 0061, 0022, 0014, 0033, 0371, 0230, 0061, 0262, 0234, 0343, 0226,
- 0234, 0157, 0056, 0354, 0367, 0210, 0243, 0267, 0345, 0245, 0220, 0163, 0037, 0204, 0271, 0326,
- 0134, 0032, 0004, 0322, 0074, 0302, 0365, 0360, 0043, 0301, 0323, 0272, 0026, 0265, 0161, 0376,
- 0377, 0000, 0052, 0304, 0354, 0160, 0042, 0165, 0040, 0165, 0242, 0050, 0125, 0124, 0162, 0236,
- 0027, 0016, 0357, 0326, 0001, 0037, 0102, 0314, 0140, 0017, 0073, 0265, 0327, 0257, 0213, 0236,
- 0221, 0202, 0343, 0120, 0305, 0216, 0103, 0315, 0316, 0071, 0300, 0041, 0335, 0102, 0147, 0026,
- 0136, 0217, 0264, 0014, 0260, 0021, 0170, 0204, 0021, 0354, 0327, 0363, 0140, 0313, 0164, 0174,
- 0023, 0070, 0334, 0262, 0366, 0303, 0055, 0263, 0255, 0050, 0365, 0200, 0213, 0372, 0171, 0225,
- 0220, 0341, 0314, 0314, 0305, 0303, 0243, 0246, 0154, 0213, 0131, 0151, 0327, 0166, 0263, 0271,
- 0371, 0207, 0142, 0226, 0017, 0110, 0054, 0370, 0102, 0326, 0171, 0336, 0105, 0351, 0150, 0011,
- 0365, 0104, 0035, 0077, 0075, 0072, 0251, 0310, 0231, 0064, 0043, 0206, 0156, 0345, 0075, 0044,
- 0062, 0340, 0012, 0346, 0303, 0042, 0255, 0106, 0077, 0325, 0110, 0007, 0222, 0055, 0215, 0271,
- 0244, 0101, 0013, 0176, 0023, 0236, 0350, 0324, 0314, 0300, 0233, 0056, 0330, 0121, 0263, 0231,
- 0243, 0275, 0320, 0040, 0033, 0307, 0276, 0105, 0114, 0254, 0205, 0352, 0274, 0047, 0200, 0041,
- 0037, 0331, 0146, 0330, 0163, 0251, 0045, 0142, 0260, 0321, 0311, 0331, 0034, 0307, 0070, 0026,
- 0317, 0164, 0265, 0146, 0147, 0272, 0336, 0307, 0124, 0102, 0225, 0256, 0202, 0132, 0213, 0023,
- 0037, 0013, 0107, 0245, 0216, 0124, 0133, 0052, 0325, 0052, 0055, 0243, 0336, 0251, 0112, 0165,
- 0362, 0264, 0062, 0174, 0265, 0252, 0076, 0233, 0222, 0203, 0027, 0036, 0144, 0310, 0354, 0057,
- 0273, 0100, 0135, 0151, 0125, 0361, 0262, 0252, 0341, 0101, 0225, 0374, 0045, 0072, 0354, 0072,
- 0314, 0233, 0274, 0341, 0362, 0341, 0276, 0206, 0017, 0226, 0143, 0002, 0125, 0323, 0150, 0236,
- 0346, 0331, 0011, 0311, 0341, 0301, 0033, 0137, 0216, 0136, 0013, 0325, 0372, 0314, 0027, 0070,
- 0220, 0312, 0360, 0122, 0246, 0062, 0211, 0104, 0255, 0104, 0373, 0360, 0325, 0116, 0113, 0136,
- 0325, 0137, 0177, 0373, 0372, 0057, 0325, 0216, 0337, 0144, 0162, 0351, 0226, 0073, 0326, 0263,
- 0000, 0260, 0353, 0205, 0316, 0267, 0122, 0166, 0214, 0271, 0035, 0340, 0203, 0354, 0250, 0131,
- 0271, 0310, 0342, 0262, 0043, 0334, 0327, 0155, 0222, 0035, 0127, 0141, 0262, 0251, 0110, 0005,
- 0366, 0345, 0150, 0026, 0344, 0207, 0244, 0374, 0050, 0272, 0262, 0157, 0144, 0211, 0111, 0356,
- 0011, 0363, 0067, 0117, 0230, 0034, 0256, 0246, 0346, 0153, 0332, 0004, 0227, 0162, 0217, 0371,
- 0177, 0271, 0160, 0126, 0053, 0377, 0026, 0005, 0121, 0342, 0066, 0272, 0223, 0326, 0121, 0302,
- 0374, 0342, 0375, 0301, 0222, 0145, 0014, 0342, 0131, 0117, 0055, 0114, 0132, 0151, 0027, 0115,
- 0042, 0077, 0251, 0326, 0042, 0215, 0361, 0115, 0326, 0124, 0335, 0050, 0017, 0313, 0112, 0127,
- 0304, 0345, 0277, 0036, 0056, 0271, 0250, 0330, 0232, 0155, 0300, 0345, 0354, 0260, 0031, 0001,
- 0044, 0044, 0206, 0325, 0122, 0331, 0314, 0266, 0002, 0303, 0373, 0232, 0220, 0216, 0374, 0351,
- 0354, 0066, 0111, 0224, 0147, 0146, 0203, 0045, 0065, 0214, 0002, 0341, 0232, 0217, 0103, 0207,
- 0345, 0043, 0237, 0166, 0343, 0230, 0072, 0352, 0264, 0252, 0226, 0133, 0226, 0236, 0143, 0226,
- 0231, 0073, 0026, 0263, 0125, 0161, 0271, 0147, 0211, 0071, 0145, 0133, 0310, 0043, 0132, 0165,
- 0125, 0023, 0074, 0154, 0323, 0107, 0134, 0216, 0246, 0160, 0243, 0334, 0227, 0324, 0002, 0311,
- 0353, 0030, 0371, 0123, 0171, 0244, 0010, 0104, 0235, 0060, 0224, 0205, 0106, 0131, 0371, 0140,
- 0363, 0171, 0213, 0063, 0161, 0320, 0177, 0250, 0127, 0312, 0142, 0146, 0075, 0277, 0144, 0116,
- 0236, 0073, 0331, 0242, 0332, 0044, 0111, 0152, 0333, 0204, 0241, 0050, 0127, 0262, 0226, 0071,
- 0315, 0120, 0156, 0254, 0161, 0334, 0377, 0274, 0265, 0125, 0306, 0150, 0241, 0332, 0030, 0031,
- 0075, 0256, 0262, 0156, 0331, 0312, 0331, 0161, 0013, 0022, 0061, 0127, 0223, 0210, 0031, 0046,
- 0041, 0104, 0105, 0161, 0260, 0127, 0247, 0144, 0004, 0151, 0313, 0174, 0271, 0002, 0163, 0230,
- 0126, 0261, 0220, 0145, 0041, 0173, 0240, 0032, 0122, 0050, 0327, 0233, 0102, 0271, 0230, 0361,
- 0007, 0211, 0224, 0322, 0371, 0161, 0334, 0152, 0023, 0172, 0307, 0035, 0237, 0307, 0361, 0336,
- 0377, 0003, 0126, 0027, 0122, 0340, 0000, 0050, 0165, 0165, 0141, 0171, 0051
+ 0154, 0163, 0056, 0147, 0154, 0141, 0144, 0145, 0233, 0155, 0003, 0000, 0001, 0000, 0000, 0000,
+ 0170, 0332, 0355, 0175, 0353, 0166, 0333, 0070, 0226, 0356, 0177, 0077, 0005, 0132, 0353, 0254,
+ 0236, 0256, 0065, 0241, 0043, 0311, 0161, 0122, 0335, 0125, 0161, 0057, 0331, 0226, 0143, 0235,
+ 0044, 0226, 0333, 0222, 0223, 0316, 0374, 0311, 0120, 0044, 0154, 0141, 0114, 0022, 0054, 0022,
+ 0264, 0255, 0132, 0347, 0205, 0316, 0153, 0234, 0047, 0073, 0000, 0051, 0131, 0222, 0305, 0013,
+ 0300, 0213, 0104, 0111, 0273, 0327, 0232, 0232, 0130, 0044, 0100, 0134, 0366, 0267, 0357, 0330,
+ 0370, 0375, 0237, 0317, 0266, 0205, 0036, 0261, 0347, 0023, 0352, 0174, 0154, 0264, 0016, 0233,
+ 0015, 0204, 0035, 0203, 0232, 0304, 0271, 0377, 0330, 0270, 0035, 0136, 0150, 0277, 0066, 0376,
+ 0171, 0162, 0360, 0373, 0137, 0064, 0015, 0175, 0302, 0016, 0366, 0164, 0206, 0115, 0364, 0104,
+ 0330, 0030, 0335, 0133, 0272, 0211, 0321, 0321, 0341, 0273, 0346, 0141, 0023, 0151, 0032, 0177,
+ 0211, 0070, 0014, 0173, 0167, 0272, 0201, 0117, 0016, 0020, 0372, 0335, 0303, 0177, 0004, 0304,
+ 0303, 0076, 0262, 0310, 0350, 0143, 0343, 0236, 0075, 0374, 0147, 0143, 0376, 0241, 0243, 0303,
+ 0366, 0273, 0306, 0333, 0360, 0075, 0072, 0372, 0037, 0154, 0060, 0144, 0130, 0272, 0357, 0177,
+ 0154, 0174, 0142, 0017, 0137, 0261, 0023, 0064, 0020, 0061, 0077, 0066, 0072, 0327, 0275, 0360,
+ 0017, 0361, 0036, 0177, 0323, 0365, 0250, 0213, 0075, 0066, 0101, 0216, 0156, 0343, 0217, 0215,
+ 0107, 0342, 0223, 0221, 0205, 0033, 0047, 0103, 0057, 0300, 0277, 0277, 0235, 0075, 0215, 0177,
+ 0331, 0320, 0035, 0355, 0216, 0032, 0201, 0337, 0070, 0271, 0320, 0055, 0177, 0365, 0175, 0143,
+ 0114, 0054, 0063, 0372, 0167, 0322, 0240, 0172, 0014, 0333, 0113, 0003, 0073, 0263, 0250, 0217,
+ 0033, 0263, 0106, 0212, 0043, 0314, 0063, 0312, 0270, 0066, 0226, 0076, 0302, 0126, 0003, 0061,
+ 0117, 0167, 0174, 0113, 0147, 0072, 0377, 0340, 0307, 0306, 0004, 0363, 0056, 0176, 0206, 0343,
+ 0223, 0351, 0043, 0360, 0261, 0026, 0070, 0046, 0366, 0054, 0342, 0244, 0015, 0127, 0067, 0014,
+ 0154, 0011, 0042, 0240, 0036, 0172, 0300, 0023, 0076, 0340, 0006, 0362, 0311, 0275, 0243, 0133,
+ 0037, 0033, 0272, 0301, 0310, 0043, 0047, 0217, 0006, 0262, 0071, 0371, 0334, 0021, 0276, 0325,
+ 0174, 0345, 0316, 0077, 0377, 0074, 0353, 0137, 0015, 0157, 0372, 0137, 0176, 0176, 0355, 0014,
+ 0076, 0107, 0173, 0036, 0366, 0365, 0066, 0132, 0343, 0351, 0362, 0277, 0175, 0131, 0377, 0305,
+ 0007, 0253, 0373, 0360, 0235, 0070, 0046, 0175, 0232, 0356, 0202, 0113, 0246, 0177, 0346, 0334,
+ 0363, 0230, 0367, 0115, 0174, 0247, 0007, 0026, 0223, 0043, 0052, 0116, 0335, 0344, 0117, 0075,
+ 0334, 0141, 0251, 0017, 0114, 0073, 0327, 0236, 0210, 0311, 0306, 0215, 0223, 0343, 0343, 0246,
+ 0154, 0213, 0061, 0046, 0367, 0143, 0076, 0252, 0266, 0114, 0023, 0237, 0171, 0164, 0242, 0011,
+ 0220, 0152, 0256, 0356, 0141, 0107, 0162, 0066, 0304, 0240, 0116, 0343, 0144, 0300, 0250, 0361,
+ 0340, 0153, 0342, 0217, 0103, 0327, 0271, 0317, 0152, 0344, 0077, 0020, 0227, 0177, 0345, 0036,
+ 0173, 0332, 0230, 0044, 0176, 0051, 0003, 0134, 0247, 0364, 0171, 0323, 0050, 0262, 0165, 0357,
+ 0236, 0070, 0032, 0243, 0056, 0137, 0344, 0246, 0102, 0213, 0021, 0145, 0214, 0332, 0215, 0223,
+ 0226, 0124, 0043, 0352, 0021, 0276, 0037, 0072, 0043, 0142, 0251, 0071, 0067, 0144, 0304, 0320,
+ 0055, 0231, 0206, 0276, 0253, 0033, 0234, 0047, 0313, 0016, 0156, 0244, 0373, 0130, 0140, 0131,
+ 0163, 0251, 0117, 0242, 0257, 0361, 0251, 0305, 0266, 0134, 0332, 0233, 0370, 0375, 0271, 0242,
+ 0014, 0217, 0050, 0175, 0170, 0141, 0176, 0057, 0077, 0054, 0266, 0313, 0261, 0163, 0031, 0273,
+ 0247, 0322, 0314, 0037, 0323, 0047, 0276, 0031, 0036, 0147, 0142, 0051, 0333, 0036, 0077, 0143,
+ 0031, 0252, 0054, 0064, 0307, 0274, 0124, 0232, 0101, 0173, 0076, 0323, 0075, 0226, 0104, 0172,
+ 0031, 0155, 0261, 0143, 0346, 0154, 0031, 0142, 0344, 0070, 0107, 0303, 0031, 0124, 0224, 0332,
+ 0112, 0043, 0046, 0023, 0071, 0031, 0223, 0015, 0251, 0002, 0261, 0211, 0053, 0366, 0006, 0013,
+ 0125, 0046, 0146, 0367, 0343, 0350, 0244, 0353, 0060, 0157, 0362, 0042, 0221, 0156, 0075, 0353,
+ 0063, 0236, 0204, 0277, 0305, 0023, 0120, 0041, 0042, 0052, 0000, 0230, 0244, 0346, 0214, 0122,
+ 0213, 0161, 0046, 0316, 0360, 0063, 0213, 0125, 0043, 0072, 0256, 0313, 0211, 0005, 0065, 0376,
+ 0252, 0333, 0356, 0157, 0214, 0076, 0140, 0256, 0277, 0241, 0021, 0276, 0243, 0036, 0106, 0023,
+ 0032, 0170, 0350, 0216, 0070, 0316, 0070, 0030, 0035, 0022, 0052, 0224, 0202, 0303, 0203, 0203,
+ 0305, 0127, 0377, 0152, 0261, 0337, 0176, 0364, 0157, 0157, 0120, 0347, 0354, 0254, 0177, 0173,
+ 0065, 0104, 0237, 0273, 0077, 0376, 0172, 0317, 0176, 0153, 0250, 0216, 0363, 0121, 0267, 0270,
+ 0246, 0321, 0070, 0211, 0366, 0106, 0265, 0365, 0062, 0142, 0216, 0163, 0066, 0017, 0101, 0223,
+ 0267, 0261, 0024, 0371, 0307, 0265, 0177, 0236, 0316, 0274, 0171, 0250, 0334, 0324, 0265, 0270,
+ 0072, 0076, 0246, 0026, 0347, 0212, 0311, 0033, 0054, 0261, 0133, 0252, 0337, 0045, 0216, 0033,
+ 0060, 0315, 0015, 0074, 0067, 0324, 0220, 0165, 0313, 0035, 0353, 0351, 0175, 0054, 0353, 0203,
+ 0257, 0173, 0327, 0215, 0007, 0216, 0141, 0271, 0157, 0343, 0147, 0127, 0027, 0373, 0224, 0311,
+ 0125, 0343, 0032, 0337, 0021, 0313, 0312, 0207, 0243, 0271, 0244, 0175, 0227, 0065, 0323, 0304,
+ 0351, 0054, 0250, 0301, 0161, 0334, 0111, 0216, 0037, 0175, 0011, 0015, 0202, 0365, 0062, 0236,
+ 0134, 0153, 0235, 0154, 0271, 0134, 0314, 0071, 0212, 0060, 0043, 0271, 0106, 0213, 0002, 0317,
+ 0122, 0355, 0377, 0177, 0002, 0237, 0221, 0273, 0211, 0064, 0313, 0320, 0031, 0363, 0310, 0050,
+ 0140, 0330, 0217, 0177, 0141, 0361, 0225, 0031, 0271, 0120, 0207, 0161, 0233, 0301, 0347, 0166,
+ 0020, 0347, 0117, 0001, 0377, 0245, 0377, 0074, 0271, 0307, 0216, 0066, 0340, 0163, 0102, 0255,
+ 0346, 0334, 0336, 0171, 0275, 0321, 0351, 0037, 0333, 0041, 0064, 0064, 0067, 0213, 0206, 0145,
+ 0351, 0334, 0375, 0043, 0040, 0154, 0302, 0145, 0364, 0056, 0011, 0350, 0341, 0030, 0057, 0312,
+ 0140, 0034, 0316, 0161, 0021, 0070, 0157, 0220, 0103, 0031, 0042, 0216, 0141, 0005, 0302, 0261,
+ 0203, 0164, 0344, 0117, 0354, 0021, 0265, 0120, 0144, 0306, 0107, 0244, 0053, 0344, 0366, 0230,
+ 0061, 0327, 0377, 0307, 0333, 0267, 0363, 0336, 0336, 0352, 0056, 0171, 0373, 0330, 0172, 0373,
+ 0107, 0300, 0125, 0376, 0177, 0106, 0315, 0076, 0202, 0354, 0256, 0215, 0354, 0226, 0334, 0061,
+ 0220, 0337, 0012, 0034, 0253, 0265, 0131, 0216, 0065, 0300, 0256, 0036, 0272, 0330, 0352, 0047,
+ 0303, 0167, 0150, 0223, 0333, 0240, 0244, 0225, 0247, 0244, 0161, 0041, 0002, 0312, 0331, 0066,
+ 0242, 0340, 0250, 0154, 0024, 0304, 0257, 0115, 0354, 0313, 0113, 0036, 0027, 0116, 0130, 0215,
+ 0154, 0227, 0134, 0022, 0152, 0252, 0160, 0312, 0251, 0066, 0115, 0006, 0112, 0244, 0164, 0242,
+ 0316, 0165, 0057, 0265, 0277, 0014, 0242, 0053, 0203, 0272, 0323, 0050, 0073, 0211, 0252, 0223,
+ 0051, 0172, 0105, 0121, 0325, 0107, 0132, 0104, 0224, 0031, 0364, 0234, 0100, 0126, 0051, 0124,
+ 0002, 0336, 0132, 0360, 0326, 0126, 0341, 0255, 0275, 0372, 0061, 0350, 0016, 0102, 0025, 0331,
+ 0337, 0101, 0243, 0120, 0314, 0016, 0161, 0001, 0203, 0050, 0033, 0143, 0017, 0131, 0304, 0027,
+ 0321, 0373, 0310, 0044, 0360, 0205, 0141, 0070, 0065, 0371, 0270, 0375, 0360, 0364, 0364, 0164,
+ 0350, 0350, 0276, 0251, 0377, 0301, 0373, 0342, 0026, 0307, 0241, 0101, 0355, 0267, 0346, 0204,
+ 0177, 0214, 0030, 0157, 0371, 0012, 0235, 0023, 0357, 0155, 0330, 0113, 0324, 0311, 0041, 0343,
+ 0237, 0005, 0053, 0260, 0116, 0126, 0140, 0276, 0115, 0004, 0303, 0020, 0034, 0273, 0153, 0264,
+ 0031, 0256, 0102, 0352, 0134, 0144, 0101, 0140, 0067, 0200, 0123, 0267, 0240, 0123, 0067, 0042,
+ 0252, 0035, 0026, 0343, 0213, 0240, 0121, 0027, 0333, 0321, 0163, 0220, 0333, 0333, 0055, 0267,
+ 0137, 0357, 0042, 0010, 0156, 0360, 0350, 0202, 0107, 0027, 0074, 0272, 0245, 0152, 0147, 0131,
+ 0366, 0042, 0050, 0153, 0340, 0344, 0055, 0305, 0125, 0050, 0305, 0232, 0325, 0335, 0204, 0173,
+ 0340, 0114, 0216, 0324, 0134, 0304, 0325, 0134, 0177, 0267, 0275, 0311, 0222, 0322, 0173, 0015,
+ 0116, 0350, 0270, 0271, 0304, 0317, 0043, 0027, 0364, 0325, 0041, 0257, 0154, 0227, 0305, 0314,
+ 0165, 0145, 0236, 0062, 0211, 0340, 0247, 0001, 0127, 0244, 0235, 0027, 0303, 0253, 0377, 0371,
+ 0164, 0170, 0125, 0243, 0034, 0360, 0314, 0003, 0034, 0111, 0015, 0307, 0272, 0237, 0257, 0241,
+ 0207, 0015, 0114, 0036, 0161, 0316, 0326, 0231, 0326, 0337, 0031, 0265, 0155, 0302, 0320, 0331,
+ 0130, 0167, 0356, 0261, 0057, 0077, 0033, 0031, 0173, 0055, 0237, 0225, 0047, 0033, 0216, 0131,
+ 0047, 0163, 0125, 0016, 0310, 0044, 0163, 0327, 0376, 0347, 0065, 0062, 0325, 0126, 0071, 0114,
+ 0065, 0136, 0036, 0256, 0034, 0325, 0242, 0363, 0243, 0132, 0206, 0105, 0214, 0007, 0154, 0112,
+ 0236, 0324, 0332, 0062, 0026, 0330, 0312, 0313, 0002, 0023, 0117, 0244, 0275, 0326, 0056, 0010,
+ 0263, 0360, 0110, 0237, 0033, 0163, 0253, 0324, 0177, 0211, 0205, 0031, 0177, 0252, 0173, 0233,
+ 0076, 0326, 0024, 0236, 0212, 0061, 0304, 0061, 0100, 0155, 0024, 0361, 0356, 0344, 0317, 0255,
+ 0314, 0261, 0221, 0056, 0014, 0342, 0040, 0136, 0066, 0367, 0127, 0242, 0232, 0144, 0130, 0247,
+ 0204, 0336, 0123, 0060, 0135, 0130, 0111, 0112, 0302, 0362, 0052, 0232, 0162, 0111, 0143, 0161,
+ 0004, 0165, 0052, 0221, 0353, 0043, 0203, 0303, 0046, 0032, 0165, 0264, 0220, 0311, 0050, 0356,
+ 0140, 0061, 0161, 0352, 0141, 0213, 0340, 0273, 0306, 0211, 0103, 0035, 0005, 0276, 0341, 0006,
+ 0156, 0110, 0040, 0142, 0065, 0145, 0133, 0211, 0363, 0262, 0274, 0045, 0175, 0314, 0173, 0330,
+ 0154, 0301, 0073, 0370, 0066, 0027, 0067, 0277, 0053, 0227, 0233, 0313, 0262, 0302, 0364, 0303,
+ 0271, 0013, 0047, 0267, 0107, 0064, 0140, 0065, 0075, 0273, 0075, 0033, 0032, 0234, 0336, 0336,
+ 0354, 0351, 0155, 0261, 0017, 0245, 0236, 0337, 0126, 0075, 0216, 0275, 0327, 0007, 0236, 0263,
+ 0215, 0004, 0165, 0003, 0241, 0374, 0323, 0316, 0307, 0171, 0217, 0054, 0367, 0154, 0276, 0105,
+ 0165, 0122, 0116, 0052, 0065, 0312, 0136, 0013, 0065, 0362, 0074, 0012, 0356, 0226, 0110, 0133,
+ 0153, 0265, 0177, 0215, 0043, 0157, 0360, 0160, 0154, 0255, 0122, 0173, 0101, 0034, 0335, 0061,
+ 0210, 0156, 0111, 0073, 0006, 0044, 0335, 0361, 0053, 0150, 0344, 0122, 0303, 0140, 0172, 0366,
+ 0224, 0113, 0123, 0245, 0117, 0271, 0146, 0204, 0132, 0355, 0125, 0373, 0170, 0245, 0237, 0247,
+ 0250, 0060, 0306, 0254, 0223, 0061, 0326, 0037, 0047, 0371, 0325, 0360, 0335, 0063, 0152, 0345,
+ 0250, 0176, 0300, 0170, 0067, 0013, 0142, 0071, 0372, 0273, 0106, 0050, 0010, 0311, 0077, 0134,
+ 0013, 0315, 0014, 0274, 0251, 0104, 0071, 0156, 0066, 0163, 0264, 0027, 0006, 0156, 0343, 0304,
+ 0267, 0210, 0311, 0265, 0046, 0127, 0343, 0352, 0207, 0043, 0333, 0113, 0130, 0340, 0310, 0245,
+ 0034, 0206, 0130, 0343, 0252, 0106, 0326, 0334, 0267, 0077, 0163, 0271, 0274, 0164, 0336, 0017,
+ 0331, 0331, 0274, 0052, 0141, 0326, 0071, 0251, 0176, 0213, 0112, 0112, 0155, 0115, 0364, 0165,
+ 0363, 0041, 0321, 0026, 0204, 0104, 0067, 0235, 0277, 0266, 0003, 0271, 0002, 0035, 0156, 0072,
+ 0332, 0256, 0025, 0236, 0074, 0216, 0324, 0020, 0104, 0034, 0237, 0171, 0201, 0315, 0351, 0372,
+ 0020, 0120, 0001, 0151, 0122, 0205, 0131, 0373, 0167, 0074, 0342, 0043, 0303, 0073, 0000, 0226,
+ 0351, 0114, 0000, 0025, 0220, 0127, 0266, 0217, 0262, 0342, 0214, 0272, 0023, 0117, 0330, 0151,
+ 0350, 0377, 0375, 0137, 0324, 0156, 0266, 0333, 0232, 0306, 0377, 0173, 0304, 0315, 0074, 0237,
+ 0121, 0347, 0164, 0160, 0136, 0065, 0060, 0162, 0032, 0264, 0345, 0002, 0053, 0104, 0324, 0257,
+ 0111, 0200, 0212, 0351, 0302, 0147, 0023, 0076, 0302, 0131, 0163, 0207, 0172, 0266, 0156, 0051,
+ 0064, 0177, 0145, 0032, 0373, 0330, 0046, 0126, 0370, 0213, 0174, 0027, 0217, 0272, 0107, 0164,
+ 0207, 0111, 0216, 0001, 0122, 0352, 0066, 0045, 0051, 0207, 0036, 0166, 0114, 0277, 0147, 0154,
+ 0221, 0035, 0224, 0314, 0055, 0242, 0311, 0040, 0341, 0265, 0104, 0034, 0100, 0344, 0336, 0301,
+ 0046, 0032, 0115, 0320, 0205, 0207, 0261, 0113, 0036, 0320, 0235, 0107, 0155, 0164, 0301, 0333,
+ 0210, 0067, 0200, 0163, 0000, 0347, 0200, 0063, 0204, 0173, 0245, 0115, 0014, 0307, 0304, 0107,
+ 0374, 0355, 0173, 0117, 0267, 0221, 0101, 0155, 0354, 0107, 0005, 0311, 0365, 0221, 0117, 0055,
+ 0116, 0101, 0026, 0357, 0202, 0242, 0047, 0335, 0343, 0115, 0331, 0344, 0020, 0070, 0004, 0160,
+ 0210, 0255, 0342, 0020, 0307, 0365, 0113, 0327, 0027, 0377, 0155, 0234, 0210, 0250, 0267, 0122,
+ 0011, 0212, 0050, 0213, 0054, 0326, 0173, 0044, 0264, 0226, 0365, 0026, 0010, 0031, 0030, 0036,
+ 0265, 0054, 0154, 0256, 0344, 0040, 0274, 0172, 0120, 0317, 0003, 0001, 0217, 0063, 0262, 0124,
+ 0155, 0070, 0366, 0303, 0351, 0215, 0164, 0117, 0163, 0251, 0105, 0014, 0316, 0330, 0034, 0374,
+ 0230, 0316, 0327, 0126, 0263, 0010, 0165, 0276, 0062, 0323, 0310, 0011, 0161, 0224, 0212, 0211,
+ 0020, 0107, 0343, 0152, 0032, 0343, 0274, 0164, 0126, 0366, 0276, 0335, 0154, 0346, 0355, 0141,
+ 0126, 0006, 0277, 0365, 0153, 0263, 0254, 0170, 0302, 0067, 0202, 0237, 0134, 0052, 0216, 0246,
+ 0326, 0137, 0046, 0112, 0023, 0101, 0346, 0046, 0142, 0146, 0214, 0261, 0251, 0221, 0154, 0375,
+ 0071, 0161, 0051, 0345, 0054, 0223, 0057, 0204, 0213, 0121, 0077, 0325, 0207, 0127, 0170, 0231,
+ 0313, 0130, 0352, 0274, 0016, 0215, 0277, 0031, 0277, 0104, 0036, 0215, 0145, 0207, 0306, 0041,
+ 0352, 0130, 0026, 0012, 0137, 0361, 0221, 0207, 0175, 0354, 0075, 0142, 0363, 0360, 0340, 0340,
+ 0006, 0233, 0304, 0217, 0344, 0030, 0347, 0365, 0341, 0131, 0273, 0300, 0307, 0210, 0070, 0310,
+ 0247, 0201, 0147, 0340, 0360, 0227, 0021, 0161, 0164, 0157, 0202, 0356, 0270, 0100, 0364, 0337,
+ 0104, 0272, 0015, 0365, 0302, 0377, 0317, 0027, 0364, 0040, 0312, 0317, 0062, 0302, 0240, 0334,
+ 0033, 0244, 0173, 0030, 0361, 0061, 0333, 0204, 0211, 0243, 0172, 0174, 0002, 0217, 0304, 0344,
+ 0377, 0140, 0143, 0235, 0361, 0377, 0140, 0336, 0211, 0145, 0321, 0047, 0121, 0364, 0223, 0143,
+ 0310, 0014, 0045, 0214, 0057, 0032, 0035, 0330, 0230, 0375, 0343, 0040, 0134, 0212, 0277, 0265,
+ 0176, 0101, 0313, 0343, 0362, 0021, 0275, 0233, 0015, 0310, 0240, 0046, 0106, 0066, 0327, 0211,
+ 0370, 0064, 0230, 0316, 0007, 0052, 0172, 0325, 0107, 0364, 0121, 0074, 0232, 0256, 0102, 0330,
+ 0215, 0103, 0271, 0101, 0206, 0337, 0360, 0347, 0304, 0017, 0217, 0016, 0212, 0116, 0026, 0077,
+ 0352, 0230, 0257, 0106, 0304, 0077, 0311, 0011, 0207, 0330, 0330, 0073, 0234, 0216, 0244, 0275,
+ 0072, 0022, 0376, 0305, 0205, 0365, 0230, 0215, 0204, 0117, 0324, 0014, 0370, 0350, 0252, 0030,
+ 0014, 0377, 0144, 0330, 0207, 0170, 0156, 0162, 0022, 0262, 0147, 0041, 0120, 0321, 0352, 0055,
+ 0337, 0211, 0350, 0164, 0244, 0255, 0163, 0355, 0120, 0144, 0137, 0314, 0127, 0075, 0334, 0052,
+ 0376, 0060, 0154, 0276, 0070, 0215, 0331, 0374, 0216, 0176, 0021, 0347, 0371, 0005, 0165, 0211,
+ 0361, 0204, 0203, 0017, 0370, 0256, 0212, 0316, 0046, 0141, 0215, 0326, 0021, 0026, 0364, 0300,
+ 0307, 0106, 0303, 0006, 0334, 0020, 0246, 0036, 0247, 0017, 0376, 0006, 0377, 0210, 0115, 0271,
+ 0362, 0024, 0315, 0234, 0123, 0225, 0311, 0277, 0316, 0211, 0052, 0062, 0207, 0303, 0171, 0372,
+ 0364, 0216, 0075, 0011, 0202, 0230, 0221, 0212, 0350, 0302, 0167, 0261, 0041, 0350, 0205, 0067,
+ 0044, 0202, 0212, 0074, 0101, 0051, 0116, 0104, 0063, 0276, 0037, 0215, 0155, 0170, 0331, 0033,
+ 0240, 0101, 0377, 0142, 0370, 0275, 0163, 0323, 0105, 0374, 0337, 0327, 0067, 0375, 0157, 0275,
+ 0363, 0356, 0071, 0072, 0375, 0201, 0206, 0227, 0135, 0324, 0271, 0035, 0136, 0366, 0157, 0320,
+ 0177, 0377, 0167, 0147, 0300, 0037, 0377, 0307, 0177, 0240, 0316, 0325, 0071, 0377, 0277, 0037,
+ 0250, 0373, 0357, 0353, 0233, 0356, 0140, 0200, 0372, 0067, 0007, 0275, 0257, 0327, 0137, 0172,
+ 0274, 0011, 0357, 0343, 0246, 0163, 0065, 0354, 0165, 0007, 0157, 0120, 0357, 0352, 0354, 0313,
+ 0355, 0171, 0357, 0352, 0323, 0033, 0164, 0172, 0073, 0104, 0127, 0375, 0041, 0372, 0322, 0373,
+ 0332, 0033, 0362, 0327, 0206, 0375, 0067, 0141, 0327, 0323, 0146, 0007, 0363, 0146, 0250, 0177,
+ 0201, 0276, 0166, 0157, 0316, 0056, 0371, 0237, 0235, 0323, 0336, 0227, 0336, 0360, 0107, 0370,
+ 0275, 0213, 0336, 0360, 0112, 0174, 0353, 0202, 0217, 0244, 0203, 0256, 0073, 0067, 0303, 0336,
+ 0331, 0355, 0227, 0316, 0015, 0272, 0276, 0275, 0271, 0356, 0017, 0370, 0050, 0157, 0272, 0007,
+ 0347, 0275, 0301, 0331, 0227, 0116, 0357, 0153, 0227, 0103, 0260, 0167, 0305, 0277, 0210, 0272,
+ 0337, 0272, 0127, 0103, 0064, 0270, 0354, 0174, 0371, 0262, 0070, 0227, 0323, 0056, 0037, 0112,
+ 0347, 0364, 0113, 0067, 0352, 0217, 0317, 0345, 0274, 0167, 0323, 0075, 0033, 0276, 0071, 0350,
+ 0135, 0115, 0377, 0045, 0206, 0317, 0127, 0201, 0217, 0342, 0313, 0033, 0064, 0270, 0356, 0236,
+ 0365, 0304, 0077, 0272, 0377, 0356, 0362, 0041, 0167, 0156, 0176, 0274, 0341, 0263, 0106, 0147,
+ 0375, 0253, 0101, 0367, 0137, 0267, 0374, 0045, 0376, 0020, 0235, 0167, 0276, 0166, 0076, 0165,
+ 0007, 0007, 0177, 0313, 0230, 0070, 0137, 0337, 0263, 0333, 0233, 0356, 0127, 0061, 0062, 0076,
+ 0333, 0301, 0355, 0351, 0140, 0330, 0033, 0336, 0016, 0273, 0350, 0123, 0277, 0177, 0036, 0056,
+ 0347, 0240, 0173, 0363, 0255, 0167, 0326, 0035, 0374, 0206, 0276, 0364, 0007, 0341, 0232, 0334,
+ 0016, 0272, 0157, 0370, 0027, 0206, 0235, 0360, 0303, 0274, 0013, 0276, 0040, 0374, 0261, 0230,
+ 0313, 0355, 0240, 0027, 0056, 0115, 0357, 0152, 0330, 0275, 0271, 0271, 0275, 0036, 0366, 0372,
+ 0127, 0277, 0034, 0134, 0366, 0277, 0363, 0311, 0363, 0061, 0166, 0170, 0323, 0363, 0160, 0015,
+ 0373, 0127, 0341, 0124, 0371, 0072, 0364, 0157, 0176, 0210, 0116, 0305, 0032, 0204, 0113, 0374,
+ 0006, 0175, 0277, 0354, 0362, 0337, 0157, 0304, 0262, 0205, 0111, 0237, 0035, 0261, 0030, 0203,
+ 0341, 0115, 0357, 0154, 0270, 0370, 0032, 0377, 0336, 0260, 0177, 0063, 0104, 0363, 0071, 0242,
+ 0253, 0356, 0247, 0057, 0275, 0117, 0335, 0253, 0263, 0256, 0170, 0332, 0027, 0275, 0174, 0357,
+ 0015, 0272, 0277, 0360, 0035, 0351, 0361, 0221, 0175, 0342, 0113, 0032, 0176, 0366, 0173, 0207,
+ 0177, 0363, 0066, 0234, 0262, 0330, 0011, 0076, 0252, 0350, 0237, 0013, 0324, 0367, 0046, 0334,
+ 0057, 0324, 0273, 0100, 0235, 0363, 0157, 0075, 0061, 0354, 0350, 0345, 0003, 0276, 0303, 0203,
+ 0336, 0224, 0032, 0302, 0045, 0073, 0273, 0234, 0056, 0367, 0141, 0036, 0336, 0256, 0152, 0246,
+ 0111, 0232, 0152, 0071, 0142, 0054, 0037, 0222, 0155, 0246, 0022, 0054, 0267, 0222, 0254, 0267,
+ 0022, 0054, 0070, 0031, 0053, 0056, 0313, 0222, 0113, 0161, 0202, 0244, 0065, 0134, 0203, 0135,
+ 0324, 0052, 0307, 0056, 0232, 0252, 0113, 0052, 0235, 0225, 0174, 0224, 0172, 0213, 0222, 0342,
+ 0332, 0160, 0322, 0153, 0075, 0047, 0275, 0302, 0164, 0300, 0001, 0327, 0052, 0270, 0321, 0340,
+ 0325, 0052, 0251, 0232, 0353, 0104, 0234, 0221, 0142, 0252, 0174, 0133, 0124, 0224, 0340, 0070,
+ 0117, 0166, 0224, 0315, 0213, 0206, 0203, 0132, 0033, 0076, 0250, 0065, 0073, 0275, 0003, 0107,
+ 0265, 0112, 0072, 0252, 0165, 0032, 0130, 0026, 0147, 0247, 0365, 0074, 0254, 0265, 0060, 0070,
+ 0070, 0256, 0265, 0321, 0343, 0132, 0323, 0235, 0330, 0266, 0013, 0067, 0341, 0056, 0314, 0334,
+ 0167, 0141, 0246, 0125, 0354, 0123, 0256, 0322, 0247, 0134, 0235, 0072, 0117, 0051, 0277, 0322,
+ 0316, 0237, 0111, 0351, 0025, 0245, 0336, 0271, 0051, 0056, 0130, 0026, 0176, 0156, 0053, 0260,
+ 0035, 0377, 0143, 0213, 0377, 0333, 0243, 0117, 0376, 0307, 0343, 0360, 0146, 0345, 0064, 0335,
+ 0342, 0223, 0107, 0314, 0072, 0251, 0144, 0262, 0305, 0316, 0363, 0025, 0072, 0137, 0331, 0050,
+ 0031, 0217, 0170, 0056, 0067, 0372, 0312, 0172, 0204, 0133, 0243, 0311, 0153, 0234, 0222, 0141,
+ 0251, 0013, 0117, 0330, 0220, 0213, 0054, 0366, 0023, 0327, 0065, 0242, 0137, 0353, 0134, 0076,
+ 0105, 0173, 0251, 0215, 0231, 0073, 0222, 0224, 0246, 0376, 0145, 0204, 0161, 0226, 0341, 0162,
+ 0064, 0203, 0113, 0373, 0025, 0134, 0224, 0140, 0123, 0313, 0220, 0317, 0224, 0354, 0322, 0017,
+ 0304, 0226, 0111, 0267, 0305, 0002, 0077, 0073, 0023, 0341, 0351, 0007, 0216, 0201, 0375, 0074,
+ 0175, 0052, 0346, 0217, 0124, 0347, 0130, 0114, 0256, 0175, 0130, 0216, 0053, 0056, 0053, 0261,
+ 0042, 0166, 0301, 0361, 0035, 0323, 0370, 0207, 0165, 0143, 0234, 0171, 0010, 0047, 0301, 0167,
+ 0106, 0135, 0225, 0016, 0122, 0262, 0045, 0062, 0334, 0211, 0352, 0020, 0130, 0250, 0112, 0275,
+ 0300, 0312, 0043, 0112, 0312, 0250, 0111, 0135, 0065, 0102, 0362, 0166, 0221, 0131, 0241, 0354,
+ 0052, 0260, 0107, 0330, 0023, 0321, 0054, 0232, 0033, 0061, 0143, 0245, 0372, 0322, 0261, 0113,
+ 0125, 0270, 0007, 0133, 0177, 0326, 0054, 0354, 0334, 0213, 0004, 0205, 0126, 0056, 0302, 0124,
+ 0250, 0025, 0035, 0353, 0337, 0220, 0251, 0027, 0115, 0377, 0314, 0025, 0354, 0120, 0257, 0375,
+ 0274, 0015, 0350, 0157, 0325, 0013, 0375, 0073, 0046, 0000, 0257, 0075, 0154, 0223, 0300, 0006,
+ 0011, 0130, 0045, 0006, 0132, 0173, 0041, 0001, 0247, 0244, 0264, 0253, 0042, 0160, 0072, 0075,
+ 0221, 0122, 0021, 0011, 0101, 0220, 0201, 0125, 0312, 0300, 0122, 0226, 0273, 0226, 0022, 0261,
+ 0005, 0022, 0261, 0336, 0111, 0177, 0076, 0003, 0161, 0130, 0045, 0000, 0332, 0173, 0041, 0016,
+ 0005, 0035, 0355, 0252, 0054, 0024, 0163, 0003, 0101, 0270, 0036, 0101, 0130, 0174, 0255, 0153,
+ 0051, 0005, 0333, 0265, 0226, 0202, 0312, 0111, 0146, 0257, 0322, 0155, 0254, 0104, 0231, 0270,
+ 0223, 0147, 0365, 0004, 0277, 0333, 0215, 0133, 0137, 0052, 0313, 0041, 0224, 0167, 0212, 0344,
+ 0224, 0174, 0125, 0034, 0246, 0132, 0215, 0132, 0015, 0210, 0365, 0210, 0075, 0331, 0270, 0025,
+ 0204, 0237, 0040, 0374, 0004, 0341, 0047, 0010, 0077, 0101, 0370, 0011, 0314, 0155, 0160, 0100,
+ 0203, 0003, 0272, 0072, 0213, 0073, 0322, 0113, 0040, 0010, 0013, 0166, 0067, 0004, 0141, 0167,
+ 0077, 0010, 0233, 0204, 0177, 0010, 0101, 0001, 0007, 0200, 0020, 0024, 0204, 0240, 0040, 0004,
+ 0005, 0012, 0361, 0236, 0207, 0240, 0042, 0201, 0010, 0101, 0050, 0020, 0205, 0020, 0204, 0202,
+ 0040, 0324, 0076, 0004, 0241, 0042, 0216, 0007, 0141, 0250, 0065, 0204, 0241, 0132, 0233, 0016,
+ 0103, 0135, 0213, 0272, 0300, 0116, 0140, 0103, 0040, 0012, 0002, 0121, 0020, 0210, 0202, 0100,
+ 0024, 0004, 0242, 0300, 0350, 0206, 0100, 0024, 0004, 0242, 0066, 0157, 0167, 0317, 0064, 0023,
+ 0010, 0105, 0201, 0365, 0015, 0241, 0250, 0175, 0014, 0105, 0315, 0070, 0000, 0004, 0243, 0200,
+ 0007, 0100, 0060, 0012, 0202, 0121, 0020, 0214, 0002, 0245, 0170, 0317, 0203, 0121, 0063, 0221,
+ 0010, 0341, 0050, 0020, 0206, 0020, 0216, 0202, 0160, 0324, 0356, 0204, 0243, 0144, 0353, 0340,
+ 0345, 0360, 0107, 0115, 0171, 0046, 0004, 0264, 0326, 0020, 0320, 0152, 0157, 0074, 0240, 0245,
+ 0133, 0226, 0156, 0022, 0210, 0150, 0101, 0104, 0013, 0042, 0132, 0020, 0321, 0202, 0210, 0026,
+ 0130, 0356, 0020, 0321, 0202, 0210, 0126, 0055, 0214, 0367, 0231, 0152, 0002, 0041, 0055, 0260,
+ 0340, 0041, 0244, 0265, 0227, 0041, 0255, 0031, 0013, 0200, 0230, 0026, 0060, 0001, 0210, 0151,
+ 0101, 0114, 0013, 0142, 0132, 0240, 0026, 0357, 0173, 0114, 0153, 0046, 0023, 0041, 0250, 0005,
+ 0322, 0020, 0202, 0132, 0020, 0324, 0332, 0235, 0240, 0126, 0212, 0113, 0151, 0306, 0364, 0040,
+ 0052, 0265, 0206, 0250, 0324, 0121, 0245, 0121, 0251, 0204, 0020, 0114, 0053, 0046, 0004, 0043,
+ 0035, 0176, 0251, 0305, 0305, 0125, 0231, 0227, 0316, 0045, 0065, 0344, 0363, 0127, 0213, 0263,
+ 0224, 0021, 0253, 0111, 0011, 0222, 0255, 0254, 0372, 0031, 0265, 0107, 0224, 0253, 0031, 0303,
+ 0120, 0206, 0054, 0050, 0043, 0263, 0007, 0333, 0300, 0135, 0324, 0064, 0202, 0327, 0255, 0303,
+ 0053, 0061, 0261, 0204, 0176, 0030, 0337, 0120, 0023, 0144, 0233, 0335, 0226, 0060, 0154, 0047,
+ 0063, 0056, 0361, 0064, 0271, 0014, 0252, 0170, 0252, 0334, 0164, 0166, 0170, 0065, 0127, 0343,
+ 0171, 0252, 0100, 0276, 0346, 0163, 0246, 0236, 0334, 0076, 0172, 0246, 0310, 0137, 0263, 0224,
+ 0207, 0142, 0156, 0265, 0002, 0346, 0103, 0212, 0302, 0220, 0041, 0367, 0345, 0200, 0072, 0275,
+ 0006, 0172, 0021, 0242, 0375, 0317, 0247, 0303, 0253, 0065, 0343, 0063, 0157, 0163, 0251, 0353,
+ 0236, 0223, 0361, 0355, 0027, 0353, 0100, 0355, 0326, 0351, 0002, 0266, 0215, 0155, 0023, 0206,
+ 0316, 0306, 0272, 0163, 0237, 0355, 0356, 0057, 0227, 0213, 0251, 0331, 0064, 0373, 0036, 0312,
+ 0377, 0274, 0273, 0216, 0226, 0164, 0047, 0305, 0312, 0335, 0320, 0264, 0310, 0045, 0343, 0025,
+ 0363, 0353, 0366, 0366, 0360, 0353, 0344, 0313, 0336, 0267, 0300, 0052, 0170, 0127, 0206, 0125,
+ 0020, 0067, 0231, 0370, 0211, 0274, 0036, 0312, 0354, 0126, 0135, 0245, 0353, 0202, 0357, 0210,
+ 0145, 0251, 0135, 0304, 0073, 0277, 0135, 0071, 0141, 0241, 0142, 0346, 0372, 0152, 0236, 0211,
+ 0327, 0241, 0277, 0262, 0341, 0031, 0141, 0026, 0036, 0351, 0136, 0043, 0371, 0272, 0356, 0113,
+ 0254, 0163, 0132, 0071, 0135, 0170, 0147, 0103, 0227, 0166, 0373, 0143, 0156, 0243, 0030, 0342,
+ 0016, 0172, 0155, 0024, 0351, 0030, 0311, 0237, 0133, 0231, 0143, 0043, 0375, 0216, 0351, 0070,
+ 0261, 0261, 0321, 0113, 0246, 0223, 0105, 0302, 0124, 0247, 0112, 0354, 0050, 0231, 0055, 0027,
+ 0346, 0377, 0111, 0074, 0177, 0025, 0121, 0053, 0260, 0213, 0271, 0020, 0174, 0145, 0023, 0276,
+ 0142, 0047, 0230, 0152, 0217, 0325, 0356, 0204, 0112, 0263, 0260, 0211, 0106, 0035, 0055, 0024,
+ 0072, 0212, 0273, 0250, 0246, 0316, 0255, 0266, 0266, 0010, 0276, 0113, 0317, 0065, 0135, 0345,
+ 0035, 0156, 0340, 0276, 0020, 0211, 0130, 0121, 0331, 0226, 0201, 0057, 0356, 0165, 0167, 0051,
+ 0267, 0305, 0262, 0146, 0031, 0057, 0043, 0222, 0045, 0113, 0274, 0153, 0146, 0105, 0302, 0337,
+ 0025, 0221, 0360, 0231, 0064, 0230, 0310, 0022, 0027, 0037, 0254, 0022, 0145, 0307, 0024, 0221,
+ 0057, 0233, 0053, 0253, 0221, 0111, 0163, 0246, 0373, 0343, 0205, 0337, 0246, 0275, 0275, 0136,
+ 0113, 0327, 0025, 0253, 0330, 0152, 0056, 0374, 0357, 0365, 0152, 0256, 0260, 0067, 0206, 0135,
+ 0215, 0070, 0206, 0207, 0243, 0216, 0133, 0331, 0115, 0134, 0375, 0036, 0057, 0067, 0131, 0156,
+ 0221, 0076, 0063, 0101, 0034, 0363, 0071, 0205, 0177, 0305, 0177, 0046, 0025, 0156, 0252, 0014,
+ 0157, 0231, 0170, 0342, 0107, 0325, 0343, 0346, 0366, 0362, 0310, 0316, 0254, 0320, 0255, 0277,
+ 0131, 0001, 0224, 0314, 0223, 0177, 0206, 0343, 0223, 0351, 0103, 0240, 0054, 0160, 0070, 0104,
+ 0054, 0342, 0244, 0015, 0167, 0005, 0034, 0306, 0034, 0034, 0241, 0073, 0107, 0147, 0130, 0022,
+ 0035, 0071, 0011, 0377, 0073, 0161, 0114, 0372, 0064, 0337, 0206, 0351, 0337, 0071, 0167, 0135,
+ 0325, 0322, 0136, 0345, 0205, 0076, 0371, 0123, 0017, 0267, 0130, 0352, 0003, 0134, 0252, 0061,
+ 0217, 0116, 0264, 0047, 0302, 0306, 0232, 0253, 0173, 0041, 0076, 0144, 0076, 0104, 0014, 0041,
+ 0176, 0006, 0214, 0032, 0017, 0276, 0046, 0376, 0070, 0164, 0235, 0373, 0114, 0354, 0076, 0160,
+ 0153, 0133, 0240, 0321, 0323, 0306, 0044, 0361, 0113, 0031, 0224, 0277, 0354, 0303, 0334, 0010,
+ 0205, 0313, 0034, 0351, 0111, 0150, 0203, 0205, 0142, 0254, 0324, 0142, 0104, 0271, 0250, 0267,
+ 0023, 0374, 0324, 0257, 0333, 0120, 0217, 0360, 0055, 0324, 0043, 0265, 0230, 0213, 0050, 0106,
+ 0014, 0335, 0222, 0151, 0070, 0322, 0175, 0054, 0260, 0246, 0315, 0265, 0152, 0156, 0121, 0044,
+ 0053, 0215, 0113, 0062, 0145, 0071, 0116, 0320, 0112, 0212, 0023, 0110, 0305, 0010, 0066, 0252,
+ 0116, 0112, 0305, 0005, 0362, 0354, 0123, 0254, 0177, 0150, 0146, 0047, 0051, 0051, 0073, 0052,
+ 0001, 0210, 0242, 0301, 0007, 0331, 0303, 0112, 0003, 0227, 0070, 0213, 0376, 0114, 0301, 0007,
+ 0303, 0337, 0142, 0335, 0231, 0125, 0104, 0200, 0124, 0233, 0146, 0272, 0376, 0206, 0143, 0214,
+ 0134, 0352, 0261, 0073, 0312, 0025, 0104, 0144, 0360, 0011, 0105, 0272, 0377, 0241, 0312, 0127,
+ 0344, 0075, 0200, 0371, 0275, 0177, 0151, 0044, 0334, 0072, 0316, 0321, 0162, 0106, 0307, 0252,
+ 0215, 0027, 0022, 0050, 0336, 0253, 0264, 0174, 0042, 0046, 0227, 0075, 0306, 0130, 0367, 0174,
+ 0325, 0246, 0211, 0273, 0327, 0074, 0154, 0052, 0071, 0117, 0044, 0223, 0067, 0162, 0045, 0155,
+ 0374, 0057, 0376, 0077, 0225, 0116, 0137, 0245, 0150, 0230, 0344, 0236, 0060, 0137, 0275, 0003,
+ 0041, 0140, 0105, 0300, 0151, 0370, 0371, 0147, 0357, 0352, 0372, 0166, 0370, 0363, 0262, 0167,
+ 0065, 0374, 0171, 0325, 0377, 0331, 0375, 0332, 0377, 0337, 0075, 0364, 0177, 0320, 0312, 0223,
+ 0253, 0256, 0312, 0127, 0364, 0005, 0345, 0176, 0131, 0331, 0127, 0202, 0260, 0105, 0354, 0221,
+ 0346, 0011, 0055, 0055, 0064, 0003, 0124, 0332, 0106, 0053, 0223, 0341, 0125, 0174, 0335, 0310,
+ 0011, 0154, 0354, 0021, 0043, 0213, 0143, 0354, 0324, 0155, 0176, 0033, 0361, 0344, 0051, 0065,
+ 0051, 0301, 0225, 0047, 0241, 0230, 0034, 0155, 0257, 0142, 0122, 0225, 0344, 0176, 0055, 0265,
+ 0223, 0102, 0220, 0165, 0220, 0331, 0112, 0141, 0307, 0102, 0041, 0307, 0342, 0341, 0306, 0012,
+ 0103, 0215, 0033, 0121, 0062, 0024, 0002, 0333, 0073, 0220, 0303, 0226, 0035, 0116, 0334, 0352,
+ 0344, 0265, 0112, 0302, 0206, 0045, 0113, 0314, 0126, 0075, 0357, 0277, 0125, 0165, 0336, 0226,
+ 0320, 0313, 0066, 0111, 0357, 0026, 0004, 0342, 0040, 0020, 0367, 0132, 0262, 0161, 0265, 0002,
+ 0242, 0160, 0020, 0205, 0113, 0216, 0302, 0315, 0242, 0027, 0020, 0202, 0053, 0024, 0211, 0230,
+ 0007, 0252, 0056, 0211, 0317, 0207, 0072, 0251, 0147, 0254, 0152, 0141, 0160, 0141, 0070, 0150,
+ 0331, 0340, 0200, 0210, 0325, 0132, 0043, 0126, 0323, 0315, 0050, 0065, 0150, 0065, 0145, 0037,
+ 0132, 0350, 0330, 0153, 0234, 0374, 0275, 0175, 0054, 0333, 0142, 0214, 0311, 0375, 0230, 0363,
+ 0235, 0017, 0331, 0061, 0135, 0271, 0370, 0123, 0006, 0141, 0016, 0014, 0217, 0132, 0026, 0066,
+ 0143, 0126, 0344, 0325, 0243, 0152, 0010, 0124, 0266, 0311, 0122, 0111, 0055, 0342, 0110, 0005,
+ 0202, 0070, 0163, 0264, 0364, 0211, 0346, 0207, 0363, 0010, 0353, 0112, 0045, 0303, 0101, 0102,
+ 0334, 0175, 0043, 0370, 0111, 0370, 0303, 0067, 0252, 0163, 0310, 0234, 0122, 0171, 0211, 0076,
+ 0035, 0355, 0367, 0051, 0025, 0271, 0162, 0142, 0352, 0365, 0327, 0216, 0166, 0265, 0376, 0332,
+ 0232, 0312, 0247, 0055, 0061, 0031, 0301, 0276, 0006, 0023, 0173, 0104, 0255, 0055, 0110, 0310,
+ 0206, 0202, 0010, 0151, 0333, 0235, 0236, 0060, 0014, 0275, 0103, 0357, 0133, 0325, 0073, 0234,
+ 0330, 0312, 0322, 0026, 0353, 0177, 0116, 0113, 0052, 0301, 0044, 0161, 0340, 0105, 0032, 0333,
+ 0104, 0150, 0016, 0016, 0303, 0316, 0134, 0251, 0127, 0257, 0174, 0054, 0376, 0324, 0357, 0271,
+ 0075, 0244, 0071, 0072, 0013, 0074, 0335, 0172, 0351, 0253, 0012, 0361, 0074, 0364, 0060, 0026,
+ 0132, 0356, 0222, 0204, 0176, 0371, 0161, 0273, 0252, 0166, 0170, 0230, 0172, 0034, 0366, 0172,
+ 0241, 0161, 0214, 0205, 0015, 0241, 0371, 0334, 0132, 0065, 0042, 0357, 0156, 0336, 0216, 0260,
+ 0043, 0006, 0242, 0335, 0163, 0175, 0120, 0023, 0326, 0061, 0237, 0330, 0210, 0262, 0161, 0201,
+ 0256, 0030, 0337, 0226, 0131, 0127, 0171, 0107, 0065, 0063, 0266, 0205, 0273, 0314, 0347, 0134,
+ 0203, 0167, 0073, 0365, 0232, 0111, 0367, 0030, 0171, 0155, 0211, 0210, 0236, 0161, 0373, 0135,
+ 0013, 0377, 0344, 0326, 0332, 0174, 0305, 0322, 0116, 0231, 0305, 0022, 0340, 0340, 0245, 0155,
+ 0352, 0231, 0262, 0164, 0322, 0316, 0173, 0234, 0254, 0216, 0074, 0277, 0265, 0126, 0236, 0277,
+ 0067, 0065, 0247, 0225, 0353, 0030, 0154, 0322, 0160, 0132, 0250, 0254, 0064, 0063, 0234, 0102,
+ 0233, 0151, 0127, 0113, 0052, 0165, 0220, 0057, 0014, 0103, 0344, 0207, 0263, 0074, 0334, 0205,
+ 0232, 0112, 0107, 0265, 0255, 0251, 0024, 0221, 0022, 0224, 0025, 0254, 0151, 0125, 0265, 0305,
+ 0004, 0245, 0051, 0370, 0057, 0060, 0063, 0306, 0347, 0174, 0023, 0223, 0253, 0045, 0324, 0025,
+ 0372, 0312, 0225, 0023, 0012, 0247, 0062, 0225, 0227, 0322, 0224, 0233, 0235, 0235, 0323, 0047,
+ 0307, 0242, 0272, 0211, 0114, 0376, 0063, 0272, 0363, 0250, 0215, 0176, 0350, 0143, 0112, 0377,
+ 0202, 0056, 0210, 0243, 0157, 0274, 0150, 0034, 0166, 0314, 0174, 0334, 0115, 0322, 0071, 0133,
+ 0364, 0330, 0200, 0074, 0172, 0144, 0335, 0216, 0163, 0000, 0061, 0047, 0313, 0357, 0130, 0012,
+ 0222, 0312, 0361, 0077, 0252, 0306, 0356, 0076, 0141, 0206, 0304, 0054, 0363, 0366, 0234, 0243,
+ 0224, 0247, 0144, 0152, 0130, 0351, 0051, 0142, 0051, 0135, 0372, 0154, 0302, 0267, 0152, 0326,
+ 0235, 0103, 0075, 0133, 0267, 0162, 0164, 0363, 0024, 0131, 0336, 0205, 0373, 0171, 0324, 0075,
+ 0242, 0073, 0252, 0035, 0311, 0124, 0321, 0220, 0021, 0256, 0231, 0266, 0123, 0134, 0200, 0326,
+ 0054, 0243, 0242, 0006, 0070, 0320, 0301, 0325, 0012, 0216, 0134, 0271, 0072, 0060, 0352, 0106,
+ 0175, 0374, 0044, 0245, 0222, 0051, 0367, 0040, 0021, 0061, 0112, 0050, 0214, 0023, 0221, 0221,
+ 0102, 0040, 0316, 0210, 0046, 0112, 0312, 0225, 0134, 0204, 0140, 0224, 0334, 0237, 0350, 0004,
+ 0135, 0173, 0364, 0221, 0230, 0330, 0104, 0243, 0211, 0204, 0242, 0127, 0070, 0153, 0022, 0322,
+ 0364, 0326, 0224, 0246, 0267, 0220, 0270, 0005, 0371, 0166, 0313, 0371, 0166, 0224, 0361, 0141,
+ 0372, 0065, 0315, 0267, 0233, 0017, 0016, 0312, 0103, 0154, 0066, 0331, 0056, 0332, 0211, 0315,
+ 0126, 0210, 0230, 0231, 0275, 0141, 0361, 0202, 0254, 0227, 0123, 0043, 0210, 0305, 0153, 0117,
+ 0054, 0345, 0011, 0152, 0055, 0325, 0064, 0101, 0231, 0026, 0165, 0057, 0157, 0221, 0020, 0161,
+ 0170, 0267, 0020, 0161, 0310, 0214, 0062, 0354, 0176, 0015, 0214, 0350, 0064, 0173, 0236, 0252,
+ 0031, 0162, 0215, 0226, 0022, 0346, 0132, 0122, 0225, 0066, 0136, 0337, 0332, 0251, 0324, 0112,
+ 0052, 0144, 0222, 0171, 0236, 0365, 0135, 0034, 0265, 0110, 0307, 0245, 0066, 0172, 0134, 0144,
+ 0171, 0301, 0233, 0212, 0307, 0140, 0263, 0163, 0033, 0145, 0317, 0277, 0166, 0174, 0227, 0377,
+ 0040, 0173, 0243, 0356, 0106, 0262, 0100, 0313, 0272, 0212, 0227, 0006, 0154, 0357, 0216, 0170,
+ 0162, 0351, 0145, 0346, 0311, 0074, 0231, 0204, 0355, 0216, 0313, 0073, 0121, 0172, 0306, 0074,
+ 0113, 0265, 0067, 0045, 0377, 0343, 0326, 0336, 0140, 0320, 0134, 0357, 0275, 0332, 0000, 0170,
+ 0000, 0074, 0000, 0176, 0223, 0200, 0157, 0001, 0340, 0001, 0360, 0000, 0370, 0375, 0001, 0174,
+ 0173, 0275, 0200, 0117, 0042, 0335, 0132, 0100, 0375, 0071, 0233, 0354, 0344, 0111, 0356, 0077,
+ 0125, 0272, 0221, 0246, 0265, 0375, 0050, 0344, 0001, 0162, 0002, 0344, 0304, 0106, 0344, 0304,
+ 0305, 0116, 0013, 0211, 0066, 0240, 0035, 0320, 0016, 0150, 0177, 0101, 0373, 0015, 0240, 0275,
+ 0006, 0066, 0140, 0255, 0125, 0302, 0161, 0132, 0100, 0056, 0247, 0214, 0041, 0326, 0372, 0152,
+ 0233, 0036, 0155, 0011, 0313, 0337, 0067, 0042, 0230, 0246, 0153, 0324, 0237, 0016, 0200, 0031,
+ 0124, 0112, 0007, 0377, 0012, 0010, 0253, 0077, 0021, 0200, 0223, 0240, 0122, 0042, 0310, 0316,
+ 0205, 0257, 0013, 0041, 0034, 0201, 0041, 0000, 0206, 0300, 0356, 0031, 0002, 0347, 0140, 0010,
+ 0000, 0332, 0001, 0355, 0020, 0014, 0332, 0363, 0140, 0020, 0000, 0036, 0000, 0277, 0203, 0200,
+ 0377, 0027, 0210, 0167, 0260, 0352, 0040, 0364, 0133, 0122, 0350, 0027, 0074, 0102, 0100, 0066,
+ 0300, 0155, 0200, 0154, 0326, 0103, 0066, 0107, 0233, 0275, 0143, 0115, 0116, 0257, 0316, 0301,
+ 0056, 0163, 0336, 0231, 0126, 0377, 0273, 0106, 0244, 0374, 0243, 0052, 0276, 0121, 0007, 0173,
+ 0272, 0125, 0306, 0035, 0045, 0257, 0252, 0144, 0214, 0250, 0145, 0346, 0277, 0226, 0144, 0175,
+ 0004, 0124, 0345, 0245, 0173, 0057, 0207, 0224, 0336, 0303, 0041, 0045, 0070, 0244, 0004, 0106,
+ 0054, 0170, 0255, 0340, 0220, 0022, 0000, 0036, 0000, 0017, 0200, 0207, 0103, 0112, 0000, 0170,
+ 0000, 0074, 0000, 0176, 0037, 0017, 0051, 0001, 0340, 0001, 0360, 0000, 0170, 0010, 0104, 0003,
+ 0340, 0001, 0360, 0000, 0370, 0265, 0000, 0376, 0035, 0000, 0036, 0000, 0017, 0200, 0337, 0037,
+ 0300, 0037, 0003, 0340, 0001, 0360, 0273, 0007, 0370, 0056, 0244, 0232, 0201, 0213, 0036, 0320,
+ 0276, 0047, 0150, 0037, 0000, 0332, 0301, 0077, 0017, 0150, 0337, 0023, 0264, 0237, 0002, 0332,
+ 0301, 0071, 0017, 0150, 0337, 0027, 0323, 0035, 0320, 0016, 0236, 0171, 0100, 0373, 0236, 0240,
+ 0275, 0007, 0150, 0007, 0267, 0074, 0240, 0175, 0117, 0320, 0176, 0015, 0150, 0257, 0201, 0117,
+ 0176, 0337, 0312, 0374, 0164, 0115, 0302, 0266, 0341, 0254, 0026, 0324, 0214, 0253, 0047, 0375,
+ 0014, 0260, 0021, 0170, 0204, 0021, 0354, 0357, 0064, 0025, 0301, 0371, 0342, 0112, 0251, 0350,
+ 0064, 0260, 0054, 0102, 0235, 0235, 0046, 0041, 0070, 0153, 0134, 0051, 0011, 0235, 0351, 0376,
+ 0170, 0247, 0351, 0347, 0010, 0350, 0247, 0112, 0372, 0351, 0134, 0367, 0166, 0232, 0174, 0336,
+ 0001, 0371, 0124, 0111, 0076, 0327, 0036, 0276, 0303, 0036, 0166, 0214, 0035, 0127, 0204, 0300,
+ 0034, 0203, 0212, 0031, 0140, 0205, 0001, 0331, 0254, 0207, 0154, 0300, 0354, 0002, 0262, 0001,
+ 0123, 0013, 0310, 0146, 0075, 0144, 0003, 0026, 0026, 0220, 0015, 0130, 0126, 0100, 0066, 0353,
+ 0041, 0233, 0343, 0032, 0025, 0221, 0153, 0155, 0276, 0210, 0134, 0102, 0015, 0260, 0043, 0250,
+ 0001, 0066, 0001, 0017, 0214, 0324, 0355, 0105, 0330, 0162, 0041, 0222, 0011, 0171, 0057, 0220,
+ 0367, 0262, 0135, 0171, 0057, 0227, 0220, 0367, 0002, 0150, 0007, 0264, 0357, 0011, 0332, 0077,
+ 0003, 0332, 0341, 0164, 0032, 0240, 0175, 0117, 0320, 0336, 0001, 0264, 0303, 0351, 0064, 0100,
+ 0373, 0236, 0240, 0035, 0012, 0313, 0200, 0062, 0017, 0200, 0007, 0300, 0003, 0340, 0101, 0237,
+ 0007, 0300, 0003, 0340, 0241, 0032, 0064, 0244, 0327, 0226, 0025, 0334, 0241, 0354, 0001, 0117,
+ 0340, 0214, 0021, 0220, 0120, 0176, 0137, 0304, 0050, 0113, 0164, 0300, 0011, 0043, 0110, 0104,
+ 0201, 0334, 0154, 0040, 0033, 0040, 0033, 0020, 0127, 0100, 0066, 0165, 0316, 0315, 0056, 0051,
+ 0355, 0255, 0015, 0167, 0247, 0256, 0375, 0356, 0324, 0113, 0342, 0063, 0352, 0115, 0320, 0167,
+ 0342, 0160, 0243, 0176, 0217, 0257, 0120, 0155, 0257, 0043, 0175, 0262, 0015, 0351, 0223, 0220,
+ 0076, 0051, 0171, 0247, 0061, 0103, 0347, 0374, 0027, 0110, 0241, 0004, 0023, 0073, 0267, 0173,
+ 0320, 0242, 0152, 0143, 0000, 0037, 0015, 0370, 0365, 0301, 0257, 0277, 0171, 0277, 0376, 0071,
+ 0344, 0351, 0100, 0330, 0036, 0320, 0276, 0057, 0121, 0074, 0100, 0073, 0310, 0166, 0100, 0073,
+ 0304, 0354, 0041, 0053, 0017, 0000, 0017, 0200, 0007, 0300, 0103, 0126, 0036, 0204, 0254, 0040,
+ 0144, 0005, 0136, 0103, 0040, 0233, 0332, 0005, 0310, 0067, 0031, 0241, 0072, 0202, 0110, 0147,
+ 0221, 0110, 0347, 0102, 0111, 0320, 0235, 0212, 0166, 0266, 0152, 0033, 0355, 0174, 0007, 0321,
+ 0116, 0210, 0166, 0312, 0135, 0133, 0060, 0246, 0117, 0350, 0314, 0242, 0306, 0203, 0017, 0001,
+ 0117, 0010, 0170, 0026, 0042, 0243, 0236, 0143, 0022, 0003, 0356, 0277, 0000, 0072, 0052, 0226,
+ 0174, 0061, 0230, 0330, 0134, 0230, 0373, 0220, 0241, 0016, 0144, 0004, 0371, 0027, 0160, 0323,
+ 0047, 0270, 0154, 0367, 0310, 0145, 0373, 0137, 0020, 0221, 0205, 0000, 0015, 0240, 0175, 0117,
+ 0320, 0376, 0157, 0100, 0073, 0344, 0137, 0000, 0332, 0367, 0004, 0355, 0003, 0100, 0073, 0324,
+ 0100, 0003, 0264, 0103, 0156, 0345, 0076, 0243, 0035, 0354, 0166, 0100, 0073, 0244, 0132, 0101,
+ 0156, 0045, 0000, 0036, 0000, 0017, 0200, 0207, 0334, 0112, 0000, 0074, 0000, 0036, 0000, 0277,
+ 0325, 0200, 0007, 0003, 0036, 0000, 0017, 0200, 0337, 0043, 0300, 0303, 0365, 0250, 0220, 0006,
+ 0017, 0051, 0210, 0100, 0066, 0133, 0164, 0172, 0002, 0310, 0006, 0312, 0013, 0002, 0331, 0000,
+ 0331, 0254, 0107, 0267, 0331, 0344, 0371, 0032, 0070, 0253, 0125, 0350, 0254, 0126, 0237, 0215,
+ 0261, 0067, 0075, 0245, 0345, 0357, 0306, 0061, 0255, 0166, 0155, 0217, 0151, 0301, 0235, 0336,
+ 0160, 0114, 0113, 0016, 0226, 0027, 0304, 0302, 0160, 0076, 0013, 0016, 0104, 0344, 0245, 0237,
+ 0376, 0147, 0070, 0225, 0005, 0324, 0003, 0307, 0151, 0300, 0207, 0017, 0076, 0174, 0110, 0302,
+ 0203, 0224, 0133, 0100, 0073, 0240, 0175, 0347, 0320, 0336, 0007, 0264, 0103, 0102, 0016, 0240,
+ 0175, 0117, 0320, 0176, 0001, 0150, 0207, 0174, 0133, 0100, 0073, 0144, 0343, 0100, 0202, 0075,
+ 0000, 0036, 0000, 0017, 0200, 0207, 0004, 0173, 0000, 0074, 0000, 0036, 0000, 0017, 0011, 0366,
+ 0220, 0312, 0004, 0251, 0114, 0020, 0122, 0006, 0262, 0201, 0130, 0062, 0220, 0015, 0134, 0347,
+ 0275, 0221, 0304, 0111, 0327, 0322, 0015, 0074, 0246, 0226, 0211, 0275, 0267, 0025, 0264, 0134,
+ 0136, 0250, 0245, 0207, 0121, 0227, 0110, 0150, 0264, 0174, 0202, 0204, 0131, 0170, 0244, 0173,
+ 0057, 0000, 0133, 0005, 0340, 0045, 0326, 0371, 0247, 0116, 0027, 0336, 0311, 0001, 0276, 0074,
+ 0240, 0133, 0125, 0305, 0271, 0042, 0156, 0210, 0124, 0013, 0155, 0024, 0060, 0106, 0235, 0224,
+ 0317, 0255, 0314, 0261, 0261, 0145, 0151, 0253, 0051, 0367, 0242, 0123, 0366, 0200, 0047, 0245,
+ 0344, 0236, 0336, 0121, 0207, 0151, 0046, 0366, 0215, 0227, 0364, 0323, 0376, 0363, 0344, 0036,
+ 0073, 0332, 0200, 0177, 0025, 0265, 0232, 0371, 0023, 0121, 0163, 0345, 0016, 0177, 0305, 0116,
+ 0160, 0072, 0335, 0331, 0112, 0167, 0102, 0245, 0131, 0330, 0104, 0243, 0016, 0247, 0074, 0142,
+ 0074, 0250, 0246, 0203, 0142, 0003, 0223, 0107, 0354, 0363, 0105, 0276, 0323, 0003, 0213, 0251,
+ 0175, 0332, 0303, 0026, 0301, 0167, 0215, 0023, 0207, 0072, 0322, 0155, 0134, 0352, 0006, 0356,
+ 0013, 0221, 0210, 0025, 0225, 0155, 0031, 0160, 0134, 0361, 0326, 0364, 0021, 0173, 0131, 0263,
+ 0214, 0027, 0335, 0361, 0214, 0051, 0131, 0001, 0320, 0015, 0003, 0133, 0330, 0323, 0031, 0365,
+ 0020, 0037, 0054, 0137, 0352, 0006, 0362, 0271, 0205, 0256, 0133, 0174, 0263, 0304, 0142, 0143,
+ 0263, 0201, 0154, 0152, 0222, 0073, 0202, 0075, 0101, 0041, 0347, 0237, 0177, 0236, 0365, 0257,
+ 0206, 0067, 0375, 0057, 0077, 0277, 0166, 0006, 0237, 0227, 0251, 0063, 0223, 0006, 0023, 0131,
+ 0342, 0342, 0203, 0170, 0242, 0154, 0040, 0142, 0176, 0154, 0174, 0325, 0211, 0323, 0065, 0011,
+ 0013, 0177, 0231, 0366, 0242, 0102, 0230, 0252, 0254, 0141, 0171, 0231, 0343, 0107, 0326, 0143,
+ 0330, 0136, 0035, 0335, 0000, 0033, 0201, 0107, 0330, 0144, 0323, 0034, 0073, 0231, 0211, 0375,
+ 0234, 0016, 0221, 0304, 0227, 0303, 0217, 0243, 0315, 0300, 0341, 0204, 0145, 0021, 0047, 0155,
+ 0314, 0053, 0044, 0345, 0317, 0111, 0112, 0067, 0030, 0171, 0324, 0031, 0226, 0244, 0251, 0114,
+ 0011, 0232, 0147, 0143, 0116, 0003, 0313, 0042, 0113, 0354, 0255, 0156, 0373, 0062, 0035, 0141,
+ 0245, 0233, 0062, 0252, 0327, 0246, 0234, 0351, 0376, 0270, 0306, 0073, 0042, 0206, 0127, 0351,
+ 0166, 0030, 0233, 0330, 0216, 0001, 0166, 0365, 0160, 0014, 0057, 0373, 0262, 0326, 0035, 0250,
+ 0204, 0220, 0072, 0327, 0275, 0372, 0322, 0121, 0347, 0372, 0147, 0257, 0122, 0062, 0042, 0365,
+ 0102, 0265, 0270, 0124, 0253, 0306, 0250, 0136, 0270, 0363, 0253, 0322, 0135, 0161, 0313, 0337,
+ 0025, 0025, 0175, 0111, 0234, 0313, 0251, 0257, 0276, 0064, 0033, 0335, 0045, 0361, 0371, 0202,
+ 0325, 0130, 0135, 0012, 0007, 0370, 0323, 0233, 0124, 0112, 0052, 0036, 0310, 0201, 0142, 0254,
+ 0147, 0106, 0116, 0377, 0012, 0010, 0253, 0061, 0353, 0021, 0303, 0253, 0224, 0220, 0376, 0330,
+ 0054, 0317, 0271, 0304, 0226, 0133, 0137, 0236, 0063, 0033, 0335, 0324, 0102, 0257, 0061, 0317,
+ 0241, 0354, 0147, 0222, 0243, 0251, 0064, 0122, 0171, 0250, 0207, 0322, 0060, 0333, 0224, 0316,
+ 0210, 0006, 0165, 0206, 0156, 0070, 0276, 0112, 0067, 0104, 0137, 0067, 0166, 0073, 0256, 0153,
+ 0021, 0103, 0147, 0334, 0350, 0214, 0116, 0325, 0317, 0167, 0145, 0372, 0167, 0271, 0060, 0226,
+ 0171, 0175, 0352, 0255, 0323, 0236, 0210, 0311, 0270, 0151, 0370, 0353, 0207, 0143, 0331, 0026,
+ 0343, 0350, 0064, 0377, 0311, 0257, 0355, 0314, 0046, 0304, 0020, 0216, 0200, 0001, 0023, 0127,
+ 0113, 0152, 0342, 0217, 0103, 0327, 0271, 0317, 0152, 0024, 0372, 0300, 0155, 0116, 0251, 0241,
+ 0317, 0076, 0027, 0113, 0032, 0030, 0036, 0265, 0054, 0154, 0056, 0255, 0156, 0331, 0304, 0056,
+ 0333, 0144, 0051, 0275, 0206, 0070, 0311, 0276, 0374, 0164, 0317, 0361, 0067, 0202, 0237, 0134,
+ 0352, 0261, 0215, 0172, 0360, 0343, 0275, 0242, 0313, 0245, 0015, 0132, 0111, 0245, 0015, 0244,
+ 0313, 0033, 0154, 0056, 0366, 0251, 0220, 0335, 0164, 0112, 0237, 0267, 0041, 0267, 0211, 0172,
+ 0004, 0073, 0054, 0344, 0075, 0215, 0223, 0107, 0376, 0200, 0063, 0242, 0354, 0034, 0243, 0304,
+ 0165, 0210, 0137, 0213, 0033, 0374, 0210, 0165, 0316, 0143, 0347, 0174, 0055, 0274, 0116, 0366,
+ 0345, 0347, 0244, 0236, 0012, 0256, 0125, 0031, 0353, 0025, 0033, 0022, 0025, 0142, 0211, 0210,
+ 0045, 0233, 0242, 0326, 0267, 0210, 0311, 0205, 0215, 0133, 0260, 0063, 0063, 0360, 0246, 0033,
+ 0161, 0324, 0154, 0346, 0351, 0313, 0013, 0027, 0124, 0013, 0167, 0107, 0141, 0211, 0122, 0167,
+ 0063, 0006, 0301, 0107, 0063, 0004, 0267, 0142, 0020, 0054, 0201, 0346, 0145, 0052, 0110, 0000,
+ 0170, 0251, 0124, 0120, 0026, 0045, 0304, 0016, 0146, 0232, 0123, 0051, 0223, 0137, 0227, 0162,
+ 0044, 0037, 0077, 0273, 0272, 0143, 0052, 0116, 0051, 0163, 0347, 0362, 0344, 0253, 0126, 0262,
+ 0372, 0145, 0356, 0100, 0241, 0222, 0006, 0225, 0154, 0104, 0301, 0214, 0133, 0245, 0014, 0334,
+ 0264, 0120, 0150, 0176, 0042, 0121, 0025, 0142, 0225, 0021, 0111, 0331, 0204, 0122, 0232, 0320,
+ 0313, 0277, 0256, 0151, 0371, 0026, 0041, 0057, 0274, 0302, 0117, 0077, 0250, 0367, 0060, 0044,
+ 0066, 0116, 0113, 0212, 0256, 0174, 0335, 0253, 0130, 0373, 0064, 0260, 0252, 0261, 0314, 0264,
+ 0036, 0155, 0335, 0273, 0047, 0216, 0026, 0242, 0077, 0243, 0306, 0207, 0142, 0227, 0130, 0360,
+ 0202, 0122, 0072, 0114, 0066, 0152, 0371, 0376, 0043, 0101, 0000, 0110, 0120, 0200, 0372, 0247,
+ 0222, 0263, 0266, 0223, 0006, 0226, 0224, 0367, 0046, 0073, 0225, 0031, 0217, 0054, 0215, 0042,
+ 0356, 0210, 0145, 0225, 0107, 0263, 0056, 0215, 0064, 0052, 0105, 0266, 0233, 0232, 0212, 0227,
+ 0374, 0272, 0002, 0037, 0050, 0223, 0147, 0374, 0000, 0166, 0121, 0001, 0024, 0233, 0315, 0177,
+ 0064, 0233, 0145, 0174, 0102, 0351, 0334, 0005, 0240, 0132, 0011, 0325, 0255, 0072, 0241, 0132,
+ 0176, 0237, 0044, 0073, 0225, 0355, 0120, 0176, 0303, 0363, 0237, 0271, 0051, 0351, 0060, 0105,
+ 0316, 0335, 0220, 0132, 0060, 0060, 0202, 0126, 0030, 0045, 0327, 0131, 0300, 0004, 0002, 0023,
+ 0150, 0233, 0114, 0240, 0257, 0272, 0367, 0200, 0131, 0130, 0105, 0020, 0164, 0232, 0075, 0064,
+ 0201, 0242, 0375, 0107, 0041, 0001, 0370, 0250, 0347, 0200, 0276, 0004, 0126, 0220, 0004, 0333,
+ 0010, 0155, 0040, 0256, 0315, 0000, 0317, 0250, 0302, 0016, 0002, 0123, 0010, 0114, 0241, 0175,
+ 0062, 0205, 0332, 0373, 0141, 0012, 0045, 0237, 0122, 0312, 0361, 0325, 0354, 0055, 0312, 0350,
+ 0044, 0253, 0203, 0354, 0275, 0055, 0014, 0336, 0142, 0140, 0055, 0044, 0167, 0063, 0266, 0077,
+ 0165, 0355, 0212, 0207, 0341, 0173, 0216, 0111, 0014, 0354, 0103, 0040, 0276, 0150, 0040, 0076,
+ 0033, 0046, 0362, 0111, 0110, 0233, 0210, 0200, 0027, 0351, 0246, 0234, 0000, 0370, 0243, 0037,
+ 0256, 0307, 0110, 0367, 0064, 0227, 0132, 0304, 0340, 0352, 0202, 0303, 0311, 0322, 0253, 0072,
+ 0026, 0236, 0220, 0067, 0265, 0265, 0076, 0240, 0307, 0334, 0112, 0042, 0270, 0134, 0252, 0165,
+ 0271, 0074, 0026, 0122, 0337, 0153, 0351, 0300, 0171, 0071, 0272, 0260, 0133, 0246, 0027, 0330,
+ 0033, 0073, 0352, 0112, 0130, 0316, 0143, 0373, 0040, 0233, 0307, 0226, 0016, 0202, 0345, 0234,
+ 0266, 0251, 0112, 0025, 0225, 0014, 0221, 0310, 0155, 0333, 0172, 0257, 0304, 0364, 0342, 0256,
+ 0061, 0265, 0351, 0075, 0166, 0060, 0125, 0125, 0047, 0362, 0157, 0147, 0246, 0167, 0350, 0234,
+ 0076, 0251, 0072, 0206, 0052, 0331, 0206, 0252, 0266, 0242, 0032, 0047, 0221, 0232, 0243, 0210,
+ 0257, 0161, 0131, 0037, 0051, 0354, 0047, 0312, 0303, 0273, 0363, 0361, 0357, 0162, 0243, 0252,
+ 0025, 0270, 0025, 0012, 0060, 0140, 0145, 0046, 0134, 0001, 0162, 0257, 0164, 0337, 0324, 0377,
+ 0000, 0360, 0126, 0014, 0336, 0150, 0231, 0001, 0277, 0212, 0105, 0336, 0000, 0277, 0131, 0370,
+ 0035, 0134, 0003, 0166, 0053, 0306, 0356, 0340, 0257, 0272, 0355, 0376, 0166, 0215, 0216, 0233,
+ 0315, 0255, 0106, 0132, 0033, 0220, 0126, 0004, 0151, 0247, 0204, 0031, 0224, 0070, 0000, 0267,
+ 0212, 0341, 0066, 0135, 0347, 0255, 0206, 0332, 0021, 0100, 0255, 0010, 0324, 0076, 0015, 0000,
+ 0145, 0025, 0243, 0354, 0023, 0265, 0314, 0267, 0003, 0142, 0075, 0156, 0271, 0372, 0370, 0036,
+ 0220, 0126, 0010, 0151, 0234, 0014, 0000, 0153, 0153, 0300, 0332, 0126, 0203, 0354, 0035, 0200,
+ 0254, 0220, 0215, 0026, 0262, 0131, 0200, 0131, 0325, 0166, 0332, 0366, 0113, 0263, 0343, 0275,
+ 0002, 0032, 0104, 0377, 0266, 0043, 0333, 0020, 0302, 0327, 0100, 0300, 0252, 0004, 0334, 0206,
+ 0360, 0265, 0124, 0370, 0372, 0233, 0270, 0013, 0001, 0242, 0327, 0233, 0216, 0136, 0363, 0335,
+ 0300, 0317, 0341, 0136, 0200, 0206, 0126, 0235, 0206, 0166, 0164, 0364, 0346, 0370, 0350, 0375,
+ 0341, 0207, 0346, 0301, 0121, 0373, 0335, 0361, 0321, 0273, 0143, 0010, 0210, 0101, 0100, 0273,
+ 0222, 0200, 0066, 0340, 0171, 0035, 0170, 0156, 0265, 0336, 0264, 0376, 0376, 0376, 0260, 0335,
+ 0006, 0034, 0103, 0140, 0273, 0364, 0300, 0066, 0140, 0170, 0055, 0062, 0371, 0315, 0337, 0217,
+ 0077, 0034, 0266, 0101, 0024, 0103, 0304, 0274, 0242, 0210, 0071, 0100, 0270, 0142, 0010, 0377,
+ 0332, 0004, 0360, 0102, 0014, 0276, 0364, 0030, 0074, 0340, 0026, 0160, 0273, 0001, 0334, 0102,
+ 0104, 0277, 0030, 0156, 0251, 0145, 0002, 0162, 0001, 0271, 0033, 0100, 0056, 0244, 0011, 0024,
+ 0263, 0170, 0303, 0370, 0065, 0140, 0027, 0260, 0273, 0001, 0354, 0102, 0346, 0101, 0271, 0013,
+ 0276, 0265, 0201, 0333, 0043, 0250, 0163, 0004, 0325, 0170, 0212, 0125, 0343, 0151, 0125, 0131,
+ 0215, 0047, 0155, 0335, 0322, 0327, 0254, 0130, 0324, 0255, 0000, 0237, 0113, 0231, 0154, 0342,
+ 0104, 0125, 0156, 0100, 0222, 0052, 0160, 0123, 0325, 0145, 0110, 0171, 0232, 0053, 0325, 0275,
+ 0135, 0031, 0170, 0221, 0306, 0066, 0021, 0151, 0035, 0134, 0132, 0073, 0363, 0373, 0323, 0132,
+ 0312, 0173, 0057, 0376, 0324, 0357, 0165, 0206, 0065, 0107, 0147, 0201, 0247, 0133, 0057, 0175,
+ 0111, 0215, 0111, 0261, 0232, 0324, 0320, 0303, 0130, 0024, 0317, 0231, 0347, 0216, 0274, 0374,
+ 0262, 0231, 0062, 0122, 0171, 0273, 0360, 0060, 0365, 0114, 0354, 0351, 0205, 0306, 0061, 0246,
+ 0134, 0111, 0326, 0174, 0154, 0361, 0105, 0012, 0271, 0115, 0336, 0216, 0260, 0043, 0006, 0242,
+ 0335, 0173, 0304, 0324, 0304, 0315, 0205, 0174, 0142, 0043, 0312, 0306, 0005, 0272, 0142, 0174,
+ 0133, 0146, 0135, 0345, 0035, 0325, 0354, 0042, 0104, 0215, 0072, 0232, 0317, 0131, 0006, 0357,
+ 0326, 0260, 0210, 0361, 0240, 0172, 0313, 0024, 0042, 0102, 0045, 0165, 0146, 0227, 0124, 0175,
+ 0154, 0054, 0254, 0230, 0122, 0365, 0054, 0101, 0153, 0203, 0227, 0266, 0157, 0053, 0222, 0167,
+ 0133, 0306, 0360, 0133, 0153, 0145, 0370, 0011, 0227, 0202, 0265, 0023, 0262, 0321, 0244, 0257,
+ 0366, 0253, 0122, 0054, 0344, 0272, 0043, 0157, 0132, 0006, 0231, 0303, 0220, 0121, 0133, 0302,
+ 0046, 0131, 0141, 0060, 0364, 0111, 0075, 0301, 0254, 0254, 0104, 0065, 0125, 0266, 0176, 0355,
+ 0321, 0173, 0017, 0373, 0376, 0251, 0076, 0255, 0023, 0270, 0370, 0303, 0226, 0325, 0007, 0124,
+ 0267, 0341, 0127, 0104, 0152, 0300, 0077, 0255, 0371, 0014, 0273, 0034, 0232, 0207, 0355, 0134,
+ 0267, 0362, 0061, 0374, 0314, 0142, 0115, 0376, 0013, 0342, 0350, 0216, 0101, 0164, 0013, 0235,
+ 0131, 0242, 0230, 0127, 0236, 0316, 0303, 0333, 0120, 0303, 0057, 0110, 0256, 0164, 0371, 0012,
+ 0276, 0172, 0172, 0111, 0101, 0343, 0174, 0235, 0065, 0063, 0117, 0003, 0016, 0172, 0047, 0102,
+ 0302, 0005, 0146, 0306, 0370, 0234, 0157, 0341, 0351, 0360, 0152, 0353, 0164, 0034, 0003, 0223,
+ 0107, 0354, 0153, 0323, 0133, 0172, 0363, 0367, 0304, 0050, 0265, 0030, 0161, 0265, 0104, 0252,
+ 0076, 0247, 0117, 0216, 0105, 0165, 0023, 0231, 0374, 0147, 0164, 0347, 0121, 0033, 0161, 0102,
+ 0167, 0306, 0301, 0350, 0220, 0120, 0304, 0125, 0144, 0364, 0103, 0037, 0123, 0372, 0027, 0024,
+ 0221, 0377, 0206, 0200, 0375, 0250, 0166, 0125, 0106, 0236, 0002, 0237, 0013, 0076, 0324, 0071,
+ 0345, 0060, 0251, 0223, 0372, 0265, 0276, 0360, 0062, 0345, 0104, 0041, 0146, 0110, 0314, 0062,
+ 0157, 0317, 0071, 0075, 0227, 0277, 0163, 0336, 0341, 0221, 0121, 0300, 0260, 0237, 0351, 0150,
+ 0171, 0171, 0165, 0346, 0134, 0340, 0126, 0027, 0007, 0205, 0157, 0064, 0320, 0243, 0160, 0161,
+ 0177, 0154, 0364, 0237, 0047, 0134, 0300, 0152, 0003, 0076, 0073, 0324, 0152, 0066, 0062, 0053,
+ 0044, 0313, 0175, 0274, 0260, 0143, 0046, 0356, 0246, 0162, 0163, 0176, 0123, 0171, 0250, 0215,
+ 0143, 0123, 0362, 0242, 0362, 0155, 0023, 0012, 0255, 0215, 0012, 0205, 0354, 0172, 0331, 0320,
+ 0173, 0216, 0336, 0353, 0150, 0101, 0265, 0313, 0266, 0240, 0342, 0047, 0031, 0363, 0362, 0352,
+ 0213, 0257, 0136, 0132, 0176, 0141, 0351, 0341, 0324, 0266, 0026, 0225, 0172, 0371, 0164, 0010,
+ 0263, 0360, 0150, 0101, 0131, 0137, 0225, 0114, 0121, 0161, 0312, 0027, 0015, 0137, 0370, 0156,
+ 0346, 0077, 0045, 0337, 0124, 0237, 0051, 0205, 0362, 0110, 0234, 0130, 0205, 0326, 0020, 0327,
+ 0300, 0150, 0243, 0110, 0367, 0112, 0376, 0334, 0312, 0264, 0227, 0304, 0152, 0222, 0104, 0116,
+ 0277, 0353, 0136, 0112, 0324, 0346, 0025, 0255, 0362, 0242, 0364, 0305, 0066, 0360, 0023, 0373,
+ 0112, 0026, 0074, 0205, 0245, 0134, 0222, 0124, 0313, 0044, 0322, 0070, 0216, 0261, 0272, 0017,
+ 0137, 0261, 0023, 0054, 0052, 0326, 0202, 0000, 0057, 0210, 0205, 0303, 0337, 0127, 0164, 0353,
+ 0262, 0167, 0110, 0245, 0131, 0330, 0104, 0070, 0275, 0246, 0336, 0056, 0245, 0335, 0125, 0123,
+ 0272, 0127, 0133, 0163, 0243, 0360, 0056, 0275, 0362, 0366, 0152, 0260, 0303, 0015, 0134, 0161,
+ 0231, 0322, 0174, 0075, 0145, 0233, 0006, 0034, 0160, 0274, 0271, 0160, 0143, 0146, 0115, 0063,
+ 0236, 0321, 0045, 0313, 0202, 0130, 0326, 0270, 0252, 0315, 0334, 0025, 0321, 0146, 0052, 0244,
+ 0314, 0256, 0111, 0030, 0120, 0146, 0171, 0224, 0071, 0133, 0317, 0265, 0121, 0346, 0312, 0056,
+ 0367, 0154, 0375, 0076, 0056, 0231, 0045, 0267, 0331, 0125, 0304, 0324, 0172, 0335, 0226, 0030,
+ 0174, 0123, 0235, 0360, 0126, 0112, 0213, 0370, 0134, 0257, 0061, 0115, 0325, 0346, 0077, 0175,
+ 0362, 0047, 0116, 0325, 0232, 0245, 0325, 0222, 0070, 0240, 0342, 0162, 0201, 0232, 0244, 0355,
+ 0051, 0107, 0162, 0143, 0264, 0263, 0322, 0230, 0300, 0045, 0266, 0134, 0140, 0002, 0345, 0061,
+ 0201, 0331, 0172, 0002, 0023, 0310, 0142, 0002, 0143, 0276, 0122, 0263, 0340, 0260, 0137, 0063,
+ 0116, 0060, 0336, 0064, 0047, 0150, 0347, 0345, 0004, 0211, 0326, 0324, 0342, 0203, 0230, 0113,
+ 0203, 0115, 0341, 0243, 0262, 0371, 0126, 0314, 0202, 0043, 0370, 0356, 0222, 0006, 0236, 0277,
+ 0360, 0140, 0332, 0345, 0153, 0002, 0166, 0135, 0101, 0272, 0037, 0136, 0017, 0170, 0305, 0376,
+ 0141, 0330, 0325, 0210, 0143, 0170, 0070, 0352, 0254, 0225, 0325, 0300, 0345, 0144, 0274, 0330,
+ 0340, 0375, 0053, 0003, 0070, 0175, 0102, 0002, 0203, 0363, 0251, 0204, 0177, 0305, 0177, 0046,
+ 0025, 0006, 0252, 0244, 0277, 0214, 0321, 0370, 0121, 0365, 0030, 0266, 0227, 0107, 0026, 0136,
+ 0016, 0272, 0151, 0373, 0064, 0331, 0144, 0373, 0031, 0216, 0117, 0246, 0017, 0301, 0314, 0002,
+ 0207, 0053, 0312, 0042, 0052, 0237, 0062, 0334, 0025, 0274, 0031, 0163, 0274, 0315, 0042, 0362,
+ 0222, 0200, 0313, 0111, 0357, 0323, 0334, 0235, 0227, 0155, 0130, 0312, 0345, 0121, 0336, 0365,
+ 0230, 0367, 0123, 0145, 0317, 0252, 0314, 0341, 0354, 0054, 0312, 0323, 0220, 0372, 0000, 0267,
+ 0170, 0231, 0107, 0047, 0332, 0023, 0141, 0143, 0315, 0325, 0275, 0020, 0037, 0062, 0037, 0022,
+ 0254, 0263, 0161, 0062, 0140, 0324, 0170, 0360, 0065, 0361, 0307, 0241, 0353, 0334, 0147, 0042,
+ 0367, 0201, 0270, 0232, 0100, 0243, 0247, 0215, 0111, 0342, 0227, 0226, 0051, 0177, 0071, 0206,
+ 0336, 0236, 0305, 0320, 0077, 0054, 0304, 0320, 0063, 0343, 0346, 0033, 0201, 0301, 0362, 0155,
+ 0303, 0307, 0012, 0115, 0302, 0333, 0204, 0125, 0032, 0060, 0352, 0252, 0065, 0110, 0015, 0324,
+ 0307, 0005, 0347, 0175, 0056, 0055, 0270, 0260, 0340, 0342, 0244, 0051, 0265, 0136, 0012, 0241,
+ 0170, 0031, 0175, 0163, 0121, 0327, 0024, 0040, 0013, 0351, 0156, 0060, 0261, 0107, 0324, 0272,
+ 0165, 0115, 0216, 0361, 0172, 0051, 0235, 0253, 0172, 0243, 0222, 0332, 0051, 0037, 0100, 0364,
+ 0303, 0045, 0100, 0302, 0012, 0212, 0342, 0210, 0121, 0021, 0215, 0241, 0047, 0134, 0225, 0207,
+ 0006, 0265, 0145, 0077, 0051, 0027, 0056, 0314, 0225, 0016, 0230, 0053, 0015, 0120, 0126, 0105,
+ 0115, 0012, 0025, 0326, 0102, 0105, 0115, 0017, 0003, 0106, 0344, 0233, 0256, 0257, 0246, 0107,
+ 0316, 0112, 0011, 0325, 0245, 0205, 0347, 0012, 0151, 0276, 0376, 0146, 0064, 0137, 0271, 0260,
+ 0132, 0132, 0204, 0343, 0270, 0132, 0333, 0171, 0213, 0134, 0354, 0041, 0233, 0235, 0022, 0052,
+ 0372, 0302, 0231, 0114, 0275, 0075, 0355, 0271, 0110, 0244, 0011, 0044, 0122, 0210, 0104, 0306,
+ 0364, 0011, 0115, 0113, 0342, 0001, 0165, 0244, 0036, 0247, 0054, 0213, 0072, 0006, 0134, 0131,
+ 0347, 0237, 0231, 0053, 0103, 0343, 0260, 0014, 0236, 0330, 0201, 0351, 0243, 0372, 0150, 0102,
+ 0231, 0252, 0214, 0024, 0375, 0224, 0242, 0254, 0204, 0346, 0140, 0326, 0254, 0127, 0244, 0330,
+ 0163, 0156, 0173, 0162, 0323, 0142, 0154, 0003, 0124, 0310, 0315, 0173, 0156, 0016, 0156, 0051,
+ 0021, 0106, 0203, 0257, 0043, 0015, 0376, 0271, 0265, 0064, 0170, 0004, 0162, 0122, 0201, 0304,
+ 0366, 0114, 0114, 0002, 0161, 0314, 0210, 0043, 0364, 0217, 0043, 0172, 0207, 0042, 0147, 0006,
+ 0120, 0110, 0172, 0256, 0131, 0151, 0042, 0314, 0045, 0316, 0153, 0317, 0122, 0270, 0025, 0341,
+ 0203, 0225, 0053, 0326, 0153, 0055, 0302, 0244, 0111, 0250, 0024, 0071, 0366, 0230, 0253, 0225,
+ 0255, 0077, 0153, 0026, 0166, 0356, 0231, 0222, 0070, 0111, 0232, 0261, 0164, 0017, 0317, 0323,
+ 0301, 0066, 0017, 0217, 0345, 0167, 0311, 0365, 0065, 0301, 0254, 0265, 0047, 0335, 0163, 0102,
+ 0307, 0247, 0022, 0324, 0211, 0343, 0006, 0114, 0163, 0003, 0317, 0015, 0343, 0061, 0116, 0140,
+ 0217, 0024, 0224, 0204, 0205, 0100, 0131, 0114, 0364, 0114, 0172, 0016, 0026, 0261, 0107, 0232,
+ 0047, 0224, 0005, 0371, 0265, 0362, 0035, 0235, 0023, 0031, 0325, 0030, 0341, 0202, 0112, 0215,
+ 0104, 0371, 0044, 0261, 0107, 0014, 0265, 0106, 0117, 0236, 0356, 0252, 0265, 0010, 0102, 0372,
+ 0326, 0134, 0152, 0021, 0143, 0322, 0070, 0041, 0167, 0232, 0040, 0106, 0123, 0201, 0162, 0003,
+ 0234, 0222, 0037, 0261, 0071, 0135, 0251, 0142, 0146, 0167, 0106, 0355, 0021, 0345, 0114, 0155,
+ 0030, 0342, 0151, 0306, 0356, 0156, 0335, 0153, 0354, 0175, 0045, 0316, 0354, 0151, 0235, 0344,
+ 0145, 0046, 0317, 0233, 0262, 0072, 0304, 0247, 0200, 0370, 0034, 0270, 0344, 0252, 0043, 0327,
+ 0013, 0103, 0162, 0130, 0343, 0372, 0072, 0137, 0067, 0142, 0333, 0330, 0044, 0272, 0374, 0110,
+ 0147, 0026, 0103, 0123, 0051, 0203, 0104, 0273, 0043, 0317, 0330, 0324, 0236, 0210, 0051, 0170,
+ 0155, 0372, 0252, 0023, 0206, 0355, 0125, 0165, 0102, 0374, 0032, 0267, 0346, 0174, 0034, 0342,
+ 0221, 0364, 0373, 0055, 0305, 0367, 0333, 0212, 0357, 0037, 0051, 0276, 0377, 0116, 0361, 0375,
+ 0143, 0305, 0367, 0337, 0307, 0275, 0037, 0375, 0346, 0327, 0205, 0323, 0264, 0100, 0361, 0126,
+ 0347, 0040, 0173, 0246, 0172, 0003, 0215, 0274, 0004, 0133, 0261, 0101, 0154, 0335, 0102, 0327,
+ 0042, 0173, 0033, 0114, 0263, 0364, 0106, 0325, 0152, 0053, 0174, 0053, 0242, 0135, 0330, 0112,
+ 0165, 0105, 0222, 0220, 0100, 0125, 0051, 0111, 0125, 0051, 0105, 0225, 0250, 0231, 0350, 0256,
+ 0030, 0166, 0027, 0234, 0063, 0275, 0366, 0210, 0210, 0337, 0316, 0306, 0224, 0033, 0262, 0136,
+ 0335, 0263, 0154, 0112, 0365, 0250, 0234, 0215, 0165, 0347, 0036, 0043, 0066, 0306, 0110, 0060,
+ 0154, 0344, 0143, 0306, 0310, 0152, 0216, 0133, 0162, 0342, 0271, 0260, 0337, 0043, 0216, 0336,
+ 0226, 0227, 0102, 0316, 0175, 0020, 0046, 0135, 0163, 0151, 0020, 0110, 0363, 0010, 0327, 0303,
+ 0217, 0004, 0117, 0253, 0134, 0274, 0315, 0260, 0360, 0305, 0351, 0301, 0131, 0003, 0316, 0035,
+ 0274, 0211, 0052, 0237, 0013, 0217, 0021, 0306, 0254, 0130, 0155, 0242, 0016, 0357, 0101, 0167,
+ 0231, 0235, 0221, 0244, 0016, 0344, 0154, 0024, 0245, 0212, 0112, 0216, 0025, 0303, 0031, 0342,
+ 0072, 0340, 0103, 0310, 0067, 0354, 0141, 0247, 0366, 0212, 0175, 0321, 0123, 0132, 0160, 0040,
+ 0253, 0330, 0201, 0254, 0331, 0001, 0013, 0070, 0053, 0134, 0350, 0260, 0304, 0374, 0054, 0315,
+ 0000, 0033, 0201, 0107, 0030, 0301, 0176, 0075, 0117, 0324, 0114, 0307, 0067, 0201, 0123, 0065,
+ 0033, 0077, 0125, 0063, 0333, 0212, 0122, 0117, 0326, 0250, 0037, 0224, 0011, 0031, 0316, 0314,
+ 0116, 0075, 0072, 0156, 0312, 0266, 0230, 0125, 0230, 0155, 0067, 0233, 0333, 0177, 0032, 0147,
+ 0365, 0144, 0306, 0222, 0023, 0146, 0223, 0007, 0155, 0224, 0316, 0264, 0120, 0117, 0224, 0023,
+ 0324, 0243, 0043, 0222, 0234, 0111, 0063, 0142, 0350, 0226, 0224, 0342, 0064, 0073, 0010, 0163,
+ 0234, 0367, 0054, 0313, 0200, 0253, 0243, 0017, 0313, 0224, 0035, 0375, 0124, 0043, 0215, 0111,
+ 0266, 0236, 0347, 0212, 0276, 0055, 0270, 0123, 0170, 0360, 0124, 0063, 0003, 0157, 0272, 0274,
+ 0307, 0315, 0146, 0216, 0366, 0102, 0337, 0154, 0234, 0370, 0026, 0061, 0261, 0026, 0052, 0377,
+ 0236, 0200, 0221, 0174, 0000, 0236, 0141, 0317, 0245, 0226, 0010, 0025, 0107, 0007, 0174, 0163,
+ 0234, 0066, 0131, 0076, 0172, 0326, 0232, 0035, 0075, 0173, 0037, 0123, 0276, 0125, 0272, 0164,
+ 0153, 0055, 0016, 0246, 0054, 0235, 0350, 0072, 0126, 0155, 0251, 0124, 0140, 0265, 0214, 0042,
+ 0255, 0052, 0045, 0325, 0323, 0152, 0007, 0326, 0252, 0144, 0156, 0112, 0252, 0140, 0170, 0336,
+ 0042, 0263, 0277, 0354, 0252, 0172, 0245, 0225, 0362, 0313, 0052, 0341, 0007, 0245, 0375, 0127,
+ 0350, 0260, 0033, 0172, 0326, 0226, 0271, 0174, 0270, 0257, 0341, 0203, 0325, 0320, 0105, 0325,
+ 0064, 0232, 0247, 0171, 0166, 0336, 0164, 0170, 0076, 0310, 0227, 0243, 0327, 0102, 0005, 0112,
+ 0363, 0305, 0067, 0244, 0022, 0321, 0224, 0251, 0114, 0042, 0237, 0054, 0321, 0232, 0234, 0133,
+ 0165, 0311, 0253, 0372, 0375, 0337, 0077, 0376, 0113, 0265, 0343, 0127, 0011, 0147, 0272, 0345,
+ 0216, 0365, 0054, 0000, 0354, 0173, 0165, 0366, 0235, 0224, 0035, 0143, 0156, 0065, 0370, 0040,
+ 0073, 0152, 0126, 0343, 0262, 0270, 0354, 0010, 0367, 0165, 0227, 0144, 0307, 0125, 0230, 0023,
+ 0053, 0062, 0226, 0175, 0071, 0232, 0005, 0371, 0041, 0051, 0077, 0212, 0256, 0354, 0053, 0131,
+ 0142, 0222, 0173, 0302, 0374, 0355, 0023, 0046, 0107, 0040, 0114, 0012, 0012, 0223, 0063, 0352,
+ 0063, 0020, 0045, 0305, 0250, 0360, 0135, 0355, 0104, 0211, 0330, 0325, 0135, 0022, 0044, 0142,
+ 0076, 0210, 0267, 0210, 0270, 0035, 0210, 0221, 0262, 0304, 0110, 0261, 0165, 0335, 0021, 0041,
+ 0162, 0274, 0236, 0152, 0347, 0151, 0023, 0134, 0071, 0147, 0023, 0326, 0074, 0124, 0254, 0171,
+ 0232, 0230, 0264, 0163, 0322, 0111, 0353, 0050, 0141, 0176, 0361, 0041, 0110, 0311, 0222, 0075,
+ 0361, 0154, 0247, 0026, 0176, 0121, 0351, 0250, 0100, 0042, 0067, 0251, 0326, 0255, 0031, 0023,
+ 0016, 0253, 0251, 0232, 0121, 0036, 0226, 0225, 0056, 0107, 0315, 0177, 0061, 0152, 0162, 0001,
+ 0315, 0015, 0073, 0022, 0127, 0063, 0241, 0347, 0202, 0074, 0066, 0011, 0272, 0226, 0112, 0146,
+ 0266, 0053, 0061, 0274, 0251, 0020, 0351, 0310, 0237, 0316, 0156, 0233, 0004, 0171, 0146, 0346,
+ 0163, 0122, 0303, 0050, 0367, 0112, 0363, 0161, 0030, 0365, 0172, 0344, 0323, 0156, 0234, 0120,
+ 0107, 0235, 0126, 0325, 0362, 0250, 0323, 0363, 0251, 0063, 0363, 0244, 0143, 0266, 0052, 0056,
+ 0317, 0072, 0061, 0177, 0172, 0007, 0171, 0104, 0253, 0256, 0152, 0202, 0207, 0155, 0372, 0210,
+ 0313, 0321, 0024, 0156, 0224, 0373, 0222, 0132, 0040, 0171, 0035, 0043, 0177, 0366, 0250, 0024,
+ 0201, 0250, 0023, 0206, 0262, 0320, 0050, 0053, 0005, 0171, 0061, 0107, 0177, 0046, 0016, 0372,
+ 0017, 0365, 0112, 0317, 0317, 0254, 0135, 0233, 0314, 0311, 0163, 0347, 0367, 0125, 0173, 0040,
+ 0200, 0332, 0066, 0141, 0050, 0072, 0027, 0120, 0313, 0363, 0073, 0120, 0132, 0263, 0161, 0322,
+ 0377, 0274, 0263, 0025, 0065, 0151, 0241, 0072, 0120, 0031, 0075, 0256, 0263, 0106, 0347, 0332,
+ 0331, 0161, 0013, 0162, 0377, 0327, 0223, 0373, 0037, 0146, 0262, 0105, 0005, 0340, 0260, 0127,
+ 0247, 0214, 0066, 0151, 0313, 0174, 0365, 0266, 0201, 0060, 0067, 0157, 0051, 0125, 0117, 0266,
+ 0170, 0010, 0144, 0355, 0157, 0066, 0153, 0177, 0071, 0311, 0034, 0162, 0367, 0245, 0123, 0262,
+ 0271, 0325, 0046, 0364, 0216, 0073, 0076, 0217, 0223, 0203, 0377, 0017, 0011, 0324, 0246, 0057,
+ 0000, 0050, 0165, 0165, 0141, 0171, 0051
} };
static GStaticResource static_resource = { resources_resource_data.data, sizeof (resources_resource_data.data) - 1 /* nul terminator */, NULL, NULL, NULL };
diff --git a/src/sqlite/sqlite.c b/src/sqlite/sqlite.c
index 79a7b97..299ad7f 100644
--- a/src/sqlite/sqlite.c
+++ b/src/sqlite/sqlite.c
@@ -56,14 +56,14 @@ static gchar *new_app_tbl =
/* Create the equity table if it doesn't already exist. */
static gchar *new_eqty_tbl =
"CREATE TABLE IF NOT EXISTS equity(Id INTEGER PRIMARY KEY, Symbol TEXT NOT "
- "NULL, Shares TEXT NOT NULL); CREATE UNIQUE INDEX IF NOT EXISTS "
- "idx_equity_symbol ON equity (Symbol);";
+ "NULL, Shares TEXT NOT NULL, Cost TEXT NOT NULL); CREATE UNIQUE INDEX IF "
+ "NOT EXISTS idx_equity_symbol ON equity (Symbol);";
/* Create the bullion table if it doesn't already exist. */
static gchar *new_bul_tbl =
"CREATE TABLE IF NOT EXISTS bullion(Id INTEGER PRIMARY KEY, Metal TEXT NOT "
- "NULL, Ounces TEXT NOT NULL, Premium TEXT NOT NULL); CREATE UNIQUE INDEX "
- "IF NOT EXISTS idx_bullion_metal ON bullion (Metal);";
+ "NULL, Ounces TEXT NOT NULL, Premium TEXT NOT NULL, Cost TEXT NOT NULL); "
+ "CREATE UNIQUE INDEX IF NOT EXISTS idx_bullion_metal ON bullion (Metal);";
static gint app_callback(gpointer data, gint argc, gchar **argv,
gchar **ColName) {
@@ -176,8 +176,8 @@ static gint app_callback(gpointer data, gint argc, gchar **argv,
static gint equity_callback(gpointer data, gint argc, gchar **argv,
gchar **ColName) {
- /* argv[0] is Id, argv[1] is Symbol, argv[2] is Shares */
- if (argc != 3)
+ /* argv[0] is Id, argv[1] is Symbol, argv[2] is Shares, argv[3] is Cost */
+ if (argc != 4)
return 1;
if (g_strcmp0(ColName[0], "Id") != 0)
return 1;
@@ -185,27 +185,34 @@ static gint equity_callback(gpointer data, gint argc, gchar **argv,
return 1;
if (g_strcmp0(ColName[2], "Shares") != 0)
return 1;
+ if (g_strcmp0(ColName[3], "Cost") != 0)
+ return 1;
equity_folder *F = (equity_folder *)data;
- F->AddStock(argv[1], argv[2]);
+ F->AddStock(argv[1], argv[2], argv[3]);
return 0;
}
static void set_bul_values(bullion *B, const gchar *ounce_ch,
- const gchar *premium_ch, gushort digits_right) {
+ const gchar *premium_ch, const gchar *cost_ch,
+ gushort digits_right) {
B->ounce_f = StringToDouble(ounce_ch);
- DoubleToFormattedStrPango(&B->ounce_mrkd_ch, B->ounce_f, 4, NUM_STR, BLACK);
B->premium_f = StringToDouble(premium_ch);
DoubleToFormattedStrPango(&B->premium_mrkd_ch, B->premium_f, digits_right,
MON_STR, BLACK);
+
+ B->cost_basis_f = StringToDouble(cost_ch);
+ DoubleToFormattedStrPango(&B->cost_mrkd_ch, B->cost_basis_f, digits_right,
+ MON_STR, BLACK);
}
static gint bullion_callback(gpointer data, gint argc, gchar **argv,
gchar **ColName) {
- /* argv[0] is Id, argv[1] is Metal, argv[2] is Ounces, argv[3] is Premium */
- if (argc != 4)
+ /* argv[0] is Id, argv[1] is Metal, argv[2] is Ounces, argv[3] is Premium,
+ * argv[4] is Cost */
+ if (argc != 5)
return 1;
if (g_strcmp0(ColName[0], "Id") != 0)
return 1;
@@ -215,6 +222,8 @@ static gint bullion_callback(gpointer data, gint argc, gchar **argv,
return 1;
if (g_strcmp0(ColName[3], "Premium") != 0)
return 1;
+ if (g_strcmp0(ColName[4], "Cost") != 0)
+ return 1;
portfolio_packet *pkg = (portfolio_packet *)data;
meta *D = pkg->GetMetaClass();
@@ -222,19 +231,21 @@ static gint bullion_callback(gpointer data, gint argc, gchar **argv,
if (!g_strcmp0(argv[1], "gold"))
set_bul_values(m->Gold, argv[2] ? argv[2] : "0", argv[3] ? argv[3] : "0",
- D->decimal_places_guint8);
+ argv[4] ? argv[4] : "0", D->decimal_places_guint8);
else if (!g_strcmp0(argv[1], "silver"))
set_bul_values(m->Silver, argv[2] ? argv[2] : "0", argv[3] ? argv[3] : "0",
- D->decimal_places_guint8);
+ argv[4] ? argv[4] : "0", D->decimal_places_guint8);
else if (!g_strcmp0(argv[1], "platinum"))
set_bul_values(m->Platinum, argv[2] ? argv[2] : "0",
- argv[3] ? argv[3] : "0", D->decimal_places_guint8);
+ argv[3] ? argv[3] : "0", argv[4] ? argv[4] : "0",
+ D->decimal_places_guint8);
else if (!g_strcmp0(argv[1], "palladium"))
set_bul_values(m->Palladium, argv[2] ? argv[2] : "0",
- argv[3] ? argv[3] : "0", D->decimal_places_guint8);
+ argv[3] ? argv[3] : "0", argv[4] ? argv[4] : "0",
+ D->decimal_places_guint8);
return 0;
}
@@ -330,8 +341,9 @@ void SqliteProcessing(portfolio_packet *pkg) {
sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, app_callback,
pkg, sql_cmd);
- sql_cmd = "SELECT * FROM equity;"; /* We always want this table selected after
- app_tbl [equity urls and dec places] */
+ sql_cmd =
+ "SELECT * FROM equity;"; /* We always want the next two tables selected
+ after app_tbl [equity urls and dec places] */
sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, equity_callback,
F, sql_cmd);
@@ -467,14 +479,14 @@ void SqliteBullionAdd(meta *D, ...)
*/
{
- const gchar *fmt = "REPLACE INTO bullion (Metal, Ounces, Premium) "
- "VALUES('%s', '%s', '%s');";
+ const gchar *fmt = "REPLACE INTO bullion (Metal, Ounces, Premium, Cost) "
+ "VALUES('%s', '%s', '%s', '%s');";
va_list arg_ptr;
/* Get the sqlite command. */
va_start(arg_ptr, D);
- gchar *sql_cmd = vradic_sqlte_cmd(3, fmt, arg_ptr);
+ gchar *sql_cmd = vradic_sqlte_cmd(4, fmt, arg_ptr);
va_end(arg_ptr);
/* Run the command. */
@@ -482,11 +494,13 @@ void SqliteBullionAdd(meta *D, ...)
g_free(sql_cmd);
}
-void SqliteEquityAdd(const gchar *symbol, const gchar *shares, meta *D) {
- const gchar *fmt = "REPLACE INTO equity (Symbol, Shares) VALUES('%s', '%s');";
+void SqliteEquityAdd(const gchar *symbol, const gchar *shares,
+ const gchar *cost, meta *D) {
+ const gchar *fmt =
+ "REPLACE INTO equity (Symbol, Shares, Cost) VALUES('%s', '%s', '%s');";
/* Create sqlite command. */
- gchar *sql_cmd = SnPrint(fmt, symbol, shares);
+ gchar *sql_cmd = SnPrint(fmt, symbol, shares, cost);
/* Run the command. */
sqlite_run_cmd(&mutexes[SQLITE_MUTEX], D->sqlite_db_path_ch, 0, 0, sql_cmd);
diff --git a/src/workfuncs/pango_formatting.c b/src/workfuncs/pango_formatting.c
index 27eff86..a283c40 100644
--- a/src/workfuncs/pango_formatting.c
+++ b/src/workfuncs/pango_formatting.c
@@ -266,4 +266,117 @@ void DoubleToFormattedStrPango(gchar **dst, const gdouble num,
DoubleToFormattedStr(&tmp, num, digits_right, format_type);
StringToStrPango(dst, tmp, color);
g_free(tmp);
+}
+
+void RangeStrPango(gchar **dest, const double low_f, const double high_f,
+ const guint8 digits_right) {
+ gchar *low_ch = NULL, *high_ch = NULL, *range_ch = NULL;
+
+ /* Create the monetary format strings. */
+ DoubleToFormattedStr(&low_ch, low_f, digits_right, MON_STR);
+
+ DoubleToFormattedStr(&high_ch, high_f, digits_right, MON_STR);
+
+ /* Create the unmarked string. */
+ range_ch = SnPrint("%s - %s", low_ch, high_ch);
+
+ /* Create the marked up string. */
+ StringToStrPango(dest, range_ch, BLACK);
+
+ g_free(low_ch);
+ g_free(high_ch);
+ g_free(range_ch);
+}
+
+void ChangeStrPango(gchar **dest, const double value_f, const double percent_f,
+ const guint8 digits_right) {
+ gchar *value_ch = NULL, *percent_ch = NULL, *val_per_ch = NULL;
+
+ /* Create the monetary and percent format strings. */
+ DoubleToFormattedStr(&value_ch, value_f, digits_right, MON_STR);
+
+ DoubleToFormattedStr(&percent_ch, percent_f, digits_right, PER_STR);
+
+ /* Create the unmarked string. */
+ val_per_ch = SnPrint("%s\n%s", value_ch, percent_ch);
+
+ /* Create the marked up string. */
+ if (value_f < 0) {
+ StringToStrPango(dest, val_per_ch, RED);
+ } else if (value_f > 0) {
+ StringToStrPango(dest, val_per_ch, GREEN);
+ } else {
+ StringToStrPango(dest, val_per_ch, BLACK);
+ }
+
+ g_free(value_ch);
+ g_free(percent_ch);
+ g_free(val_per_ch);
+}
+
+void TotalStrPango(gchar **dest, const double total_f, const double gain_f,
+ const guint8 digits_right) {
+ gchar *total_ch = NULL, *gain_ch = NULL, *tmp_ch = NULL;
+ gchar *total_mrkd_ch = NULL, *gain_mrkd_ch = NULL;
+
+ /* Create the monetary format strings. */
+ DoubleToFormattedStr(&tmp_ch, total_f, digits_right, MON_STR);
+ total_ch = SnPrint("%s\n", tmp_ch);
+ g_free(tmp_ch);
+
+ DoubleToFormattedStr(&gain_ch, gain_f, digits_right, MON_STR);
+
+ /* Create the first marked string. */
+ StringToStrPango(&total_mrkd_ch, total_ch, BLACK);
+
+ /* Create the second marked string. */
+ if (gain_f < 0) {
+ StringToStrPango(&gain_mrkd_ch, gain_ch, RED);
+ } else if (gain_f > 0) {
+ StringToStrPango(&gain_mrkd_ch, gain_ch, GREEN);
+ } else {
+ StringToStrPango(&gain_mrkd_ch, gain_ch, BLACK);
+ }
+
+ /* Find allocation size */
+ gsize len = g_snprintf(NULL, 0, "%s%s", total_mrkd_ch, gain_mrkd_ch) + 1;
+ tmp_ch = g_realloc(dest[0], len);
+ dest[0] = tmp_ch;
+
+ g_snprintf(dest[0], len, "%s%s", total_mrkd_ch, gain_mrkd_ch);
+
+ g_free(total_ch);
+ g_free(gain_ch);
+ g_free(total_mrkd_ch);
+ g_free(gain_mrkd_ch);
+}
+
+void SymbolStrPango(gchar **dest, const gchar *symbol_ch,
+ const double quantity_f, const guint8 digits_right,
+ const guint color) {
+ gchar *quantity_ch = NULL, *tmp_ch = NULL;
+ gchar *symbol_mrkd_ch = NULL, *quantity_mrkd_ch = NULL;
+
+ /* Create the unmarked strings. */
+ tmp_ch = SnPrint("%s\n", symbol_ch);
+
+ DoubleToFormattedStr(&quantity_ch, quantity_f, digits_right, NUM_STR);
+
+ /* Create the first marked string. */
+ StringToStrPango(&symbol_mrkd_ch, tmp_ch, color);
+ g_free(tmp_ch);
+
+ /* Create the second marked string. */
+ StringToStrPango(&quantity_mrkd_ch, quantity_ch, BLACK);
+
+ /* Find allocation size */
+ gsize len = g_snprintf(NULL, 0, "%s%s", symbol_mrkd_ch, quantity_mrkd_ch) + 1;
+ tmp_ch = g_realloc(dest[0], len);
+ dest[0] = tmp_ch;
+
+ g_snprintf(dest[0], len, "%s%s", symbol_mrkd_ch, quantity_mrkd_ch);
+
+ g_free(quantity_ch);
+ g_free(symbol_mrkd_ch);
+ g_free(quantity_mrkd_ch);
}
\ No newline at end of file
diff --git a/src/workfuncs/working_functions.c b/src/workfuncs/working_functions.c
index e60bd56..55d44ea 100644
--- a/src/workfuncs/working_functions.c
+++ b/src/workfuncs/working_functions.c
@@ -143,8 +143,8 @@ void GetYahooUrl(gchar **url_ch, const gchar *symbol_ch, guint period) {
end_time = unix_time_sec();
start_time = end_time - (gint64)period;
- const gchar *fmt = YAHOO_URL_START
- "%s" YAHOO_URL_MIDDLE_ONE "%ld" YAHOO_URL_MIDDLE_TWO "%ld" YAHOO_URL_END;
+ const gchar *fmt = YAHOO_URL_ONE "%s" YAHOO_URL_TWO "%ld" YAHOO_URL_THREE
+ "%ld" YAHOO_URL_FOUR;
len = g_snprintf(NULL, 0, fmt, symbol_ch, start_time, end_time) + 1;
gchar *tmp = g_realloc(url_ch[0], len);