Merge pull request #545 from LedgerHQ/cev/add_sender_field

B2CA-1522: Add sender field in transaction
This commit is contained in:
Charles-Edouard de la Vergne
2024-06-20 10:37:16 +02:00
committed by GitHub
1148 changed files with 74 additions and 37 deletions

View File

@@ -19,10 +19,10 @@ bool copy_transaction_parameters(create_transaction_parameters_t* sign_transacti
// We need this "trick" as the input data position can overlap with app-ethereum globals // We need this "trick" as the input data position can overlap with app-ethereum globals
txStringProperties_t stack_data; txStringProperties_t stack_data;
memset(&stack_data, 0, sizeof(stack_data)); memset(&stack_data, 0, sizeof(stack_data));
strlcpy(stack_data.fullAddress, strlcpy(stack_data.toAddress,
sign_transaction_params->destination_address, sign_transaction_params->destination_address,
sizeof(stack_data.fullAddress)); sizeof(stack_data.toAddress));
if ((stack_data.fullAddress[sizeof(stack_data.fullAddress) - 1] != '\0') || if ((stack_data.toAddress[sizeof(stack_data.toAddress) - 1] != '\0') ||
(sign_transaction_params->amount_length > 32) || (sign_transaction_params->amount_length > 32) ||
(sign_transaction_params->fee_amount_length > 8)) { (sign_transaction_params->fee_amount_length > 8)) {
return false; return false;

View File

@@ -4,8 +4,8 @@
void plugin_ui_get_id(void) { void plugin_ui_get_id(void) {
ethQueryContractID_t pluginQueryContractID; ethQueryContractID_t pluginQueryContractID;
eth_plugin_prepare_query_contract_ID(&pluginQueryContractID, eth_plugin_prepare_query_contract_ID(&pluginQueryContractID,
strings.common.fullAddress, strings.common.toAddress,
sizeof(strings.common.fullAddress), sizeof(strings.common.toAddress),
strings.common.fullAmount, strings.common.fullAmount,
sizeof(strings.common.fullAmount)); sizeof(strings.common.fullAmount));
// Query the original contract for ID if it's not an internal alias // Query the original contract for ID if it's not an internal alias
@@ -33,8 +33,8 @@ void plugin_ui_get_item_internal(char *title_buffer,
} }
void plugin_ui_get_item(void) { void plugin_ui_get_item(void) {
plugin_ui_get_item_internal(strings.common.fullAddress, plugin_ui_get_item_internal(strings.common.toAddress,
sizeof(strings.common.fullAddress), sizeof(strings.common.toAddress),
strings.common.fullAmount, strings.common.fullAmount,
sizeof(strings.common.fullAmount)); sizeof(strings.common.fullAmount));
} }

View File

@@ -127,7 +127,8 @@ typedef enum {
#define NETWORK_STRING_MAX_SIZE 19 #define NETWORK_STRING_MAX_SIZE 19
typedef struct txStringProperties_s { typedef struct txStringProperties_s {
char fullAddress[43]; char fromAddress[43];
char toAddress[43];
char fullAmount[79]; // 2^256 is 78 digits long char fullAmount[79]; // 2^256 is 78 digits long
char maxFee[50]; char maxFee[50];
char nonce[8]; // 10M tx per account ought to be enough for everybody char nonce[8]; // 10M tx per account ought to be enough for everybody

View File

@@ -9,7 +9,7 @@ UX_STEP_NOCB(
ux_domain_name_step, ux_domain_name_step,
bnnn_paging, bnnn_paging,
{ {
.title = "Domain", .title = "To (domain)",
.text = g_domain_name .text = g_domain_name
}); });
// clang-format on // clang-format on

View File

@@ -23,7 +23,7 @@ UX_STEP_NOCB(
bnnn_paging, bnnn_paging,
{ {
.title = "Contract Name", .title = "Contract Name",
.text = strings.common.fullAddress, .text = strings.common.toAddress,
}); });
UX_STEP_NOCB( UX_STEP_NOCB(

View File

@@ -15,7 +15,7 @@ UX_STEP_NOCB(
bnnn_paging, bnnn_paging,
{ {
.title = "Address", .title = "Address",
.text = strings.common.fullAddress, .text = strings.common.toAddress,
}); });
UX_STEP_CB( UX_STEP_CB(
ux_display_public_flow_3_step, ux_display_public_flow_3_step,

View File

@@ -15,7 +15,7 @@ UX_STEP_NOCB(
bnnn_paging, bnnn_paging,
{ {
.title = "Address", .title = "Address",
.text = strings.common.fullAddress, .text = strings.common.toAddress,
}); });
UX_STEP_NOCB( UX_STEP_NOCB(
ux_display_privacy_public_key_flow_3_step, ux_display_privacy_public_key_flow_3_step,

View File

@@ -110,11 +110,18 @@ UX_STEP_NOCB(
.text = strings.common.fullAmount .text = strings.common.fullAmount
}); });
UX_STEP_NOCB( UX_STEP_NOCB(
ux_approval_address_step, ux_approval_from_step,
bnnn_paging, bnnn_paging,
{ {
.title = "Address", .title = "From",
.text = strings.common.fullAddress, .text = strings.common.fromAddress,
});
UX_STEP_NOCB(
ux_approval_to_step,
bnnn_paging,
{
.title = "To",
.text = strings.common.toAddress,
}); });
UX_STEP_NOCB_INIT( UX_STEP_NOCB_INIT(
@@ -122,7 +129,7 @@ UX_STEP_NOCB_INIT(
bnnn_paging, bnnn_paging,
plugin_ui_get_id(), plugin_ui_get_id(),
{ {
.title = strings.common.fullAddress, .title = strings.common.toAddress,
.text = strings.common.fullAmount .text = strings.common.fullAmount
}); });
@@ -138,7 +145,7 @@ UX_FLOW_DEF_NOCB(
ux_plugin_approval_display_step, ux_plugin_approval_display_step,
bnnn_paging, bnnn_paging,
{ {
.title = strings.common.fullAddress, .title = strings.common.toAddress,
.text = strings.common.fullAmount .text = strings.common.fullAmount
}); });
@@ -214,22 +221,30 @@ void ux_approve_tx(bool fromPlugin) {
if (fromPlugin) { if (fromPlugin) {
// Add the special dynamic display logic // Add the special dynamic display logic
ux_approval_tx_flow[step++] = &ux_plugin_approval_id_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_id_step;
if (pluginType != EXTERNAL) {
if (strings.common.fromAddress[0] != 0) {
ux_approval_tx_flow[step++] = &ux_approval_from_step;
}
}
ux_approval_tx_flow[step++] = &ux_plugin_approval_before_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_before_step;
ux_approval_tx_flow[step++] = &ux_plugin_approval_display_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_display_step;
ux_approval_tx_flow[step++] = &ux_plugin_approval_after_step; ux_approval_tx_flow[step++] = &ux_plugin_approval_after_step;
} else { } else {
// We're in a regular transaction, just show the amount and the address // We're in a regular transaction, just show the amount and the address
if (strings.common.fromAddress[0] != 0) {
ux_approval_tx_flow[step++] = &ux_approval_from_step;
}
ux_approval_tx_flow[step++] = &ux_approval_amount_step; ux_approval_tx_flow[step++] = &ux_approval_amount_step;
#ifdef HAVE_DOMAIN_NAME #ifdef HAVE_DOMAIN_NAME
uint64_t chain_id = get_tx_chain_id(); uint64_t chain_id = get_tx_chain_id();
if (has_domain_name(&chain_id, tmpContent.txContent.destination)) { if (has_domain_name(&chain_id, tmpContent.txContent.destination)) {
ux_approval_tx_flow[step++] = &ux_domain_name_step; ux_approval_tx_flow[step++] = &ux_domain_name_step;
if (N_storage.verbose_domain_name) { if (N_storage.verbose_domain_name) {
ux_approval_tx_flow[step++] = &ux_approval_address_step; ux_approval_tx_flow[step++] = &ux_approval_to_step;
} }
} else { } else {
#endif // HAVE_DOMAIN_NAME #endif // HAVE_DOMAIN_NAME
ux_approval_tx_flow[step++] = &ux_approval_address_step; ux_approval_tx_flow[step++] = &ux_approval_to_step;
#ifdef HAVE_DOMAIN_NAME #ifdef HAVE_DOMAIN_NAME
} }
#endif // HAVE_DOMAIN_NAME #endif // HAVE_DOMAIN_NAME

View File

@@ -64,8 +64,8 @@ void handleGetPublicKey(uint8_t p1,
*tx = set_result_get_publicKey(); *tx = set_result_get_publicKey();
THROW(APDU_RESPONSE_OK); THROW(APDU_RESPONSE_OK);
} else { } else {
snprintf(strings.common.fullAddress, snprintf(strings.common.toAddress,
sizeof(strings.common.fullAddress), sizeof(strings.common.toAddress),
"0x%.*s", "0x%.*s",
40, 40,
tmpCtx.publicKeyContext.address); tmpCtx.publicKeyContext.address);

View File

@@ -94,8 +94,8 @@ void handlePerformPrivacyOperation(uint8_t p1,
*tx = set_result_perform_privacy_operation(); *tx = set_result_perform_privacy_operation();
THROW(0x9000); THROW(0x9000);
} else { } else {
snprintf(strings.common.fullAddress, snprintf(strings.common.toAddress,
sizeof(strings.common.fullAddress), sizeof(strings.common.toAddress),
"0x%.*s", "0x%.*s",
40, 40,
tmpCtx.publicKeyContext.address); tmpCtx.publicKeyContext.address);

View File

@@ -346,12 +346,19 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool
tmpCtx.transactionContext.hash, tmpCtx.transactionContext.hash,
32)); 32));
uint8_t msg_sender[ADDRESS_LENGTH] = {0};
get_public_key(msg_sender, sizeof(msg_sender));
address_to_string(msg_sender,
ADDRESS_LENGTH,
strings.common.fromAddress,
sizeof(strings.common.fromAddress),
chainConfig->chainId);
PRINTF("FROM address displayed: %s\n", strings.common.fromAddress);
// Finalize the plugin handling // Finalize the plugin handling
if (dataContext.tokenContext.pluginStatus >= ETH_PLUGIN_RESULT_SUCCESSFUL) { if (dataContext.tokenContext.pluginStatus >= ETH_PLUGIN_RESULT_SUCCESSFUL) {
eth_plugin_prepare_finalize(&pluginFinalize); eth_plugin_prepare_finalize(&pluginFinalize);
uint8_t msg_sender[ADDRESS_LENGTH] = {0};
get_public_key(msg_sender, sizeof(msg_sender));
pluginFinalize.address = msg_sender; pluginFinalize.address = msg_sender;
if (!eth_plugin_call(ETH_PLUGIN_FINALIZE, (void *) &pluginFinalize)) { if (!eth_plugin_call(ETH_PLUGIN_FINALIZE, (void *) &pluginFinalize)) {
@@ -465,14 +472,14 @@ __attribute__((noinline)) static bool finalize_parsing_helper(bool direct, bool
chainConfig->chainId); chainConfig->chainId);
if (G_called_from_swap) { if (G_called_from_swap) {
// Ensure the values are the same that the ones that have been previously validated // Ensure the values are the same that the ones that have been previously validated
if (strcasecmp_workaround(strings.common.fullAddress, displayBuffer) != 0) { if (strcasecmp_workaround(strings.common.toAddress, displayBuffer) != 0) {
PRINTF("ERR_SILENT_MODE_CHECK_FAILED, address check failed\n"); PRINTF("ERR_SILENT_MODE_CHECK_FAILED, address check failed\n");
THROW(ERR_SILENT_MODE_CHECK_FAILED); THROW(ERR_SILENT_MODE_CHECK_FAILED);
} }
} else { } else {
strlcpy(strings.common.fullAddress, displayBuffer, sizeof(strings.common.fullAddress)); strlcpy(strings.common.toAddress, displayBuffer, sizeof(strings.common.toAddress));
} }
PRINTF("Address displayed: %s\n", strings.common.fullAddress); PRINTF("TO address displayed: %s\n", strings.common.toAddress);
// Format the amount in a temporary buffer, if in swap case compare it with validated // Format the amount in a temporary buffer, if in swap case compare it with validated
// amount, else commit it // amount, else commit it

View File

@@ -57,8 +57,8 @@ static const nbgl_icon_details_t *get_tx_icon(void) {
if (tx_approval_context.fromPlugin && (pluginType == EXTERNAL)) { if (tx_approval_context.fromPlugin && (pluginType == EXTERNAL)) {
if (caller_app && caller_app->name) { if (caller_app && caller_app->name) {
if ((strlen(strings.common.fullAddress) == strlen(caller_app->name)) && if ((strlen(strings.common.toAddress) == strlen(caller_app->name)) &&
(strcmp(strings.common.fullAddress, caller_app->name) == 0)) { (strcmp(strings.common.toAddress, caller_app->name) == 0)) {
icon = get_app_icon(true); icon = get_app_icon(true);
} }
} }
@@ -93,6 +93,13 @@ static uint8_t setTagValuePairs(void) {
// Setup data to display // Setup data to display
if (tx_approval_context.fromPlugin) { if (tx_approval_context.fromPlugin) {
if (pluginType != EXTERNAL) {
if (strings.common.fromAddress[0] != 0) {
pairs[nbPairs].item = "From";
pairs[nbPairs].value = strings.common.fromAddress;
nbPairs++;
}
}
for (pairIndex = 0; pairIndex < dataContext.tokenContext.pluginUiMaxItems; pairIndex++) { for (pairIndex = 0; pairIndex < dataContext.tokenContext.pluginUiMaxItems; pairIndex++) {
// for the next dataContext.tokenContext.pluginUiMaxItems items, get tag/value from // for the next dataContext.tokenContext.pluginUiMaxItems items, get tag/value from
// plugin_ui_get_item_internal() // plugin_ui_get_item_internal()
@@ -116,6 +123,12 @@ static uint8_t setTagValuePairs(void) {
pairs[nbPairs].value = strings.common.maxFee; pairs[nbPairs].value = strings.common.maxFee;
nbPairs++; nbPairs++;
} else { } else {
if (strings.common.fromAddress[0] != 0) {
pairs[nbPairs].item = "From";
pairs[nbPairs].value = strings.common.fromAddress;
nbPairs++;
}
pairs[nbPairs].item = "Amount"; pairs[nbPairs].item = "Amount";
pairs[nbPairs].value = strings.common.fullAmount; pairs[nbPairs].value = strings.common.fullAmount;
nbPairs++; nbPairs++;
@@ -125,14 +138,14 @@ static uint8_t setTagValuePairs(void) {
tx_approval_context.domain_name_match = tx_approval_context.domain_name_match =
has_domain_name(&chain_id, tmpContent.txContent.destination); has_domain_name(&chain_id, tmpContent.txContent.destination);
if (tx_approval_context.domain_name_match) { if (tx_approval_context.domain_name_match) {
pairs[nbPairs].item = "Domain"; pairs[nbPairs].item = "To (domain)";
pairs[nbPairs].value = g_domain_name; pairs[nbPairs].value = g_domain_name;
nbPairs++; nbPairs++;
} }
if (!tx_approval_context.domain_name_match || N_storage.verbose_domain_name) { if (!tx_approval_context.domain_name_match || N_storage.verbose_domain_name) {
#endif #endif
pairs[nbPairs].item = "Address"; pairs[nbPairs].item = "To";
pairs[nbPairs].value = strings.common.fullAddress; pairs[nbPairs].value = strings.common.toAddress;
nbPairs++; nbPairs++;
#ifdef HAVE_DOMAIN_NAME #ifdef HAVE_DOMAIN_NAME
} }
@@ -142,6 +155,7 @@ static uint8_t setTagValuePairs(void) {
pairs[nbPairs].value = strings.common.nonce; pairs[nbPairs].value = strings.common.nonce;
nbPairs++; nbPairs++;
} }
pairs[nbPairs].item = "Max fees"; pairs[nbPairs].item = "Max fees";
pairs[nbPairs].value = strings.common.maxFee; pairs[nbPairs].value = strings.common.maxFee;
nbPairs++; nbPairs++;
@@ -172,14 +186,14 @@ static void reviewCommon(void) {
"Review transaction\nto %s\n%s%s", "Review transaction\nto %s\n%s%s",
op_name, op_name,
(pluginType == EXTERNAL ? "on " : ""), (pluginType == EXTERNAL ? "on " : ""),
strings.common.fullAddress); strings.common.toAddress);
// Finish text: replace "Review" by "Sign" and add questionmark // Finish text: replace "Review" by "Sign" and add questionmark
snprintf(g_stax_shared_buffer + buf_size, snprintf(g_stax_shared_buffer + buf_size,
buf_size, buf_size,
"Sign transaction\nto %s\n%s%s", "Sign transaction\nto %s\n%s%s",
op_name, op_name,
(pluginType == EXTERNAL ? "on " : ""), (pluginType == EXTERNAL ? "on " : ""),
strings.common.fullAddress); strings.common.toAddress);
nbgl_useCaseReview(TYPE_TRANSACTION, nbgl_useCaseReview(TYPE_TRANSACTION,
&pairsList, &pairsList,

View File

@@ -28,7 +28,7 @@ static void buildFirstPage(const char *review_string) {
uint8_t nbPairs = 0; uint8_t nbPairs = 0;
pairs[nbPairs].item = "Address"; pairs[nbPairs].item = "Address";
pairs[nbPairs].value = strings.common.fullAddress; pairs[nbPairs].value = strings.common.toAddress;
nbPairs++; nbPairs++;
pairs[nbPairs].item = "Key"; pairs[nbPairs].item = "Key";
pairs[nbPairs].value = strings.common.fullAmount; pairs[nbPairs].value = strings.common.fullAmount;

View File

@@ -41,7 +41,7 @@ void ui_display_public_key(const uint64_t *chain_id) {
icon = get_app_icon(false); icon = get_app_icon(false);
} }
strlcat(g_stax_shared_buffer, "address", sizeof(g_stax_shared_buffer)); strlcat(g_stax_shared_buffer, "address", sizeof(g_stax_shared_buffer));
nbgl_useCaseAddressReview(strings.common.fullAddress, nbgl_useCaseAddressReview(strings.common.toAddress,
NULL, NULL,
icon, icon,
g_stax_shared_buffer, g_stax_shared_buffer,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Some files were not shown because too many files have changed in this diff Show More