#include "config.h"
#include <assert.h>
#include <ccan/read_write_all/read_write_all.h>
#include <ccan/str/hex/hex.h>
#include <common/bigsize.h>
#include <common/channel_id.h>
#include <common/node_id.h>
#include <common/setup.h>
#include <common/utils.h>
#include <common/wireaddr.h>
#include <stdio.h>
#include <wire/onion_wiregen.h>
#define MYLOG "/tmp/debug.txt"
#define RENEPAY_UNITTEST
#include "../payment.c"
#include "../flow.c"
#include "../route.c"
#include "../uncertainty.c"
#include "../mcf.c"
struct command_result *command_fail(struct command *cmd UNNEEDED, enum jsonrpc_errcode code UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "command_fail called!\n"); abort(); }
struct command_result *command_finished(struct command *cmd UNNEEDED, struct json_stream *response)
{ fprintf(stderr, "command_finished called!\n"); abort(); }
void disabledmap_add_channel(struct disabledmap *p UNNEEDED,
struct short_channel_id_dir scidd UNNEEDED)
{ fprintf(stderr, "disabledmap_add_channel called!\n"); abort(); }
void disabledmap_add_node(struct disabledmap *p UNNEEDED, struct node_id node UNNEEDED)
{ fprintf(stderr, "disabledmap_add_node called!\n"); abort(); }
bool disabledmap_channel_is_warned(struct disabledmap *p UNNEEDED,
struct short_channel_id_dir scidd UNNEEDED)
{ fprintf(stderr, "disabledmap_channel_is_warned called!\n"); abort(); }
struct disabledmap *disabledmap_new(const tal_t *ctx UNNEEDED)
{ fprintf(stderr, "disabledmap_new called!\n"); abort(); }
void disabledmap_reset(struct disabledmap *p UNNEEDED)
{ fprintf(stderr, "disabledmap_reset called!\n"); abort(); }
void disabledmap_warn_channel(struct disabledmap *p UNNEEDED,
struct short_channel_id_dir scidd UNNEEDED)
{ fprintf(stderr, "disabledmap_warn_channel called!\n"); abort(); }
void json_add_payment(struct json_stream *s UNNEEDED, const struct payment *payment UNNEEDED)
{ fprintf(stderr, "json_add_payment called!\n"); abort(); }
struct json_stream *jsonrpc_stream_success(struct command *cmd)
{ fprintf(stderr, "jsonrpc_stream_success called!\n"); abort(); }
struct routetracker *new_routetracker(const tal_t *ctx UNNEEDED, struct payment *payment UNNEEDED)
{ fprintf(stderr, "new_routetracker called!\n"); abort(); }
struct pay_plugin *pay_plugin;
void plugin_err(struct plugin *p UNNEEDED, const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "plugin_err called!\n"); abort(); }
void plugin_log(struct plugin *p UNNEEDED, enum log_level l UNNEEDED, const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "plugin_log called!\n"); abort(); }
void plugin_notify_message(struct command *cmd UNNEEDED,
enum log_level level UNNEEDED,
const char *fmt UNNEEDED, ...)
{ fprintf(stderr, "plugin_notify_message called!\n"); abort(); }
void routetracker_cleanup(struct routetracker *routetracker UNNEEDED)
{ fprintf(stderr, "routetracker_cleanup called!\n"); abort(); }
static const u8 canned_map[] = {
0x0f,0x60,0x00,0x01,0xb0,0x24,0x3a,0xa3,0x76,0x64,0x62,0x19,0xec,0x01,0x00,0x66,
0x7f,0x0f,0xad,0x6d,0x9d,0x58,0x1b,0x28,0x8a,0x67,0x9d,0xf8,0xd1,0x9d,0x79,0x4e,
0x67,0xc8,0x76,0xbb,0xdd,0x4d,0x8e,0x45,0x0d,0xc9,0x0e,0x24,0x76,0xda,0x44,0x68,
0x7b,0xe2,0x14,0xe8,0x48,0xfa,0xd7,0xc2,0x35,0xc5,0x98,0xd9,0x7a,0x6c,0xcb,0xb1,
0x4b,0x19,0xf9,0xfa,0xb2,0x19,0x3f,0x87,0xc1,0xe9,0x47,0x51,0x16,0x64,0x36,0x2a,
0xeb,0xc5,0xaa,0x20,0x59,0x4e,0xdf,0xae,0x4e,0x10,0x38,0x34,0x8e,0x06,0x6e,0x5d,
0x1b,0x44,0x30,0xfb,0x20,0xed,0xea,0xde,0x83,0xcd,0xa4,0x8a,0x5c,0xad,0x70,0x2d,
0x8b,0x04,0xfb,0xa2,0xbd,0x95,0x7c,0xdd,0x66,0xb5,0x4e,0xd6,0xc6,0x27,0xdb,0xa8,
0xe1,0x26,0x22,0x81,0x57,0xe2,0xaa,0xe4,0x82,0xbe,0x9e,0x90,0xc5,0xc2,0x59,0x56,
0x9b,0x79,0xf3,0xc3,0xfe,0x0c,0xb3,0x35,0xeb,0xba,0xad,0xf7,0xd3,0x24,0x4e,0x16,
0x15,0x2d,0x86,0xd9,0xe9,0xd2,0x38,0x9b,0xf9,0xb3,0x5f,0x2c,0x9b,0xeb,0xe0,0x1c,
0xb3,0xf0,0x0f,0xc1,0x9d,0x0b,0x20,0xa2,0x19,0xeb,0x1a,0x05,0x8b,0x8d,0xb1,0x22,
0x74,0x7c,0xa4,0x39,0x94,0x6f,0xfc,0x34,0x1b,0xe5,0x9f,0x45,0x8e,0x12,0x6e,0x65,
0x73,0x28,0x21,0x80,0xfd,0x9c,0x0c,0x89,0x2b,0xcb,0x43,0x2e,0x7f,0x47,0xa1,0xd7,
0x7e,0xa9,0xd7,0x3e,0xdd,0xa0,0xf8,0x60,0x9d,0xde,0x51,0x3d,0xc4,0x21,0x06,0x61,
0xb3,0x4d,0xd8,0x94,0x4a,0x3a,0xc9,0xb9,0xc3,0xcb,0x09,0xa3,0x2f,0x7b,0x96,0x53,
0x13,0x1d,0x6d,0x7a,0x28,0xdd,0xc8,0x8d,0xe4,0x10,0xad,0x4c,0xc6,0xa0,0x1b,0x00,
0x00,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,
0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,
0x0f,0x00,0x00,0x71,0x00,0x00,0x01,0x00,0x01,0x02,0x4f,0x9d,0xa0,0xd7,0x26,0xad,
0xf0,0xd9,0xa4,0xa3,0xac,0x32,0xe3,0x28,0xb9,0x3a,0xd5,0x27,0xcc,0xb9,0xdb,0x70,
0x77,0xc5,0x7a,0x12,0xc6,0xf9,0xfa,0x9a,0xdd,0x74,0x03,0x7f,0x97,0xaf,0x8e,0x4f,
0xa6,0x7c,0x9b,0x8d,0x69,0x70,0x84,0x95,0x36,0xf8,0x88,0xc3,0x04,0x31,0x6d,0x01,
0x5a,0xf5,0x12,0x9e,0x26,0x8e,0x01,0x64,0x96,0x1b,0x5e,0x02,0xca,0x1a,0xac,0x5f,
0x7b,0x86,0x3a,0x01,0xc8,0x69,0x90,0x82,0xdf,0x9a,0x4d,0xf8,0x14,0x0d,0xd6,0xe7,
0x10,0x59,0xd4,0xec,0x7f,0x48,0x13,0xb0,0x96,0xb4,0xa3,0xad,0x02,0x21,0x55,0x92,
0x46,0x1c,0x84,0x3d,0x40,0xe6,0x01,0x8d,0x3d,0x0c,0xb6,0xf4,0xe1,0x61,0xe2,0x4b,
0x59,0x41,0xdb,0x3b,0x20,0x44,0xbc,0x0c,0xb2,0x0e,0x4d,0x3f,0x9b,0x20,0x00,0x00,
0x0a,0x91,0x11,0x83,0xf6,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,
0x0f,0x42,0x40,0xe0,0x00,0x00,0x8a,0x01,0x3d,0x6f,0x9a,0x64,0x62,0x19,0xec,0x01,
0x02,0x4c,0x45,0x7e,0x21,0xb8,0xd5,0x36,0x98,0xcd,0x45,0x03,0x78,0xa6,0x51,0xf1,
0xda,0x1a,0xb4,0x46,0xed,0xfb,0xed,0x86,0xf9,0x31,0x85,0x2e,0x3d,0x80,0x77,0xf2,
0x13,0x76,0x91,0x08,0xe7,0x52,0x3d,0xf4,0xe5,0x2e,0x3b,0x80,0x2a,0xbf,0x54,0xf8,
0x80,0xbb,0x77,0x6f,0xc6,0xca,0x9e,0x3f,0xe8,0x96,0xfa,0x54,0x7e,0x94,0x78,0x0a,
0xec,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,
0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,
0x0f,0x00,0x00,0x71,0x00,0x00,0x01,0x00,0x01,0x64,0x62,0x19,0xec,0x01,0x00,0x00,
0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x0a,0x00,0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x60,0x00,0x00,0xa4,0x07,0xd2,0xf1,
0x5d,0x64,0x62,0x19,0xf1,0x01,0x01,0x4d,0xbe,0x8a,0xf5,0xd8,0x19,0x2b,0x99,0xb0,
0xa0,0xde,0x24,0x36,0x32,0x06,0xac,0x40,0x4c,0x41,0x94,0xc1,0xd3,0x85,0xb5,0xb8,
0x76,0xbf,0x98,0xa9,0x8e,0xdb,0xca,0x43,0x73,0x98,0xa0,0xe0,0x11,0xa9,0x95,0xf3,
0xce,0xde,0xe5,0x85,0x80,0x63,0x8c,0x12,0x11,0xee,0xee,0xa1,0x3e,0xcf,0x4e,0xd5,
0xae,0x8d,0x93,0x22,0xce,0xbb,0x02,0x00,0x07,0x88,0xa0,0x80,0x2a,0x02,0x69,0xa2,
0x64,0x62,0x19,0xf1,0x02,0x4f,0x9d,0xa0,0xd7,0x26,0xad,0xf0,0xd9,0xa4,0xa3,0xac,
0x32,0xe3,0x28,0xb9,0x3a,0xd5,0x27,0xcc,0xb9,0xdb,0x70,0x77,0xc5,0x7a,0x12,0xc6,
0xf9,0xfa,0x9a,0xdd,0x74,0x02,0x4f,0x9d,0x4c,0x4f,0x55,0x44,0x54,0x52,0x41,0x57,
0x4c,0x2d,0x2e,0x30,0x32,0x2d,0x33,0x37,0x2d,0x67,0x63,0x39,0x66,0x38,0x30,0x33,
0x35,0x2d,0x6d,0x6f,0x64,0x64,0x65,0x64,0x00,0x00,0x01,0x0d,0x02,0x9a,0x00,0x32,
0x00,0x64,0x00,0x00,0x00,0x02,0x4c,0x4b,0x40,0xe0,0x00,0x00,0x8a,0x06,0x22,0xaa,
0xb5,0x64,0x62,0x19,0xec,0x01,0x02,0x2b,0x9e,0x17,0x25,0x0f,0x3d,0x8c,0x1c,0x07,
0x6b,0xb8,0x7f,0xdc,0xc4,0x30,0xf4,0xa7,0xf8,0x8b,0x91,0x53,0xd6,0xc1,0x9d,0x06,
0xb9,0x18,0xfb,0xf0,0x0b,0x9a,0x79,0x2a,0x56,0x12,0x35,0x75,0x4e,0xf4,0xb8,0xb4,
0x2e,0x72,0x10,0x3c,0x8d,0x76,0x69,0x1c,0x67,0xb0,0x7f,0x94,0x07,0xee,0xb4,0x38,
0x11,0x0b,0x7f,0x62,0x4e,0x2a,0x2d,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,
0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,
0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x01,0x00,0x01,0x64,
0x62,0x19,0xec,0x01,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x20,
0x00,0x00,0xa4,0xde,0x6a,0x84,0x4d,0x64,0x62,0x19,0xf1,0x01,0x01,0x47,0x72,0x62,
0xe8,0xc7,0x43,0xa8,0x2e,0x1c,0x97,0x2a,0x06,0xce,0x2f,0xa2,0xfa,0x27,0x4f,0x28,
0x7f,0x55,0x32,0x19,0x62,0x58,0xc6,0x18,0x07,0x23,0x5f,0x8a,0x59,0x00,0x52,0x4d,
0xc9,0x18,0x22,0x9e,0xf7,0x87,0xa3,0x36,0x9d,0x01,0x73,0x7c,0x5b,0xb8,0xb4,0x08,
0x50,0x0f,0x89,0x52,0x3f,0x2e,0x44,0xa0,0xe0,0x32,0x3a,0xf7,0x20,0x00,0x07,0x88,
0xa0,0x80,0x2a,0x02,0x69,0xa2,0x64,0x62,0x19,0xf1,0x03,0x7f,0x97,0xaf,0x8e,0x4f,
0xa6,0x7c,0x9b,0x8d,0x69,0x70,0x84,0x95,0x36,0xf8,0x88,0xc3,0x04,0x31,0x6d,0x01,
0x5a,0xf5,0x12,0x9e,0x26,0x8e,0x01,0x64,0x96,0x1b,0x5e,0x03,0x7f,0x97,0x53,0x4c,
0x49,0x43,0x4b,0x45,0x52,0x43,0x48,0x49,0x50,0x4d,0x55,0x4e,0x4b,0x2d,0x2d,0x67,
0x63,0x39,0x66,0x38,0x30,0x33,0x35,0x2d,0x6d,0x6f,0x64,0x64,0x65,0x64,0x00,0x00,
0x01,0x0d,0x02,0x9a,0x00,0x32,0x00,0x64,0x00,0x00,0x00,0x02,0x4c,0x4b,0x40,0x20,
0x00,0x01,0xb0,0x31,0xd6,0x97,0xf8,0x64,0x62,0x19,0xec,0x01,0x00,0x3f,0x22,0x04,
0x81,0x00,0xfb,0xfe,0x52,0x4e,0xdf,0x7e,0xef,0x65,0xff,0x41,0xcf,0xfc,0x33,0xfc,
0x27,0xba,0x5b,0x5f,0xc5,0x40,0xd7,0xff,0x65,0x20,0x37,0x3f,0x00,0x0d,0x7c,0x9b,
0xa9,0xf1,0x8c,0xc6,0xf1,0xf7,0x30,0xd8,0x1a,0x44,0xea,0x6a,0xf8,0x95,0xde,0xe9,
0x35,0x5f,0x2b,0x09,0xc8,0x5e,0xf4,0xa4,0x58,0x5a,0xef,0x24,0x14,0x1e,0x17,0x5b,
0xb1,0xa7,0xbf,0x69,0xb6,0x44,0xbe,0xcc,0x37,0xb3,0x48,0x0a,0x83,0x37,0xfa,0xdb,
0x1d,0x2a,0x57,0x83,0x50,0x88,0x39,0xd7,0x2d,0xa6,0x70,0x19,0x94,0x63,0xa3,0x09,
0x57,0x47,0x80,0x47,0xa7,0x9b,0xb5,0x20,0x4a,0x33,0x67,0xf7,0x5c,0x5d,0x4c,0xa3,
0xc3,0x05,0x81,0x48,0xa7,0x5e,0x10,0x13,0x5d,0x64,0x4c,0x2e,0x53,0x28,0xd1,0x82,
0xc3,0x7d,0xbf,0xb2,0xcd,0x36,0xcc,0x1e,0xc6,0xc7,0x42,0x65,0x12,0x61,0x82,0x5d,
0xc7,0x3b,0x6a,0xaf,0x71,0xd4,0xf0,0xe9,0xff,0xdd,0x75,0x33,0x96,0x3e,0xb7,0x92,
0xc2,0xcd,0x0e,0xda,0xec,0x55,0x43,0x20,0x07,0xe8,0x9e,0xff,0x3f,0xea,0x2f,0x44,
0x64,0x43,0xe9,0xfd,0x82,0x0a,0xd4,0x1d,0xf6,0x14,0x02,0x30,0x78,0x34,0x02,0x62,
0x73,0x90,0x41,0x38,0xbe,0xc0,0xd2,0xac,0x59,0xc1,0x82,0xd2,0x6f,0x4e,0x28,0xd9,
0x2e,0x3c,0x6d,0x4b,0xa2,0x25,0xc9,0x46,0x42,0x95,0x64,0xb9,0x89,0x73,0x30,0xce,
0xb7,0xca,0x1a,0x78,0xac,0xa8,0x72,0x71,0xe8,0x1e,0x48,0xe9,0x7c,0xe5,0x49,0x78,
0x16,0x50,0x3e,0x26,0x15,0x4f,0xaf,0x7f,0x53,0x17,0x14,0xeb,0xa6,0x00,0x00,0x06,
0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,
0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,
0x00,0x71,0x00,0x00,0x03,0x00,0x01,0x02,0x45,0x1e,0x9b,0xaf,0xf8,0x1f,0xaf,0x5f,
0x41,0x0b,0x0b,0xbe,0x9e,0x36,0xee,0x83,0xbf,0x8f,0x79,0x69,0x8e,0x66,0x05,0xa5,
0x1a,0x97,0x48,0xbc,0x73,0xc7,0xdc,0x28,0x03,0x7f,0x97,0xaf,0x8e,0x4f,0xa6,0x7c,
0x9b,0x8d,0x69,0x70,0x84,0x95,0x36,0xf8,0x88,0xc3,0x04,0x31,0x6d,0x01,0x5a,0xf5,
0x12,0x9e,0x26,0x8e,0x01,0x64,0x96,0x1b,0x5e,0x02,0xd0,0xbf,0x3d,0xe0,0x25,0x7a,
0xe4,0x02,0x4a,0x88,0x2b,0x20,0x63,0xb4,0x68,0x6b,0x72,0x27,0x91,0xc2,0xe4,0x7a,
0xd1,0x75,0x93,0x5d,0xf3,0x3a,0xbe,0x99,0x7b,0x76,0x02,0x49,0x4d,0xb8,0x75,0x3e,
0x66,0xc7,0x73,0x63,0xec,0xf4,0x40,0xa4,0xcb,0xe5,0xe0,0x3e,0xc6,0x28,0x2b,0xea,
0x8a,0xd3,0x3f,0x66,0x4b,0xa3,0x9b,0x86,0x37,0xf7,0x7b,0x20,0x00,0x00,0x0a,0xea,
0x64,0x27,0x09,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x1e,0x84,
0x80,0xa0,0x00,0x00,0x8a,0x67,0x5f,0xf2,0xad,0x64,0x62,0x19,0xec,0x01,0x02,0x28,
0x06,0xbe,0x81,0x8d,0x13,0xe3,0xe9,0x45,0x09,0xdd,0x6a,0xbe,0x96,0xb5,0x08,0xe4,
0x87,0xca,0xfd,0x72,0xc1,0xfd,0xa9,0xe8,0x32,0x68,0x95,0x97,0x06,0x47,0x57,0x3a,
0x38,0x28,0x22,0xa1,0x78,0x45,0x22,0xd5,0xac,0x0d,0x1d,0x2f,0x25,0xf0,0x3a,0x11,
0x85,0x34,0xcc,0xae,0xf8,0xdd,0x44,0x05,0xdd,0xe6,0x6d,0xfc,0xc2,0xa0,0x7e,0x06,
0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,
0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,
0x00,0x71,0x00,0x00,0x03,0x00,0x01,0x64,0x62,0x19,0xec,0x01,0x00,0x00,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,
0x00,0x00,0x00,0x76,0x04,0x67,0x00,0xa0,0x00,0x00,0x8a,0xdc,0x8e,0xb4,0xa3,0x64,
0x62,0x19,0xec,0x01,0x02,0x27,0x9a,0x87,0xb6,0x8b,0xcb,0xc9,0x41,0xea,0xc3,0x1b,
0x18,0xf5,0x51,0x2f,0x9b,0x71,0xe3,0x8d,0x24,0x8d,0x1e,0x53,0xdc,0x83,0x6f,0x30,
0xfe,0x00,0xeb,0xbb,0x6b,0x35,0xc3,0x20,0xea,0xae,0x27,0xb4,0x8a,0xdc,0x30,0x9f,
0xb5,0xee,0xbf,0x3c,0x16,0x58,0xe1,0xa6,0xec,0x87,0xfd,0xb0,0x43,0x8c,0xed,0x4d,
0x00,0x2d,0x85,0x33,0xbe,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,
0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,
0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x03,0x00,0x01,0x64,0x62,0x19,
0xec,0x01,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x76,0x04,0x67,0x00,0x20,0x00,0x00,
0xa4,0x1e,0xb8,0x7e,0x0a,0x64,0x62,0x19,0xf1,0x01,0x01,0x70,0xc5,0x12,0xaa,0x59,
0xee,0xe5,0xb5,0x1f,0x4c,0x56,0x77,0xa1,0xc5,0x3c,0x6b,0x03,0x37,0xf9,0x8f,0xa9,
0x50,0xa7,0xe3,0x22,0x7b,0x6e,0x37,0xd5,0x46,0x03,0xff,0x12,0x91,0x0a,0xb8,0x4f,
0x35,0x63,0xdf,0xda,0x03,0xda,0xee,0x86,0xe4,0x43,0xef,0xa0,0x8a,0x90,0xeb,0xa8,
0xf3,0x7f,0x05,0x84,0x8a,0xd8,0xb0,0xf8,0x1b,0x4b,0xcf,0x00,0x07,0x88,0xa0,0x80,
0x2a,0x02,0x69,0xa2,0x64,0x62,0x19,0xf1,0x02,0x45,0x1e,0x9b,0xaf,0xf8,0x1f,0xaf,
0x5f,0x41,0x0b,0x0b,0xbe,0x9e,0x36,0xee,0x83,0xbf,0x8f,0x79,0x69,0x8e,0x66,0x05,
0xa5,0x1a,0x97,0x48,0xbc,0x73,0xc7,0xdc,0x28,0x02,0x45,0x1e,0x4c,0x4f,0x55,0x44,
0x54,0x4f,0x54,0x45,0x2d,0x33,0x2e,0x30,0x32,0x2d,0x33,0x37,0x2d,0x67,0x63,0x39,
0x66,0x38,0x30,0x33,0x35,0x2d,0x6d,0x6f,0x64,0x64,0x65,0x64,0x00,0x00,0x01,0x0d,
0x02,0x9a,0x00,0x32,0x00,0x64,0x00,0x00,0x00,0x02,0x4c,0x4b,0x40,0x20,0x00,0x01,
0xb0,0x17,0xe0,0xd7,0x83,0x64,0x62,0x19,0xed,0x01,0x00,0x48,0xa3,0x33,0x5f,0x33,
0x6c,0x33,0x85,0x0f,0xc7,0xeb,0x46,0x04,0x5a,0xe7,0x1a,0x2d,0xe1,0x37,0xb0,0xc3,
0x8a,0xa7,0x6a,0xe0,0xa2,0xfd,0x1f,0x30,0x9f,0xdc,0x8d,0x38,0x05,0xf7,0xaf,0x0b,
0xe6,0xb3,0x4d,0x62,0xb9,0xa4,0x9c,0x53,0x7d,0x6e,0x59,0x5b,0xb2,0x2b,0x5c,0xda,
0x35,0xf9,0x90,0x63,0x21,0xa8,0xb1,0x53,0xc3,0x35,0x7c,0x36,0x76,0x21,0x76,0xae,
0xa3,0xad,0x05,0x53,0xa7,0xbd,0x9d,0x38,0x54,0x03,0xc0,0x98,0x1d,0x66,0xc1,0x04,
0x39,0xc1,0x88,0xd1,0x1f,0x90,0x08,0x96,0xbc,0x59,0x54,0x4f,0x5f,0xa2,0x70,0xcd,
0xf0,0xda,0x96,0x3c,0x51,0x04,0x67,0x5c,0x1f,0x07,0xed,0xf9,0x9e,0x98,0xd0,0x3b,
0x5e,0x51,0xa9,0xa6,0x82,0xc1,0xed,0x35,0x45,0xa1,0xd6,0x36,0x3b,0xa1,0xe6,0x5d,
0x1f,0xec,0xe2,0xb7,0xf8,0xa2,0xe4,0x45,0xf9,0xb6,0xa7,0x07,0x18,0xc7,0xb5,0x0c,
0x08,0xd7,0x50,0x36,0x98,0x82,0xd3,0xc8,0x40,0xc8,0xdc,0x64,0x27,0xe2,0x14,0x42,
0x44,0x0a,0xe4,0x1d,0x41,0x61,0x57,0x88,0xfe,0xd2,0x51,0x99,0x24,0x55,0x1e,0x3b,
0xaa,0x8d,0xa7,0xb4,0xc0,0x6e,0xf5,0x70,0x8c,0x2a,0xe3,0x75,0xcc,0x36,0xbf,0xbe,
0xfc,0x3f,0x09,0x83,0x5e,0xe4,0x20,0x9a,0xcc,0x11,0x48,0x8e,0x2b,0xc8,0x8a,0xef,
0xc0,0x78,0x45,0xee,0x1e,0xc7,0xce,0x00,0xfc,0x3c,0x0e,0x32,0xd2,0x8f,0x15,0x8c,
0x02,0xb3,0x7b,0x4c,0xa9,0x7a,0x9c,0xec,0x5e,0x6e,0xf2,0xd3,0xd9,0x15,0x32,0xa3,
0x74,0x14,0xbf,0x1f,0xdd,0x2f,0x63,0x3c,0x47,0x04,0x6c,0x00,0x00,0x06,0x22,0x6e,
0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,
0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,
0x00,0x00,0x02,0x00,0x00,0x02,0x45,0x1e,0x9b,0xaf,0xf8,0x1f,0xaf,0x5f,0x41,0x0b,
0x0b,0xbe,0x9e,0x36,0xee,0x83,0xbf,0x8f,0x79,0x69,0x8e,0x66,0x05,0xa5,0x1a,0x97,
0x48,0xbc,0x73,0xc7,0xdc,0x28,0x02,0xd1,0xab,0x24,0xfe,0x53,0xcf,0xca,0xc4,0xa4,
0x77,0x74,0x52,0x35,0xc7,0xac,0x3e,0x75,0x16,0x1a,0x5b,0xf8,0x42,0x6e,0xa8,0xe0,
0x18,0x2a,0xd5,0x8c,0xab,0x36,0x7f,0x02,0x7e,0x2a,0xc0,0xec,0x93,0xfd,0xb3,0xfb,
0xe3,0x8d,0x7a,0x3f,0x5e,0xa0,0xa6,0x3d,0xdb,0xa9,0x8a,0x51,0xb7,0x7a,0xf5,0x51,
0x6f,0xe5,0xca,0x10,0x10,0xd7,0x95,0x34,0x02,0x17,0xd5,0xb1,0x80,0x7d,0x8b,0x95,
0x7c,0xe1,0x0b,0xb0,0xaf,0xf3,0xc1,0x84,0x81,0xee,0x2f,0xed,0x6a,0x7b,0x65,0x9c,
0xbf,0xfd,0x48,0x20,0xd0,0x9d,0x1a,0xfd,0xa4,0x20,0x00,0x00,0x0a,0x91,0x11,0x83,
0xf6,0x00,0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x0f,0x42,0x40,0xa0,
0x00,0x00,0x8a,0xbd,0x52,0xa0,0x78,0x64,0x62,0x19,0xed,0x01,0x02,0x40,0xf0,0x06,
0x07,0x97,0xb8,0x87,0xef,0x73,0xdc,0x1b,0xf0,0x20,0x31,0x55,0xc9,0xb9,0x6f,0xec,
0x6f,0xad,0x46,0x86,0x0a,0xcc,0xd9,0x95,0x61,0x62,0x15,0x84,0x70,0x2a,0x47,0xd7,
0x68,0xa9,0xbc,0x98,0xb3,0x1f,0xc4,0xbc,0x78,0xab,0x5d,0xf2,0xf7,0xc4,0x97,0x75,
0x21,0x13,0xcf,0xfc,0xd4,0x36,0xcd,0xf6,0xb4,0x85,0x7c,0xad,0x01,0x06,0x22,0x6e,
0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,
0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,
0x00,0x00,0x02,0x00,0x00,0x64,0x62,0x19,0xed,0x01,0x00,0x00,0x06,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,
0x00,0x3b,0x02,0x33,0x80,0xa0,0x00,0x00,0x8a,0xf5,0x5d,0xd1,0x12,0x64,0x62,0x19,
0xed,0x01,0x02,0x08,0x97,0x08,0x72,0xbe,0xc8,0x1e,0xd0,0xb9,0xb8,0x4b,0x0f,0x63,
0x5c,0xeb,0x28,0xa5,0xf8,0x7a,0x3d,0xa1,0x6a,0xb3,0xb4,0x30,0x91,0x31,0x57,0xd4,
0x5b,0x69,0x26,0x4d,0xd1,0xbb,0xd5,0x49,0x95,0xe9,0x75,0x53,0xa4,0xae,0x87,0xe9,
0x88,0xf6,0x86,0x1f,0x31,0x8f,0x35,0xf9,0x15,0xcc,0x04,0x0a,0x01,0xed,0x6e,0x47,
0xe0,0xea,0x68,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,
0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,
0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x02,0x00,0x00,0x64,0x62,0x19,0xed,0x01,
0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x20,0x00,0x00,0xa4,0x07,
0x3d,0xb7,0xfe,0x64,0x62,0x19,0xf2,0x01,0x01,0x29,0x2a,0x41,0x8f,0xb7,0x24,0xc2,
0x82,0xc5,0x75,0x0e,0x28,0xd9,0x8b,0xd4,0xad,0xa1,0xb1,0x9a,0x65,0xa8,0x7a,0x78,
0xc7,0x6c,0xc8,0x94,0xcb,0xf7,0xb1,0xb8,0x3b,0x29,0xce,0xbf,0xcc,0x47,0x1b,0x5a,
0xb4,0xec,0xab,0xa3,0xbe,0xaf,0xd1,0xde,0xd7,0x0e,0x8b,0xcc,0xaa,0xdb,0x6b,0x88,
0x51,0xb9,0x7a,0x0c,0xcd,0x1c,0x9c,0x4d,0x5c,0x00,0x07,0x88,0xa0,0x80,0x2a,0x02,
0x69,0xa2,0x64,0x62,0x19,0xf2,0x02,0xd1,0xab,0x24,0xfe,0x53,0xcf,0xca,0xc4,0xa4,
0x77,0x74,0x52,0x35,0xc7,0xac,0x3e,0x75,0x16,0x1a,0x5b,0xf8,0x42,0x6e,0xa8,0xe0,
0x18,0x2a,0xd5,0x8c,0xab,0x36,0x7f,0x02,0xd1,0xab,0x43,0x48,0x49,0x4c,0x4c,0x59,
0x46,0x49,0x52,0x45,0x2d,0x30,0x32,0x2d,0x33,0x37,0x2d,0x67,0x63,0x39,0x66,0x38,
0x30,0x33,0x35,0x2d,0x6d,0x6f,0x64,0x64,0x65,0x64,0x00,0x00,0x01,0x0d,0x02,0x9a,
0x00,0x32,0x00,0x64,0x00,0x00,0x00,0x02,0x4c,0x4b,0x40,0x20,0x00,0x01,0xb0,0x5f,
0xad,0x58,0xa1,0x64,0x62,0x19,0xed,0x01,0x00,0x63,0x42,0xba,0xf1,0x21,0xe0,0x09,
0x57,0x0d,0x40,0xa4,0xc6,0x05,0x78,0x02,0x8e,0x35,0x71,0x66,0x7c,0x24,0x51,0x3f,
0x58,0x3a,0xaa,0x14,0x65,0x5a,0x2b,0xbd,0x09,0x5b,0xd3,0xa8,0x4e,0x73,0x3e,0x38,
0xd3,0x4d,0x19,0x9c,0x18,0x04,0x60,0x57,0x32,0xd3,0x75,0xf5,0x36,0x15,0xc4,0x6a,
0xf1,0x1b,0x3d,0xc9,0x07,0x89,0x08,0x7a,0x37,0x2f,0xf1,0x89,0x12,0xdb,0xf2,0xff,
0x04,0xbd,0x93,0x23,0x00,0x3c,0x10,0x05,0x8a,0x58,0x9b,0x96,0xf3,0x76,0x94,0x16,
0x29,0x51,0xc8,0x76,0x89,0x61,0xc3,0x21,0xc0,0x0e,0x47,0xac,0xa3,0xbe,0xc7,0xfd,
0xa2,0x6b,0xe9,0x1d,0xe2,0x11,0x1c,0x3e,0xfc,0x6d,0x4d,0x0b,0x85,0xff,0xe9,0x8a,
0x39,0x3a,0xb3,0x0e,0x2f,0x28,0x96,0x6b,0x96,0x59,0x4d,0x53,0x71,0xd5,0x38,0x23,
0xe1,0xe0,0xad,0x0a,0xbf,0x00,0x58,0x15,0xbf,0x53,0x07,0xe1,0x13,0x06,0x88,0xb3,
0xf8,0x31,0x06,0x72,0x92,0x6f,0xd1,0xf0,0x9b,0x3b,0xf2,0x8f,0x9c,0xc6,0x73,0xf8,
0x91,0x3e,0x84,0xc0,0xed,0xdf,0x92,0x43,0x92,0x5f,0x4a,0x6b,0x96,0x02,0xaf,0xd9,
0xd9,0xd9,0xf9,0x65,0xae,0x08,0xd8,0x62,0x93,0x2b,0xb7,0xd3,0x48,0xe3,0x02,0x19,
0x53,0xf9,0x49,0x24,0xfa,0x22,0x24,0x87,0xc2,0xd2,0x0b,0xc0,0x56,0xae,0x09,0x5a,
0x94,0xc3,0x54,0x59,0xb5,0xe7,0xbe,0xa6,0x4a,0x47,0xc1,0x79,0x80,0xe8,0xc2,0xd1,
0xc5,0xda,0x6b,0x25,0x85,0xc6,0x02,0x32,0x8b,0x52,0x0e,0x7f,0x18,0x1c,0x5b,0xf6,
0xb9,0xaf,0x69,0xdc,0xc6,0x3d,0x93,0xc1,0x27,0x00,0x00,0x06,0x22,0x6e,0x46,0x11,
0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,
0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,
0x04,0x00,0x01,0x02,0xd1,0xab,0x24,0xfe,0x53,0xcf,0xca,0xc4,0xa4,0x77,0x74,0x52,
0x35,0xc7,0xac,0x3e,0x75,0x16,0x1a,0x5b,0xf8,0x42,0x6e,0xa8,0xe0,0x18,0x2a,0xd5,
0x8c,0xab,0x36,0x7f,0x03,0xca,0xec,0x54,0x08,0x55,0x08,0xda,0x06,0xf1,0x4f,0xfb,
0x83,0x61,0x66,0xca,0x22,0x04,0x2d,0x0f,0xda,0x69,0x69,0x03,0x56,0x23,0x2a,0x24,
0xb8,0x36,0x6c,0x8f,0x85,0x03,0xf6,0x19,0x62,0x15,0xf2,0x5c,0xfc,0x5c,0xae,0x8c,
0xb6,0x90,0xa7,0x81,0xe0,0x14,0xb5,0xc1,0xc5,0xda,0xf9,0x6d,0x44,0x6d,0x1a,0x6e,
0x24,0x4f,0xb6,0x42,0x3f,0xdb,0x03,0xf9,0x84,0xe3,0xec,0xa9,0x24,0x5d,0x1b,0xba,
0xd2,0xc7,0xf3,0x5a,0x32,0xaa,0x6e,0xdb,0x21,0xb6,0xe8,0xb1,0x86,0x5b,0x18,0x30,
0xe8,0x4d,0x23,0xa4,0x45,0x23,0x88,0x20,0x00,0x00,0x0a,0x08,0x85,0x8a,0xb2,0x00,
0x00,0x00,0x00,0x10,0x05,0x00,0x00,0x00,0x00,0x00,0x2d,0xc6,0xc0,0xa0,0x00,0x00,
0x8a,0xe9,0x51,0x74,0x9b,0x64,0x62,0x19,0xed,0x01,0x02,0x4b,0x82,0x87,0x3b,0xc9,
0x03,0x1c,0x6e,0xc9,0xbe,0x96,0x22,0x97,0xf7,0xa8,0xb0,0xb2,0x7c,0x22,0x69,0x23,
0x2d,0x97,0xfb,0x9b,0xc2,0xf1,0x1e,0x66,0xfb,0xfd,0x80,0x5d,0xd7,0xf0,0x23,0x31,
0x47,0xaa,0x54,0x8d,0x95,0xbb,0xdd,0x33,0x13,0x32,0x6d,0x91,0xc6,0x45,0xd5,0x84,
0xf4,0x76,0x6c,0x74,0xf3,0x51,0x45,0x24,0xee,0x5b,0xc3,0x06,0x22,0x6e,0x46,0x11,
0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,
0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,
0x04,0x00,0x01,0x64,0x62,0x19,0xed,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0xb1,
0x06,0x9a,0x80,0xa0,0x00,0x00,0x8a,0xd2,0xc8,0xd2,0x7c,0x64,0x62,0x19,0xed,0x01,
0x02,0x0f,0x90,0xcb,0xb6,0xa1,0x44,0x65,0x10,0x00,0xae,0x2f,0x60,0x26,0x2f,0x41,
0x58,0x5b,0xab,0xde,0xff,0x7e,0x11,0x44,0xf4,0x2e,0x96,0x96,0xfa,0x98,0x09,0xee,
0xb1,0x5d,0x43,0xff,0x44,0x7b,0xa6,0x03,0xf6,0x4a,0x07,0x38,0x97,0x59,0xee,0x5e,
0xee,0xcb,0xdb,0x77,0x69,0xab,0x61,0xd8,0xc3,0x42,0xb3,0x1f,0x57,0xea,0xf3,0xfd,
0xe2,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,
0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,
0x0f,0x00,0x00,0x71,0x00,0x00,0x04,0x00,0x01,0x64,0x62,0x19,0xed,0x01,0x01,0x00,
0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0x0a,0x00,0x00,0x00,0x00,0xb1,0x06,0x9a,0x80,0x60,0x00,0x00,0x8a,0x64,0xa7,0x4f,
0x57,0x64,0x62,0x19,0xf7,0x01,0x02,0x28,0x15,0x9f,0xa7,0x51,0x3a,0xbb,0x33,0xd9,
0x25,0xaa,0x7d,0xe8,0xfb,0x3a,0x92,0x45,0x41,0xb3,0x22,0x9b,0x12,0x3b,0xb0,0x16,
0x47,0xd6,0xf7,0x61,0x44,0x1d,0xa7,0x35,0xfe,0xa9,0x7b,0xa6,0x42,0x91,0x3f,0x5e,
0xe4,0xca,0x98,0x1c,0x0f,0x2d,0xed,0x36,0x0e,0x2b,0x2e,0x08,0x81,0x2e,0xcc,0xc1,
0x76,0x61,0xf9,0x1b,0xd3,0x44,0x3e,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,
0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,
0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x01,0x00,0x01,0x64,
0x62,0x19,0xf7,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0a,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x20,
0x00,0x00,0xa4,0x30,0x77,0x80,0xee,0x64,0x62,0x19,0xf2,0x01,0x01,0x67,0x07,0x1d,
0x3b,0x62,0x2d,0xb7,0x1a,0xba,0xb8,0x93,0x56,0xaa,0xfa,0xb1,0x47,0x4f,0x0e,0x02,
0x8b,0x73,0xd5,0x5b,0xce,0xd6,0x40,0x55,0xaf,0xa7,0x29,0xd0,0x51,0x24,0x5a,0x19,
0x22,0xc6,0x7b,0x6e,0x4a,0xae,0x57,0x9c,0x16,0x99,0x46,0x6c,0xc3,0x64,0xd8,0x20,
0x10,0x44,0x1e,0xd0,0x6b,0x8d,0x36,0xdc,0xae,0x75,0x06,0x6e,0xdc,0x00,0x07,0x88,
0xa0,0x80,0x2a,0x02,0x69,0xa2,0x64,0x62,0x19,0xf2,0x03,0xca,0xec,0x54,0x08,0x55,
0x08,0xda,0x06,0xf1,0x4f,0xfb,0x83,0x61,0x66,0xca,0x22,0x04,0x2d,0x0f,0xda,0x69,
0x69,0x03,0x56,0x23,0x2a,0x24,0xb8,0x36,0x6c,0x8f,0x85,0x03,0xca,0xec,0x56,0x49,
0x4f,0x4c,0x45,0x54,0x53,0x45,0x54,0x2d,0x2e,0x30,0x32,0x2d,0x33,0x37,0x2d,0x67,
0x63,0x39,0x66,0x38,0x30,0x33,0x35,0x2d,0x6d,0x6f,0x64,0x64,0x65,0x64,0x00,0x00,
0x01,0x0d,0x02,0x9a,0x00,0x32,0x00,0x64,0x00,0x00,0x00,0x02,0x4c,0x4b,0x40,0x60,
0x00,0x00,0x8a,0x07,0xf6,0xe8,0x9b,0x64,0x62,0x19,0xf7,0x01,0x02,0x62,0xf7,0xdc,
0xf1,0xa6,0x3c,0xf0,0xae,0x64,0x9c,0x03,0x62,0x98,0x6a,0x18,0x78,0x97,0xed,0x8c,
0x2e,0x3f,0xc4,0x1d,0x9f,0xa7,0xfb,0x58,0x26,0x48,0x2e,0x96,0x9d,0x33,0x75,0x60,
0x6e,0x33,0x95,0xf7,0x6e,0x9f,0x4f,0xa2,0xed,0xd6,0xa9,0x83,0x1b,0x94,0x79,0xee,
0x4f,0xdc,0x20,0xc5,0x39,0x74,0x0d,0x31,0x52,0xc7,0x25,0x36,0x47,0x06,0x22,0x6e,
0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,
0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,
0x00,0x00,0x01,0x00,0x01,0x64,0x62,0x19,0xf7,0x01,0x01,0x00,0x06,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,
0x00,0x3b,0x02,0x33,0x80,0x20,0x00,0x00,0x8a,0x16,0x2b,0xff,0x08,0x64,0x62,0x19,
0xf7,0x01,0x02,0x39,0x36,0x2a,0x56,0x61,0xad,0x48,0x3f,0x4e,0x13,0x15,0x66,0x43,
0x58,0xc5,0xc2,0x14,0x6e,0xb2,0x72,0xfa,0x73,0xd7,0xb5,0x2d,0x86,0x14,0xc2,0xe8,
0xf7,0x53,0x8f,0x38,0xea,0x35,0x5c,0xec,0xe3,0xc7,0xc0,0x46,0x1c,0x9f,0x1d,0x93,
0x94,0x31,0x1f,0xf8,0x49,0xb1,0x50,0x4c,0x2c,0x2f,0xc7,0xe4,0x0c,0xaa,0xd0,0xa9,
0x53,0x14,0xca,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,
0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,
0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x03,0x00,0x01,0x64,0x62,0x19,0xf7,0x01,
0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x76,0x04,0x67,0x00,0x20,0x00,0x00,0x8a,0xd5,
0x4a,0x70,0x0c,0x64,0x62,0x19,0xf7,0x01,0x02,0x54,0x16,0x95,0x41,0x4f,0x0e,0x0f,
0xdf,0x49,0xb5,0x87,0xdc,0x26,0xb4,0xef,0x73,0x3c,0xb8,0x19,0x96,0x62,0x87,0xfa,
0x4f,0x02,0x53,0xbe,0x12,0x53,0x93,0x4b,0x57,0x3b,0xe9,0xb9,0x26,0x46,0xda,0x77,
0xaa,0xdd,0x8d,0xf6,0x86,0x22,0xf0,0x3f,0xd5,0x56,0xdd,0xaa,0xa2,0x4e,0x4a,0x9a,
0x70,0x81,0xf8,0xf9,0x72,0x7b,0xd7,0x90,0x48,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,
0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,
0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x03,0x00,
0x01,0x64,0x62,0x19,0xf7,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x76,0x04,0x67,
0x00,0x20,0x00,0x00,0x8a,0xc5,0x6d,0x8a,0x5a,0x64,0x62,0x19,0xf6,0x01,0x02,0x1d,
0x80,0x09,0x30,0x1a,0x4b,0x26,0x60,0x6b,0x9a,0x54,0x8d,0x7f,0x9b,0x35,0x78,0x76,
0x7a,0xc1,0xe5,0x22,0xdc,0x08,0x77,0xac,0x54,0xc7,0xc0,0x9b,0x13,0x85,0x20,0x2c,
0xa4,0xa3,0x7e,0xc5,0xde,0xfd,0x60,0x43,0xdb,0x2e,0xb0,0x5b,0xcc,0x95,0xc1,0xf3,
0x02,0x09,0x8a,0xe1,0x55,0x2a,0x8a,0x9a,0x18,0xe5,0xa9,0xee,0xcd,0x11,0x27,0x06,
0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,
0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,
0x00,0x71,0x00,0x00,0x02,0x00,0x00,0x64,0x62,0x19,0xf6,0x01,0x00,0x00,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x96,0x00,
0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x20,0x00,0x00,0x8a,0x67,0xa5,0x58,0xd4,0x64,
0x62,0x19,0xf6,0x01,0x02,0x5a,0xa5,0x3e,0xb8,0x73,0xf5,0xdf,0xfc,0x72,0x16,0x52,
0xa1,0x07,0x8a,0x2b,0xf1,0xc3,0x92,0xc5,0x87,0xa4,0x45,0x07,0x1e,0xb3,0x7d,0x4c,
0x1c,0x47,0x41,0x2c,0x93,0x14,0x46,0x16,0xba,0xe4,0xf9,0xc9,0x52,0x4c,0x5e,0x6c,
0x4f,0xc9,0xec,0xde,0x83,0x15,0xe0,0x8e,0x39,0xbe,0xa9,0x8f,0x9d,0xfe,0xcf,0xc4,
0x12,0x32,0xa4,0x17,0x2b,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,
0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,
0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,0x02,0x00,0x00,0x64,0x62,0x19,
0xf6,0x01,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x3b,0x02,0x33,0x80,0x20,0x00,0x00,
0x8a,0x2f,0x71,0xed,0xec,0x64,0x62,0x19,0xf6,0x01,0x02,0x75,0x4f,0x11,0x1c,0x56,
0x9f,0x4a,0x9d,0x6f,0x98,0x96,0x1c,0x5a,0x9f,0x0f,0xb9,0x24,0x23,0x82,0x7d,0x86,
0xcf,0xbc,0x41,0x14,0x38,0x76,0x2e,0x86,0x47,0x96,0xef,0x14,0x91,0x2e,0x30,0xe2,
0x4b,0x1c,0x47,0x2d,0x4a,0xdc,0xf6,0x79,0xb6,0x11,0x80,0xcc,0x51,0xbb,0xc4,0x29,
0x33,0x60,0xc1,0x78,0x1e,0x82,0xe3,0x40,0xc0,0xf7,0x25,0x06,0x22,0x6e,0x46,0x11,
0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,0xbf,0x28,0xc3,0x4f,0x3a,0x5e,
0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,0x0f,0x00,0x00,0x71,0x00,0x00,
0x04,0x00,0x01,0x64,0x62,0x19,0xf6,0x01,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0xb1,
0x06,0x9a,0x80,0x20,0x00,0x00,0x8a,0xc8,0x56,0xb7,0xb1,0x64,0x62,0x19,0xf6,0x01,
0x02,0x3c,0x76,0x7a,0x28,0x5e,0x65,0x30,0xac,0x0d,0x0f,0x43,0x31,0x02,0x56,0xcd,
0x14,0x51,0x46,0x69,0x33,0xa0,0x12,0x61,0x9c,0x34,0xc5,0xd8,0x9a,0x0c,0x81,0x94,
0xad,0x5e,0x98,0xc4,0xd0,0x45,0x3d,0x32,0x84,0xdd,0xd7,0x18,0x2b,0xdb,0x13,0xa8,
0xfc,0xb2,0x0d,0xd6,0xf6,0x8a,0x97,0xc7,0xe9,0x7e,0x27,0xb7,0x86,0x7a,0x3e,0xee,
0xfa,0x06,0x22,0x6e,0x46,0x11,0x1a,0x0b,0x59,0xca,0xaf,0x12,0x60,0x43,0xeb,0x5b,
0xbf,0x28,0xc3,0x4f,0x3a,0x5e,0x33,0x2a,0x1f,0xc7,0xb2,0xb7,0x3c,0xf1,0x88,0x91,
0x0f,0x00,0x00,0x71,0x00,0x00,0x04,0x00,0x01,0x64,0x62,0x19,0xf6,0x01,0x01,0x00,
0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x01,
0x2c,0x00,0x00,0x00,0x00,0xb1,0x06,0x9a,0x80,
};
static void test_edge_probability(void)
{
const double eps = 1e-8;
struct amount_msat min = AMOUNT_MSAT(10); struct amount_msat max = AMOUNT_MSAT(19);
struct amount_msat X = AMOUNT_MSAT(0); struct amount_msat f;
for(int i=0;i<=min.millisatoshis;++i)
{
f.millisatoshis = i;
assert(fabs(edge_probability(min,max,X,f)-1.0)< eps);
}
for(int i=max.millisatoshis+1;i<=100;++i)
{
f.millisatoshis = i;
assert(fabs(edge_probability(min,max,X,f))< eps);
}
f.millisatoshis=11;
assert(fabs(edge_probability(min,max,X,f)-0.9)< eps);
f.millisatoshis=12;
assert(fabs(edge_probability(min,max,X,f)-0.8)< eps);
f.millisatoshis=13;
assert(fabs(edge_probability(min,max,X,f)-0.7)< eps);
f.millisatoshis=14;
assert(fabs(edge_probability(min,max,X,f)-0.6)< eps);
f.millisatoshis=15;
assert(fabs(edge_probability(min,max,X,f)-0.5)< eps);
f.millisatoshis=16;
assert(fabs(edge_probability(min,max,X,f)-0.4)< eps);
f.millisatoshis=17;
assert(fabs(edge_probability(min,max,X,f)-0.3)< eps);
f.millisatoshis=18;
assert(fabs(edge_probability(min,max,X,f)-0.2)< eps);
f.millisatoshis=19;
assert(fabs(edge_probability(min,max,X,f)-0.1)< eps);
X = AMOUNT_MSAT(5);
for(int i=0;i<=5;++i)
{
f.millisatoshis = i;
assert(fabs(edge_probability(min,max,X,f)-1.0)< eps);
}
for(int i=15;i<100;++i)
{
f.millisatoshis = i;
assert(fabs(edge_probability(min,max,X,f))< eps);
}
f.millisatoshis=6;
assert(fabs(edge_probability(min,max,X,f)-0.9)< eps);
f.millisatoshis=7;
assert(fabs(edge_probability(min,max,X,f)-0.8)< eps);
f.millisatoshis=8;
assert(fabs(edge_probability(min,max,X,f)-0.7)< eps);
f.millisatoshis=9;
assert(fabs(edge_probability(min,max,X,f)-0.6)< eps);
f.millisatoshis=10;
assert(fabs(edge_probability(min,max,X,f)-0.5)< eps);
f.millisatoshis=11;
assert(fabs(edge_probability(min,max,X,f)-0.4)< eps);
f.millisatoshis=12;
assert(fabs(edge_probability(min,max,X,f)-0.3)< eps);
f.millisatoshis=13;
assert(fabs(edge_probability(min,max,X,f)-0.2)< eps);
f.millisatoshis=14;
assert(fabs(edge_probability(min,max,X,f)-0.1)< eps);
X = AMOUNT_MSAT(15);
for(int i=5;i<100;++i)
{
f.millisatoshis = i;
assert(fabs(edge_probability(min,max,X,f))< eps);
}
f.millisatoshis=0;
assert(fabs(edge_probability(min,max,X,f)-1.0)< eps);
f.millisatoshis=1;
assert(fabs(edge_probability(min,max,X,f)-0.8)< eps);
f.millisatoshis=2;
assert(fabs(edge_probability(min,max,X,f)-0.6)< eps);
f.millisatoshis=3;
assert(fabs(edge_probability(min,max,X,f)-0.4)< eps);
f.millisatoshis=4;
assert(fabs(edge_probability(min,max,X,f)-0.2)< eps);
f.millisatoshis=5;
assert(fabs(edge_probability(min,max,X,f)-0.0)< eps);
}
static void remove_file(char *fname) { assert(!remove(fname)); }
static void test_flow_to_route(void)
{
const double eps = 1e-8;
const tal_t *this_ctx = tal(tmpctx, tal_t);
char *gossfile;
int fd = tmpdir_mkstemp(this_ctx,"run-testflow.XXXXXX",&gossfile);
tal_add_destructor(gossfile, remove_file);
assert(write_all(fd,canned_map,sizeof(canned_map)));
struct gossmap *gossmap = gossmap_load(this_ctx,gossfile,NULL,NULL);
assert(gossmap);
struct node_id l1, l2, l3, l4, l5;
assert(node_id_from_hexstr("024f9da0d726adf0d9a4a3ac32e328b93ad527ccb9db7077c57a12c6f9fa9add74", 66, &l1));
assert(node_id_from_hexstr("037f97af8e4fa67c9b8d6970849536f888c304316d015af5129e268e0164961b5e", 66, &l2));
assert(node_id_from_hexstr("02451e9baff81faf5f410b0bbe9e36ee83bf8f79698e6605a51a9748bc73c7dc28", 66, &l3));
assert(node_id_from_hexstr("02d1ab24fe53cfcac4a477745235c7ac3e75161a5bf8426ea8e0182ad58cab367f", 66, &l4));
assert(node_id_from_hexstr("03caec54085508da06f14ffb836166ca22042d0fda69690356232a24b8366c8f85", 66, &l5));
struct short_channel_id scid12, scid23, scid34,scid45;
assert(short_channel_id_from_str("113x1x1", 7, &scid12));
assert(short_channel_id_from_str("113x3x1", 7, &scid23));
assert(short_channel_id_from_str("113x2x0", 7, &scid34));
assert(short_channel_id_from_str("113x4x1", 7, &scid45));
struct chan_extra_map *chan_extra_map = tal(this_ctx, struct chan_extra_map);
chan_extra_map_init(chan_extra_map);
struct chan_extra_half *h0,*h1;
struct gossmap_chan *c;
struct amount_msat cap;
struct amount_msat sum_min1_max0,sum_min0_max1;
c = gossmap_find_chan(gossmap,&scid12);
cap = gossmap_chan_get_capacity(gossmap,c);
h0 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,0);
assert(h0);
h0->known_min = AMOUNT_MSAT(0);
h0->known_max = AMOUNT_MSAT(500000000);
h1 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,1);
assert(h1);
h1->known_min = AMOUNT_MSAT(500000000);
h1->known_max = AMOUNT_MSAT(1000000000);
assert(amount_msat_less_eq(h0->known_min,h0->known_max));
assert(amount_msat_less_eq(h0->known_max,cap));
assert(amount_msat_less_eq(h1->known_min,h1->known_max));
assert(amount_msat_less_eq(h1->known_max,cap));
assert(amount_msat_add(&sum_min1_max0,h1->known_min,h0->known_max));
assert(amount_msat_add(&sum_min0_max1,h0->known_min,h1->known_max));
assert(amount_msat_eq(sum_min1_max0,cap));
assert(amount_msat_eq(sum_min0_max1,cap));
c = gossmap_find_chan(gossmap,&scid23);
cap = gossmap_chan_get_capacity(gossmap,c);
h1 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,1);
assert(h1);
h1->known_min = AMOUNT_MSAT(0);
h1->known_max = AMOUNT_MSAT(2000000000);
h0 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,0);
assert(h0);
h0->known_min = AMOUNT_MSAT(0);
h0->known_max = AMOUNT_MSAT(2000000000);
assert(amount_msat_less_eq(h0->known_min,h0->known_max));
assert(amount_msat_less_eq(h0->known_max,cap));
assert(amount_msat_less_eq(h1->known_min,h1->known_max));
assert(amount_msat_less_eq(h1->known_max,cap));
assert(amount_msat_add(&sum_min1_max0,h1->known_min,h0->known_max));
assert(amount_msat_add(&sum_min0_max1,h0->known_min,h1->known_max));
assert(amount_msat_eq(sum_min1_max0,cap));
assert(amount_msat_eq(sum_min0_max1,cap));
c = gossmap_find_chan(gossmap,&scid34);
cap = gossmap_chan_get_capacity(gossmap,c);
h0 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,0);
assert(h0);
h0->known_min = AMOUNT_MSAT(500000000);
h0->known_max = AMOUNT_MSAT(1000000000);
h1 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,1);
assert(h1);
h1->known_min = AMOUNT_MSAT(0);
h1->known_max = AMOUNT_MSAT(500000000);
assert(amount_msat_less_eq(h0->known_min,h0->known_max));
assert(amount_msat_less_eq(h0->known_max,cap));
assert(amount_msat_less_eq(h1->known_min,h1->known_max));
assert(amount_msat_less_eq(h1->known_max,cap));
assert(amount_msat_add(&sum_min1_max0,h1->known_min,h0->known_max));
assert(amount_msat_add(&sum_min0_max1,h0->known_min,h1->known_max));
assert(amount_msat_eq(sum_min1_max0,cap));
assert(amount_msat_eq(sum_min0_max1,cap));
c = gossmap_find_chan(gossmap,&scid45);
cap = gossmap_chan_get_capacity(gossmap,c);
h0 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,0);
assert(h0);
h0->known_min = AMOUNT_MSAT(1000000000);
h0->known_max = AMOUNT_MSAT(2000000000);
h1 = get_chan_extra_half_by_chan_verify(gossmap,chan_extra_map,c,1);
assert(h1);
h1->known_min = AMOUNT_MSAT(1000000000);
h1->known_max = AMOUNT_MSAT(2000000000);
assert(amount_msat_less_eq(h0->known_min,h0->known_max));
assert(amount_msat_less_eq(h0->known_max,cap));
assert(amount_msat_less_eq(h1->known_min,h1->known_max));
assert(amount_msat_less_eq(h1->known_max,cap));
assert(amount_msat_add(&sum_min1_max0,h1->known_min,h0->known_max));
assert(amount_msat_add(&sum_min0_max1,h0->known_min,h1->known_max));
assert(amount_msat_eq(sum_min1_max0,cap));
assert(amount_msat_eq(sum_min0_max1,cap));
struct flow *F;
struct route *route;
struct sha256 payment_hash;
struct amount_msat deliver;
if (!hex_decode("0001020304050607080900010203040506070809000102030405060708090102",
strlen("0001020304050607080900010203040506070809000102030405060708090102"),
&payment_hash, sizeof(payment_hash)))
abort();
F = tal(this_ctx, struct flow);
F->path = tal_arr(F,const struct gossmap_chan *,1);
F->dirs = tal_arr(F,int,1);
F->path[0]=gossmap_find_chan(gossmap,&scid12);
F->dirs[0]=0;
deliver = AMOUNT_MSAT(250000000);
F->amount = deliver;
route = flow_to_route(this_ctx, 1, 1, payment_hash, 0, gossmap, F, false);
assert(route);
assert(amount_msat_eq(route->hops[0].amount, deliver));
assert(fabs(flow_probability(F, gossmap, chan_extra_map, true) - 0.5)<eps);
F = tal(this_ctx, struct flow);
F->path = tal_arr(F,const struct gossmap_chan *,2);
F->dirs = tal_arr(F,int,2);
F->path[0]=gossmap_find_chan(gossmap,&scid34);
F->path[1]=gossmap_find_chan(gossmap,&scid45);
F->dirs[0]=0;
F->dirs[1]=0;
deliver = AMOUNT_MSAT(250000000);
F->amount=deliver;
route = flow_to_route(this_ctx, 1, 1, payment_hash, 0, gossmap, F, false);
assert(route);
assert(amount_msat_eq(route->hops[0].amount, amount_msat(250050016)));
assert(fabs(flow_probability(F, gossmap, chan_extra_map, true) - 1.)<eps);
F = tal(this_ctx, struct flow);
F->path = tal_arr(F,const struct gossmap_chan *,3);
F->dirs = tal_arr(F,int,3);
F->path[0]=gossmap_find_chan(gossmap,&scid23);
F->path[1]=gossmap_find_chan(gossmap,&scid34);
F->path[2]=gossmap_find_chan(gossmap,&scid45);
F->dirs[0]=1;
F->dirs[1]=0;
F->dirs[2]=0;
deliver = AMOUNT_MSAT(250000000);
F->amount=deliver;
route = flow_to_route(this_ctx, 1, 1, payment_hash, 0, gossmap, F, false);
assert(route);
assert(amount_msat_eq(route->hops[0].amount, amount_msat(250087534)));
assert(fabs(flow_probability(F, gossmap, chan_extra_map, true) - 1. + 250.087534/2000)<eps);
F = tal(this_ctx, struct flow);
F->path = tal_arr(F,const struct gossmap_chan *,4);
F->dirs = tal_arr(F,int,4);
F->path[0]=gossmap_find_chan(gossmap,&scid12);
F->path[1]=gossmap_find_chan(gossmap,&scid23);
F->path[2]=gossmap_find_chan(gossmap,&scid34);
F->path[3]=gossmap_find_chan(gossmap,&scid45);
F->dirs[0]=0;
F->dirs[1]=1;
F->dirs[2]=0;
F->dirs[3]=0;
deliver = AMOUNT_MSAT(250000000);
F->amount=deliver;
route = flow_to_route(this_ctx, 1, 1, payment_hash, 0, gossmap, F, false);
assert(route);
assert(amount_msat_eq(route->hops[0].amount, amount_msat(250112544)));
assert(fabs(flow_probability(F, gossmap, chan_extra_map, true) - 0.43728117)<eps);
tal_free(this_ctx);
}
static void test_channel_maximum_forward(void)
{
const tal_t *this_ctx = tal(tmpctx, tal_t);
char *gossfile;
int fd = tmpdir_mkstemp(this_ctx, "run-testflow.XXXXXX", &gossfile);
tal_add_destructor(gossfile, remove_file);
assert(write_all(fd, canned_map, sizeof(canned_map)));
struct gossmap *gossmap = gossmap_load(this_ctx, gossfile, NULL, NULL);
assert(gossmap);
struct short_channel_id scid12;
assert(short_channel_id_from_str("113x1x1", 7, &scid12));
struct gossmap_chan *c;
c = gossmap_find_chan(gossmap, &scid12);
const u64 test_in[] = {
0, 1, 2, 3,
10, 11, 12, 20,
30, 100, 110, 111,
200, 300, 1000, 2000,
3000, 10000, 10025, 20000,
1000000, 1100032, 2000000, 3000000,
1000000000, 2000000000, 3000000000, 1000000000000 };
const u64 test_basefee[] = {
0, 1, 2, 3, 4, 10, 20, 30,
100, 200, 1000, 2000, 10000, 10001, 10002, 10010,
10011, 10012, 20000, 1000000, 2000000, 1 << 23, (1 << 24) - 1};
const u64 test_ppm[] = {0, 1, 2, 3, 4,
10, 20, 30, 100, 200,
300, 1000, 2000, 3000, 10000,
20000, 30000, 11111, 100000, 100001,
200000, 500000, 900000, 999999, 1000000};
const size_t N_in = sizeof(test_in) / sizeof(test_in[0]);
for (int i = 0; i < N_in; ++i) {
const struct amount_msat in = amount_msat(test_in[i]);
const size_t N_base =
sizeof(test_basefee) / sizeof(test_basefee[0]);
for (int j = 0; j < N_base; ++j) {
const u64 basefee = test_basefee[j];
const size_t N_ppm =
sizeof(test_ppm) / sizeof(test_ppm[0]);
for (int k = 0; k < N_ppm; ++k) {
const u64 ppm = test_ppm[k];
c->half[0].base_fee = basefee;
c->half[0].proportional_fee = ppm;
struct amount_msat out;
assert(channel_maximum_forward(
&out, c, 0, in) == RENEPAY_NOERROR);
assert(check_fee_inequality(in, out, basefee,
ppm));
assert(
amount_msat_add(&out, out, amount_msat(1)));
assert(!check_fee_inequality(in, out, basefee,
ppm));
}
}
}
tal_free(this_ctx);
}
int main(int argc, char *argv[])
{
common_setup(argv[0]);
test_edge_probability();
test_flow_to_route();
test_channel_maximum_forward();
common_shutdown();
}