diff options
52 files changed, 4831 insertions, 2964 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 4146ebc71a0..83087204567 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -37,40 +37,113 @@ struct bNodeTree; struct bNode; struct bNodeLink; struct bNodeSocket; +struct bNodeStack; +struct uiBlock; +struct rctf; struct ListBase; #define SOCK_IN 1 #define SOCK_OUT 2 +/* ************** NODE TYPE DEFINITIONS ***** */ -/* ************** GENERIC API *************** */ +typedef struct bNodeSocketType { + int type, limit; + char *name; + float val1, val2, val3, val4; /* default alloc value for inputs */ + float min, max; /* default range for inputs */ + + /* after this line is used internal only */ + struct bNodeSocket *sock; /* to verify */ + +} bNodeSocketType; -void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node); -void nodeFreeTree(struct bNodeTree *ntree); +typedef struct bNodeType { + int type; + char *name; + float width, minwidth, maxwidth; + short nclass, flag; + + bNodeSocketType *inputs, *outputs; + + char storagename[64]; /* struct name for DNA */ + + void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **); + + /* after this line is set on startup of blender */ + int (*butfunc)(struct uiBlock *, struct bNode *, rctf *); -struct bNode *nodeAddNode(struct bNodeTree *ntree, char *name); -struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock); +} bNodeType; + +/* nodetype->nclass, also for themes */ +#define NODE_CLASS_INPUT 0 +#define NODE_CLASS_OUTPUT 1 +#define NODE_CLASS_GENERATOR 2 +#define NODE_CLASS_OPERATOR 3 + +/* ************** GENERIC API, TREES *************** */ + +struct bNodeTree *ntreeAddTree(int type); +void ntreeInitTypes(struct bNodeTree *ntree); +void ntreeFreeTree(struct bNodeTree *ntree); +struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select); + +void ntreeSolveOrder(struct bNodeTree *ntree); + +void ntreeBeginExecTree(struct bNodeTree *ntree, int xsize, int ysize); +void ntreeExecTree(struct bNodeTree *ntree); +void ntreeEndExecTree(struct bNodeTree *ntree); +void ntreeClearPixelTree(struct bNodeTree *, int, int); + +/* ************** GENERIC API, NODES *************** */ + +void nodeAddToPreview(struct bNode *, float *, int, int); + +struct bNode *nodeAddNodeType(struct bNodeTree *ntree, int type); +void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node); struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node); -struct bNodeSocket *nodeAddSocket(struct bNode *node, int type, int where, int limit, char *name); +struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock); +void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to); int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); - -void nodeSolveOrder(struct bNodeTree *ntree); -void nodeExecTree(struct bNodeTree *ntree); +struct bNode *nodeGetActive(struct bNodeTree *ntree); +struct bNode *nodeGetActiveID(struct bNodeTree *ntree, short idtype); /* ************** SHADER NODES *************** */ -/* types are needed to restore callbacks */ -#define SH_NODE_TEST 0 -#define SH_NODE_RGB 1 -#define SH_NODE_VALUE 2 -#define SH_NODE_MIX_RGB 3 -#define SH_NODE_SHOW_RGB 4 +struct ShadeInput; +struct ShadeResult; + +/* note: types are needed to restore callbacks, don't change values */ +#define SH_NODE_INPUT 0 +#define SH_NODE_OUTPUT 1 + +#define SH_NODE_MATERIAL 100 +#define SH_NODE_RGB 101 +#define SH_NODE_VALUE 102 +#define SH_NODE_MIX_RGB 103 +#define SH_NODE_VALTORGB 104 +#define SH_NODE_RGBTOBW 105 +#define SH_NODE_TEXTURE 106 + +/* custom defines: options for Material node */ +#define SH_NODE_MAT_DIFF 1 +#define SH_NODE_MAT_SPEC 2 +#define SH_NODE_MAT_NEG 4 + +/* the type definitions array */ +extern bNodeType *node_all_shaders[]; + +/* API */ +struct bNode *nodeShaderAdd(struct bNodeTree *ntree, int type); +void nodeShaderSetExecfunc(struct bNode *node); + +void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr); -struct bNode *node_shader_add(struct bNodeTree *ntree, int type); -void node_shader_set_execfunc(struct bNode *node); + /* switch material render loop */ +void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, struct ShadeResult *)); #endif diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h index 23c31564a66..4db98599206 100644 --- a/source/blender/blenkernel/BKE_texture.h +++ b/source/blender/blenkernel/BKE_texture.h @@ -50,7 +50,7 @@ int test_dlerr(const char *name, const char *symbol); void open_plugin_tex(struct PluginTex *pit); struct PluginTex *add_plugin_tex(char *str); void free_plugin_tex(struct PluginTex *pit); -struct ColorBand *add_colorband(void); +struct ColorBand *add_colorband(int rangetype); int do_colorband(struct ColorBand *coba, float in, float out[4]); void default_tex(struct Tex *tex); struct Tex *add_texture(char *name); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 47b3f1e34ea..5054774f339 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -40,6 +40,7 @@ #include "DNA_material_types.h" #include "DNA_mesh_types.h" #include "DNA_meta_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_texture_types.h" @@ -55,6 +56,7 @@ #include "BKE_main.h" #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_node.h" #include "BKE_utildefines.h" #include "BPY_extern.h" @@ -84,6 +86,10 @@ void free_material(Material *ma) if(ml->mat) ml->mat->id.us--; BLI_freelistN(&ma->layers); + + if(ma->nodetree) + ntreeFreeTree(ma->nodetree); + } void init_material(Material *ma) @@ -169,6 +175,10 @@ Material *copy_material(Material *ma) for(ml= man->layers.first; ml; ml= ml->next) id_us_plus((ID *)ml->mat); + if(ma->nodetree) { + man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */ + } + return man; } @@ -567,16 +577,25 @@ void new_material_to_objectdata(Object *ob) ob->actcol= ob->totcol; } +/* will be renamed... now easy to re-use for nodes! */ Material *get_active_matlayer(Material *ma) { - MaterialLayer *ml; if(ma==NULL) return NULL; - for(ml= ma->layers.first; ml; ml= ml->next) - if(ml->flag & ML_ACTIVE) break; - if(ml) - return ml->mat; + if(ma->use_nodes) { + bNode *node= nodeGetActiveID(ma->nodetree, ID_MA); + if(node && node->id) { + return (Material *)node->id; + } + } + else { + MaterialLayer *ml; + for(ml= ma->layers.first; ml; ml= ml->next) + if(ml->flag & ML_ACTIVE) break; + if(ml) + return ml->mat; + } return ma; } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 3d568e4e391..fbaa0b35c5e 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -28,33 +28,197 @@ */ #include <stdlib.h> +#include <string.h> #include "DNA_ID.h" #include "DNA_node_types.h" #include "BKE_blender.h" #include "BKE_node.h" +#include "BKE_utildefines.h" #include "BLI_arithb.h" #include "BLI_blenlib.h" #include "MEM_guardedalloc.h" +/* ************** Type stuff ********** */ + +static bNodeType *nodeGetType(bNodeTree *ntree, int type) +{ + bNodeType **typedefs= ntree->alltypes; + + while( *typedefs && (*typedefs)->type!=type) + typedefs++; + + return *typedefs; +} + +void ntreeInitTypes(bNodeTree *ntree) +{ + bNode *node; + + if(ntree->type==NTREE_SHADER) + ntree->alltypes= node_all_shaders; + else { + ntree->alltypes= NULL; + printf("Error: no type definitions for nodes\n"); + } + + for(node= ntree->nodes.first; node; node= node->next) { + node->typeinfo= nodeGetType(ntree, node->type); + if(node->typeinfo==NULL) + printf("Error: no typeinfo for node %s\n", node->name); + } + + ntree->init |= NTREE_TYPE_INIT; +} + +/* only used internal... we depend on type definitions! */ +static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype) +{ + bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock"); + + BLI_strncpy(sock->name, stype->name, NODE_MAXSTR); + if(stype->limit==0) sock->limit= 0xFFF; + else sock->limit= stype->limit; + sock->type= stype->type; + + sock->ns.vec[0]= stype->val1; + sock->ns.vec[1]= stype->val2; + sock->ns.vec[2]= stype->val3; + sock->ns.vec[3]= stype->val4; + + if(lb) + BLI_addtail(lb, sock); + + return sock; +} + +static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock) +{ + bNodeLink *link, *next; + + for(link= ntree->links.first; link; link= next) { + next= link->next; + if(link->fromsock==sock || link->tosock==sock) { + nodeRemLink(ntree, link); + } + } + + BLI_remlink(lb, sock); + MEM_freeN(sock); +} + +static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype) +{ + bNodeSocket *sock; + + for(sock= lb->first; sock; sock= sock->next) { + if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0) + break; + } + if(sock) { + sock->type= stype->type; /* in future, read this from tydefs! */ + if(stype->limit==0) sock->limit= 0xFFF; + else sock->limit= stype->limit; + BLI_remlink(lb, sock); + return sock; + } + else { + return node_add_socket_type(NULL, stype); + } +} + +static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first) +{ + bNodeSocketType *stype; + + /* no inputs anymore? */ + if(stype_first==NULL) { + while(lb->first) + node_rem_socket(ntree, lb, lb->first); + } + else { + /* step by step compare */ + stype= stype_first; + while(stype->type != -1) { + stype->sock= verify_socket(lb, stype); + stype++; + } + /* leftovers are removed */ + while(lb->first) + node_rem_socket(ntree, lb, lb->first); + /* and we put back the verified sockets */ + stype= stype_first; + while(stype->type != -1) { + BLI_addtail(lb, stype->sock); + stype++; + } + } +} + +void ntreeVerifyTypes(bNodeTree *ntree) +{ + bNode *node; + bNodeType *ntype; + + if((ntree->init & NTREE_TYPE_INIT)==0) + ntreeInitTypes(ntree); + + /* check inputs and outputs, and remove or insert them */ + for(node= ntree->nodes.first; node; node= node->next) { + ntype= node->typeinfo; + if(ntype) { + /* might add some other verify stuff here */ + + verify_socket_list(ntree, &node->inputs, ntype->inputs); + verify_socket_list(ntree, &node->outputs, ntype->outputs); + } + } +} + + + /* ************** Add stuff ********** */ /* not very important, but the stack solver likes to know a maximum */ #define MAX_SOCKET 64 -bNode *nodeAddNode(struct bNodeTree *ntree, char *name) +bNode *nodeAddNodeType(bNodeTree *ntree, int type) { - bNode *node= MEM_callocN(sizeof(bNode), "new node"); + bNode *node; + bNodeType *ntype= nodeGetType(ntree, type); + bNodeSocketType *stype; + node= MEM_callocN(sizeof(bNode), "new node"); BLI_addtail(&ntree->nodes, node); - BLI_strncpy(node->name, name, NODE_MAXSTR); + node->typeinfo= ntype; + + BLI_strncpy(node->name, ntype->name, NODE_MAXSTR); + node->type= ntype->type; + node->flag= NODE_SELECT|ntype->flag; + node->width= ntype->width; + + if(ntype->inputs) { + stype= ntype->inputs; + while(stype->type != -1) { + node_add_socket_type(&node->inputs, stype); + stype++; + } + } + if(ntype->outputs) { + stype= ntype->outputs; + while(stype->type != -1) { + node_add_socket_type(&node->outputs, stype); + stype++; + } + } return node; } -/* keep listorder identical, for copying links */ +/* keep socket listorder identical, for copying links */ +/* ntree is the target tree */ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) { bNode *nnode= MEM_callocN(sizeof(bNode), "dupli node"); @@ -67,8 +231,13 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) if(nnode->id) nnode->id->us++; - node->flag= NODE_SELECT; - + if(nnode->storage) + nnode->storage= MEM_dupallocN(nnode->storage); + + node->new= nnode; + nnode->new= NULL; + nnode->preview= NULL; + return nnode; } @@ -85,19 +254,22 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, return link; } -bNodeSocket *nodeAddSocket(bNode *node, int type, int where, int limit, char *name) +void nodeRemLink(bNodeTree *ntree, bNodeLink *link) { - bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock"); + BLI_remlink(&ntree->links, link); + if(link->tosock) + link->tosock->link= NULL; + MEM_freeN(link); +} + + +bNodeTree *ntreeAddTree(int type) +{ + bNodeTree *ntree= MEM_callocN(sizeof(bNodeTree), "new node tree"); + ntree->type= type; - BLI_strncpy(sock->name, name, NODE_MAXSTR); - sock->limit= limit; - sock->type= type; - if(where==SOCK_IN) - BLI_addtail(&node->inputs, sock); - else - BLI_addtail(&node->outputs, sock); - - return sock; + ntreeInitTypes(ntree); + return ntree; } /* ************** Free stuff ********** */ @@ -125,8 +297,7 @@ static void node_unlink_node(bNodeTree *ntree, bNode *node) break; } if(sock) { - BLI_remlink(&ntree->links, link); - MEM_freeN(link); + nodeRemLink(ntree, link); } } } @@ -144,10 +315,18 @@ void nodeFreeNode(bNodeTree *ntree, bNode *node) BLI_freelistN(&node->inputs); BLI_freelistN(&node->outputs); + if(node->preview) { + if(node->preview->rect) + MEM_freeN(node->preview->rect); + MEM_freeN(node->preview); + } + if(node->storage) + MEM_freeN(node->storage); + MEM_freeN(node); } -void nodeFreeTree(bNodeTree *ntree) +void ntreeFreeTree(bNodeTree *ntree) { bNode *node, *next; @@ -156,12 +335,64 @@ void nodeFreeTree(bNodeTree *ntree) nodeFreeNode(NULL, node); /* NULL -> no unlinking needed */ } BLI_freelistN(&ntree->links); - BLI_freelistN(&ntree->inputs); - BLI_freelistN(&ntree->outputs); MEM_freeN(ntree); } +bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select) +{ + bNodeTree *newtree; + bNode *node, *nnode, *last; + bNodeLink *link, *nlink; + bNodeSocket *sock; + int a; + + if(ntree==NULL) return NULL; + + if(internal_select==0) { + newtree= MEM_dupallocN(ntree); + newtree->nodes.first= newtree->nodes.last= NULL; + newtree->links.first= newtree->links.last= NULL; + } + else + newtree= ntree; + + last= ntree->nodes.last; + for(node= ntree->nodes.first; node; node= node->next) { + + node->new= NULL; + if(internal_select==0 || (node->flag & NODE_SELECT)) { + nnode= nodeCopyNode(newtree, node); /* sets node->new */ + if(internal_select) { + node->flag &= ~NODE_SELECT; + nnode->flag |= NODE_SELECT; + } + node->flag &= ~NODE_ACTIVE; + } + if(node==last) break; + } + + /* check for copying links */ + for(link= ntree->links.first; link; link= link->next) { + if(link->fromnode->new && link->tonode->new) { + nlink= nodeAddLink(newtree, link->fromnode->new, NULL, link->tonode->new, NULL); + /* sockets were copied in order */ + for(a=0, sock= link->fromnode->outputs.first; sock; sock= sock->next, a++) { + if(sock==link->fromsock) + break; + } + nlink->fromsock= BLI_findlink(&link->fromnode->new->outputs, a); + + for(a=0, sock= link->tonode->inputs.first; sock; sock= sock->next, a++) { + if(sock==link->tosock) + break; + } + nlink->tosock= BLI_findlink(&link->tonode->new->inputs, a); + } + } + return newtree; +} + /* ************ find stuff *************** */ bNodeLink *nodeFindLink(bNodeTree *ntree, bNodeSocket *from, bNodeSocket *to) @@ -189,6 +420,31 @@ int nodeCountSocketLinks(bNodeTree *ntree, bNodeSocket *sock) return tot; } +bNode *nodeGetActive(bNodeTree *ntree) +{ + bNode *node; + + if(ntree==NULL) return NULL; + + for(node= ntree->nodes.first; node; node= node->next) + if(node->flag & NODE_ACTIVE) + break; + return node; +} + +bNode *nodeGetActiveID(bNodeTree *ntree, short idtype) +{ + bNode *node; + + if(ntree==NULL) return NULL; + + for(node= ntree->nodes.first; node; node= node->next) + if(node->id && GS(node->id->name)==idtype) + if(node->flag & NODE_ACTIVE_ID) + break; + return node; +} + /* ************** dependency stuff *********** */ /* node is guaranteed to be not checked before */ @@ -220,7 +476,7 @@ static int node_recurs_check(bNode *node, bNode ***nsort, int level) return 0xFFF; } -void nodeSolveOrder(bNodeTree *ntree) +void ntreeSolveOrder(bNodeTree *ntree) { bNode *node, **nodesort, **nsort; bNodeSocket *sock; @@ -266,78 +522,164 @@ void nodeSolveOrder(bNodeTree *ntree) MEM_freeN(nodesort); + /* find the active outputs, tree type dependant, might become handler */ + if(ntree->type==NTREE_SHADER) { + /* shader nodes only accepts one output */ + int output= 0; + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + if(output==0) + node->flag |= NODE_DO_OUTPUT; + else + node->flag &= ~NODE_DO_OUTPUT; + output= 1; + } + } + } + + /* here we could recursively set which nodes have to be done, + might be different for editor or for "real" use... */ + + + } +/* *************** preview *********** */ + +/* if node->preview, then we assume the rect to exist */ + +static void nodeInitPreview(bNode *node, int xsize, int ysize) +{ + /* signal we don't do anything, preview writing is protected */ + if(xsize==0 || ysize==0) + return; + + /* sanity checks & initialize */ + if(node->preview) { + if(node->preview->xsize!=xsize && node->preview->ysize!=ysize) { + MEM_freeN(node->preview->rect); + node->preview->rect= NULL; + } + } + + if(node->preview==NULL) { + node->preview= MEM_callocN(sizeof(bNodePreview), "node preview"); + } + if(node->preview->rect==NULL) { + node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect"); + node->preview->xsize= xsize; + node->preview->ysize= ysize; + } +} + +void nodeAddToPreview(bNode *node, float *col, int x, int y) +{ + bNodePreview *preview= node->preview; + if(preview) { + if(x>=0 && y>=0) { + if(x<preview->xsize && y<preview->ysize) { + float *tar= preview->rect+ 4*((preview->xsize*y) + x); + QUATCOPY(tar, col); + } + else printf("prv out bound x y %d %d\n", x, y); + } + else printf("prv out bound x y %d %d\n", x, y); + } +} + + + /* ******************* executing ************* */ -void nodeBeginExecTree(bNodeTree *ntree) +void ntreeBeginExecTree(bNodeTree *ntree, int xsize, int ysize) { bNode *node; bNodeSocket *sock; int index= 0; - if((ntree->init & NTREE_EXEC_SET)==0) { - for(node= ntree->nodes.first; node; node= node->next) { - if(ntree->type==NTREE_SHADER) - node_shader_set_execfunc(node); - } - ntree->init |= NTREE_EXEC_SET; - } + if((ntree->init & NTREE_TYPE_INIT)==0) + ntreeInitTypes(ntree); - /* create indices for stack */ + /* create indices for stack, check preview */ for(node= ntree->nodes.first; node; node= node->next) { - for(sock= node->outputs.first; sock; sock= sock->next) { sock->stack_index= index++; } + + if(node->typeinfo->flag & NODE_PREVIEW) /* hrms, check for closed nodes? */ + nodeInitPreview(node, xsize, ysize); + } if(index) { - ntree->stack= MEM_callocN(index*sizeof(bNodeStack), "node stack"); + bNodeStack *ns; + int a; + + ns=ntree->stack= MEM_callocN(index*sizeof(bNodeStack), "node stack"); + for(a=0; a<index; a++, ns++) ns->hasinput= 1; } + + ntree->init |= NTREE_EXEC_INIT; } -void nodeEndExecTree(bNodeTree *ntree) +void ntreeEndExecTree(bNodeTree *ntree) { if(ntree->stack) { MEM_freeN(ntree->stack); ntree->stack= NULL; } + + ntree->init &= ~NTREE_EXEC_INIT; } -static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **spp) +static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out) { - static bNodeStack empty= {{1.0f, 1.0f, 1.0f, 1.0f}, NULL}; bNodeSocket *sock; /* build pointer stack */ for(sock= node->inputs.first; sock; sock= sock->next) { if(sock->link) - *(spp++)= stack + sock->link->fromsock->stack_index; + *(in++)= stack + sock->link->fromsock->stack_index; else - *(spp++)= ∅ /* input is not written into */ + *(in++)= &sock->ns; } for(sock= node->outputs.first; sock; sock= sock->next) { - *(spp++)= stack + sock->stack_index; + *(out++)= stack + sock->stack_index; } } /* nodes are presorted, so exec is in order of list */ -void nodeExecTree(bNodeTree *ntree) +void ntreeExecTree(bNodeTree *ntree) { bNode *node; - bNodeStack *ns[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - nodeBeginExecTree(ntree); + /* only when initialized */ + if(ntree->init & NTREE_EXEC_INIT) { - for(node= ntree->nodes.first; node; node= node->next) { - if(node->execfunc) { - node_get_stack(node, ntree->stack, ns); - node->execfunc(node, ns); + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->execfunc) { + node_get_stack(node, ntree->stack, nsin, nsout); + node->typeinfo->execfunc(ntree->data, node, nsin, nsout); + } } } - - nodeEndExecTree(ntree); } +/* clear one pixel in all the preview images */ +void ntreeClearPixelTree(bNodeTree *ntree, int x, int y) +{ + bNode *node; + float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f}; + + /* only when initialized */ + if(ntree->init & NTREE_EXEC_INIT) { + for(node= ntree->nodes.first; node; node= node->next) { + if(node->preview) + nodeAddToPreview(node, vec, x, y); + } + } +} diff --git a/source/blender/blenkernel/intern/node_shaders.c b/source/blender/blenkernel/intern/node_shaders.c index 74728abac9c..f2ece280d58 100644 --- a/source/blender/blenkernel/intern/node_shaders.c +++ b/source/blender/blenkernel/intern/node_shaders.c @@ -30,10 +30,13 @@ #include <stdlib.h> #include "DNA_ID.h" +#include "DNA_material_types.h" #include "DNA_node_types.h" +#include "DNA_texture_types.h" #include "BKE_blender.h" #include "BKE_node.h" +#include "BKE_texture.h" #include "BKE_utildefines.h" #include "BLI_arithb.h" @@ -41,186 +44,443 @@ #include "MEM_guardedalloc.h" -/* **************** testnode ************ */ +#include "render.h" /* <- shadeinput/output */ -static void blendcolor(float *col1, float *col2, float *output, float fac) +/* ********* exec data struct, remains internal *********** */ + +typedef struct ShaderCallData { + ShadeInput *shi; + ShadeResult *shr; +} ShaderCallData; + + +/* **************** call to switch lamploop for material node ************ */ + +static void (*node_shader_lamp_loop)(ShadeInput *, ShadeResult *); + +void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *)) { - output[0]= (1.0f-fac)*col1[0] + (fac)*col2[0]; - output[1]= (1.0f-fac)*col1[1] + (fac)*col2[1]; - output[2]= (1.0f-fac)*col1[2] + (fac)*col2[2]; + node_shader_lamp_loop= lamp_loop_func; } -static void node_shader_exec_test(bNode *node, bNodeStack **ns) +/* **************** input node ************ */ + +static void node_shader_exec_input(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - - blendcolor(ns[0]->vec, ns[1]->vec, ns[2]->vec, 0.5); + if(data) { + ShadeResult *shr= ((ShaderCallData *)data)->shr; + ShadeInput *shi= ((ShaderCallData *)data)->shi; + float col[4]; + + /* stack order output sockets: color, alpha, normal */ + VecAddf(col, shr->diff, shr->spec); + col[3]= shr->alpha; + + VECCOPY(out[0]->vec, col); + out[1]->vec[0]= shr->alpha; + VECCOPY(out[2]->vec, shi->vn); + + if(shi->do_preview) + nodeAddToPreview(node, col, shi->xs, shi->ys); + + } +} -// printvecf(node->name, ns[2]->vec); + +/* **************** output node ************ */ + +static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **out) +{ + if(data) { + ShadeInput *shi= ((ShaderCallData *)data)->shi; + float col[4]; + + /* stack order input sockets: col, alpha, normal */ + VECCOPY(col, in[0]->vec); + col[3]= in[1]->vec[0]; + + if(shi->do_preview) { + nodeAddToPreview(node, col, shi->xs, shi->ys); + node->lasty= shi->ys; + } + + if(node->flag & NODE_DO_OUTPUT) { + ShadeResult *shr= ((ShaderCallData *)data)->shr; + + VECCOPY(shr->diff, col); + col[0]= col[1]= col[2]= 0.0f; + VECCOPY(shr->spec, col); + shr->alpha= col[3]; + + // VECCOPY(shr->nor, in[3]->vec); + } + } } -static bNode *node_shader_add_test(bNodeTree *ntree) +/* **************** material node ************ */ + +static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - bNode *node= nodeAddNode(ntree, "TestNode"); - static int tot= 0; + if(data && node->id) { + ShadeResult shrnode; + ShadeInput *shi; + float col[4], *nor; - sprintf(node->name, "Testnode%d", tot++); - node->type= SH_NODE_TEST; - node->width= 80.0f; - - /* add sockets */ - nodeAddSocket(node, SOCK_RGBA, SOCK_IN, 1, "Col"); - nodeAddSocket(node, SOCK_RGBA, SOCK_IN, 1, "Spec"); - nodeAddSocket(node, SOCK_RGBA, SOCK_OUT, 0xFFF, "Diffuse"); - - return node; + shi= ((ShaderCallData *)data)->shi; + + shi->mat= (Material *)node->id; + + /* retrieve normal */ + if(in[0]->hasinput) + nor= in[0]->vec; + else + nor= shi->vno; + + if(node->custom1 & SH_NODE_MAT_NEG) { + shi->vn[0]= -nor[0]; + shi->vn[1]= -nor[1]; + shi->vn[2]= -nor[2]; + } + else { + VECCOPY(shi->vn, nor); + } + + node_shader_lamp_loop(shi, &shrnode); + + if(node->custom1 & SH_NODE_MAT_DIFF) { + VECCOPY(col, shrnode.diff); + if(node->custom1 & SH_NODE_MAT_SPEC) { + VecAddf(col, col, shrnode.spec); + } + } + else if(node->custom1 & SH_NODE_MAT_SPEC) { + VECCOPY(col, shrnode.spec); + } + else + col[0]= col[1]= col[2]= 0.0f; + + col[3]= shrnode.alpha; + + if(shi->do_preview) + nodeAddToPreview(node, col, shi->xs, shi->ys); + + /* stack order output: color, alpha, normal */ + VECCOPY(out[0]->vec, col); + out[1]->vec[0]= shrnode.alpha; + + if(node->custom1 & SH_NODE_MAT_NEG) { + shi->vn[0]= -shi->vn[0]; + shi->vn[1]= -shi->vn[1]; + shi->vn[2]= -shi->vn[2]; + } + VECCOPY(out[2]->vec, shi->vn); + } } -/* **************** value node ************ */ +/* **************** texture node ************ */ -static void node_shader_exec_value(bNode *node, bNodeStack **ns) +static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - /* no input node! */ - ns[0]->vec[0]= node->ns.vec[0]; -// printf("%s %f\n", node->name, ns[0]->vec[0]); + if(data && node->id) { + ShadeInput *shi; + + shi= ((ShaderCallData *)data)->shi; + + multitex_ext((Tex *)node->id, shi->co, out[0]->vec, out[1]->vec, out[1]->vec+1, out[1]->vec+2, out[1]->vec+3); + + if(shi->do_preview) + nodeAddToPreview(node, out[1]->vec, shi->xs, shi->ys); + + } } -static bNode *node_shader_add_value(bNodeTree *ntree) +/* **************** value node ************ */ + +static void node_shader_exec_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - bNode *node= nodeAddNode(ntree, "Value"); - - node->type= SH_NODE_VALUE; - node->width= 80.0f; - node->prv_h= 20.0f; + bNodeSocket *sock= node->outputs.first; - /* add sockets */ - nodeAddSocket(node, SOCK_VALUE, SOCK_OUT, 0xFFF, ""); - - return node; + out[0]->vec[0]= sock->ns.vec[0]; } /* **************** rgba node ************ */ -static void node_shader_exec_rgb(bNode *node, bNodeStack **ns) +static void node_shader_exec_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - /* no input node! */ - QUATCOPY(ns[0]->vec, node->ns.vec); + bNodeSocket *sock= node->outputs.first; -// printvecf(node->name, ns[0]->vec); + VECCOPY(out[0]->vec, sock->ns.vec); } + + +/* **************** mix rgb node ************ */ -static bNode *node_shader_add_rgb(bNodeTree *ntree) +static void node_shader_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - bNode *node= nodeAddNode(ntree, "RGB"); + /* stack order in: fac, col1, col2 */ + /* stack order out: col */ + float col[3]; - node->type= SH_NODE_RGB; - node->width= 100.0f; - node->prv_h= 100.0f; - node->ns.vec[3]= 1.0f; /* alpha init */ - - /* add sockets */ - nodeAddSocket(node, SOCK_RGBA, SOCK_OUT, 0xFFF, ""); + VECCOPY(col, in[1]->vec); + ramp_blend(node->custom1, col, col+1, col+2, in[0]->vec[0], in[2]->vec); + VECCOPY(out[0]->vec, col); +} + +/* **************** val to rgb node ************ */ + +static void node_shader_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) +{ + /* stack order in: fac */ + /* stack order out: col, alpha */ - return node; + if(node->storage) { + do_colorband(node->storage, in[0]->vec[0], out[0]->vec); + out[1]->vec[0]= out[0]->vec[3]; + } } -/* **************** mix rgba node ************ */ +/* **************** rgb to bw node ************ */ -static void node_shader_exec_mix_rgb(bNode *node, bNodeStack **ns) +static void node_shader_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { - /* stack order is fac, col1, col2, out */ - blendcolor(ns[1]->vec, ns[2]->vec, ns[3]->vec, ns[0]->vec[0]); + /* stack order out: bw */ + /* stack order in: col */ + + out[0]->vec[0]= in[0]->vec[0]*0.35f + in[0]->vec[1]*0.45f + in[0]->vec[2]*0.2f; } -static bNode *node_shader_add_mix_rgb(bNodeTree *ntree) + +/* ******************* execute ************ */ + +void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) { - bNode *node= nodeAddNode(ntree, "Mix RGB"); + ShaderCallData scd; - node->type= SH_NODE_MIX_RGB; - node->width= 80.0f; - node->prv_h= 0.0f; + /* convert caller data to struct */ + scd.shi= shi; + scd.shr= shr; + ntree->data= &scd; - /* add sockets */ - nodeAddSocket(node, SOCK_VALUE, SOCK_IN, 1, "Fac"); - nodeAddSocket(node, SOCK_RGBA, SOCK_IN, 1, "Color1"); - nodeAddSocket(node, SOCK_RGBA, SOCK_IN, 1, "Color2"); - nodeAddSocket(node, SOCK_RGBA, SOCK_OUT, 0xFFF, "Color"); + ntreeExecTree(ntree); - return node; } -/* **************** show rgba node ************ */ +/* ******************************************************** */ +/* ********* Shader Node type definitions ***************** */ +/* ******************************************************** */ -static void node_shader_exec_show_rgb(bNode *node, bNodeStack **ns) -{ - /* only input node! */ - QUATCOPY(node->ns.vec, ns[0]->vec); +/* SocketType syntax: + socket type, max connections (0 is no limit), name, 4 values for default, 2 values for range */ + +/* Verification rule: If name changes, a saved socket and its links will be removed! Type changes are OK */ + +/* *************** INPUT ********************* */ +static bNodeSocketType sh_node_input_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_input= { + /* type code */ SH_NODE_INPUT, + /* name */ "Input", + /* width+range */ 80, 60, 200, + /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW, + /* input sock */ NULL, + /* output sock */ sh_node_input_out, + /* storage */ "", + /* execfunc */ node_shader_exec_input, -// printvecf(node->name, ns[0]->vec); -} +}; -static bNode *node_shader_add_show_rgb(bNodeTree *ntree) -{ - bNode *node= nodeAddNode(ntree, "Show RGB"); +/* **************** OUTPUT ******************** */ +static bNodeSocketType sh_node_output_in[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_output= { + /* type code */ SH_NODE_OUTPUT, + /* name */ "Output", + /* width+range */ 80, 60, 200, + /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW, + /* input sock */ sh_node_output_in, + /* output sock */ NULL, + /* storage */ "", + /* execfunc */ node_shader_exec_output, - node->type= SH_NODE_SHOW_RGB; - node->width= 80.0f; - node->prv_h= 0.0f; - node->ns.vec[3]= 1.0f; /* alpha init */ +}; + +/* **************** MATERIAL ******************** */ +static bNodeSocketType sh_node_material_in[]= { + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketType sh_node_material_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_material= { + /* type code */ SH_NODE_MATERIAL, + /* name */ "Material", + /* width+range */ 120, 60, 200, + /* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS|NODE_PREVIEW, + /* input sock */ sh_node_material_in, + /* output sock */ sh_node_material_out, + /* storage */ "", + /* execfunc */ node_shader_exec_material, - /* add sockets */ - nodeAddSocket(node, SOCK_RGBA, SOCK_IN, 1, ""); +}; + +/* **************** TEXTURE ******************** */ +static bNodeSocketType sh_node_texture_out[]= { + { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_texture= { + /* type code */ SH_NODE_TEXTURE, + /* name */ "Texture", + /* width+range */ 120, 60, 200, + /* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS|NODE_PREVIEW, + /* input sock */ NULL, + /* output sock */ sh_node_texture_out, + /* storage */ "", + /* execfunc */ node_shader_exec_texture, - return node; -} +}; + +/* **************** VALUE ******************** */ +static bNodeSocketType sh_node_value_out[]= { + { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static bNodeType sh_node_value= { + /* type code */ SH_NODE_VALUE, + /* name */ "Value", + /* width+range */ 80, 40, 120, + /* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS, + /* input sock */ NULL, + /* output sock */ sh_node_value_out, + /* storage */ "", + /* execfunc */ node_shader_exec_value, + +}; -/* **************** API for add ************** */ +/* **************** RGB ******************** */ +static bNodeSocketType sh_node_rgb_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; -bNode *node_shader_add(bNodeTree *ntree, int type) -{ - bNode *node= NULL; - - switch(type) { - case SH_NODE_TEST: - node= node_shader_add_test(ntree); - break; - case SH_NODE_VALUE: - node= node_shader_add_value(ntree); - break; - case SH_NODE_RGB: - node= node_shader_add_rgb(ntree); - break; - case SH_NODE_SHOW_RGB: - node= node_shader_add_show_rgb(ntree); - break; - case SH_NODE_MIX_RGB: - node= node_shader_add_mix_rgb(ntree); - break; - } - return node; -} +static bNodeType sh_node_rgb= { + /* type code */ SH_NODE_RGB, + /* name */ "RGB", + /* width+range */ 100, 60, 140, + /* class+opts */ NODE_CLASS_GENERATOR, NODE_OPTIONS, + /* input sock */ NULL, + /* output sock */ sh_node_rgb_out, + /* storage */ "", + /* execfunc */ node_shader_exec_rgb, + +}; -/* ******************* set the callbacks, called from UI, loader ***** */ +/* **************** MIX RGB ******************** */ +static bNodeSocketType sh_node_mix_rgb_in[]= { + { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Color1", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static bNodeSocketType sh_node_mix_rgb_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_mix_rgb= { + /* type code */ SH_NODE_MIX_RGB, + /* name */ "Mix", + /* width+range */ 80, 40, 120, + /* class+opts */ NODE_CLASS_OPERATOR, NODE_OPTIONS, + /* input sock */ sh_node_mix_rgb_in, + /* output sock */ sh_node_mix_rgb_out, + /* storage */ "", + /* execfunc */ node_shader_exec_mix_rgb, + +}; + + +/* **************** VALTORGB ******************** */ +static bNodeSocketType sh_node_valtorgb_in[]= { + { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static bNodeSocketType sh_node_valtorgb_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_valtorgb= { + /* type code */ SH_NODE_VALTORGB, + /* name */ "ColorRamp", + /* width+range */ 240, 200, 300, + /* class+opts */ NODE_CLASS_OPERATOR, NODE_OPTIONS, + /* input sock */ sh_node_valtorgb_in, + /* output sock */ sh_node_valtorgb_out, + /* storage */ "ColorBand", + /* execfunc */ node_shader_exec_valtorgb, + +}; + + +/* **************** RGBTOBW ******************** */ +static bNodeSocketType sh_node_rgbtobw_in[]= { + { SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; +static bNodeSocketType sh_node_rgbtobw_out[]= { + { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeType sh_node_rgbtobw= { + /* type code */ SH_NODE_RGBTOBW, + /* name */ "RGB to BW", + /* width+range */ 80, 40, 120, + /* class+opts */ NODE_CLASS_OPERATOR, 0, + /* input sock */ sh_node_rgbtobw_in, + /* output sock */ sh_node_rgbtobw_out, + /* storage */ "ColorBand", + /* execfunc */ node_shader_exec_rgbtobw, + +}; + + +/* ****************** types array for all shaders ****************** */ + +bNodeType *node_all_shaders[]= { + &sh_node_input, + &sh_node_output, + &sh_node_material, + &sh_node_value, + &sh_node_rgb, + &sh_node_mix_rgb, + &sh_node_valtorgb, + &sh_node_rgbtobw, + &sh_node_texture, + NULL +}; -void node_shader_set_execfunc(bNode *node) -{ - switch(node->type) { - case SH_NODE_TEST: - node->execfunc= node_shader_exec_test; - break; - case SH_NODE_VALUE: - node->execfunc= node_shader_exec_value; - break; - case SH_NODE_RGB: - node->execfunc= node_shader_exec_rgb; - break; - case SH_NODE_SHOW_RGB: - node->execfunc= node_shader_exec_show_rgb; - break; - case SH_NODE_MIX_RGB: - node->execfunc= node_shader_exec_mix_rgb; - break; - } -} diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 7873340f7d8..123298c723a 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -199,25 +199,39 @@ void free_plugin_tex(PluginTex *pit) /* ****************** COLORBAND ******************* */ -ColorBand *add_colorband() +ColorBand *add_colorband(int rangetype) { ColorBand *coba; int a; coba= MEM_callocN( sizeof(ColorBand), "colorband"); - coba->data[0].r= 0.0; - coba->data[0].g= 0.0; - coba->data[0].b= 0.0; - coba->data[0].a= 0.0; coba->data[0].pos= 0.0; - - coba->data[1].r= 0.0; - coba->data[1].g= 1.0; - coba->data[1].b= 1.0; - coba->data[1].a= 1.0; coba->data[1].pos= 1.0; + if(rangetype==0) { + coba->data[0].r= 0.0; + coba->data[0].g= 0.0; + coba->data[0].b= 0.0; + coba->data[0].a= 0.0; + + coba->data[1].r= 0.0; + coba->data[1].g= 1.0; + coba->data[1].b= 1.0; + coba->data[1].a= 1.0; + } + else { + coba->data[0].r= 0.0; + coba->data[0].g= 0.0; + coba->data[0].b= 0.0; + coba->data[0].a= 1.0; + + coba->data[1].r= 1.0; + coba->data[1].g= 1.0; + coba->data[1].b= 1.0; + coba->data[1].a= 1.0; + } + for(a=2; a<MAXCOLORBAND; a++) { coba->data[a].r= 0.5; coba->data[a].g= 0.5; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bf6928b7b20..295ebc15a68 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -76,6 +76,7 @@ #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_nla_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_object_fluidsim.h" // NT @@ -1205,6 +1206,61 @@ static void test_pointer_array(FileData *fd, void **mat) } } +/* ************ READ NODE TREE *************** */ + +/* ntree is not NULL */ +static void lib_link_nodetree(FileData *fd, ID *id, bNodeTree *ntree) +{ + bNode *node; + + for(node= ntree->nodes.first; node; node= node->next) + node->id= newlibadr_us(fd, id->lib, node->id); +} + +static bNodeTree *direct_link_nodetree(FileData *fd, bNodeTree *ntree) +{ + /* note: writing and reading goes in sync, for speed */ + if(ntree) { + ntree= newdataadr(fd, ntree); + + if(ntree) { + bNode *node; + bNodeSocket *sock; + bNodeLink *link; + + ntree->init= 0; /* to set callbacks */ + ntree->data= NULL; /* safety only */ + + link_list(fd, &ntree->nodes); + for(node= ntree->nodes.first; node; node= node->next) { + node->storage= newdataadr(fd, node->storage); + link_list(fd, &node->inputs); + link_list(fd, &node->outputs); + } + link_list(fd, &ntree->links); + + /* and we connect the rest */ + for(node= ntree->nodes.first; node; node= node->next) { + node->preview= NULL; + node->lasty= 0; + for(sock= node->inputs.first; sock; sock= sock->next) + sock->link= newdataadr(fd, sock->link); + } + for(link= ntree->links.first; link; link= link->next) { + link->fromnode= newdataadr(fd, link->fromnode); + link->tonode= newdataadr(fd, link->tonode); + link->fromsock= newdataadr(fd, link->fromsock); + link->tosock= newdataadr(fd, link->tosock); + } + /* right after read file, the save-undo will need it */ + /* verify also does a full type checking. This is relative slow... so we + might move this later to the do_versions, and put ntreeInitTypes() only here */ + ntreeVerifyTypes(ntree); + } + } + return ntree; +} + /* ************ READ PACKEDFILE *************** */ static PackedFile *direct_link_packedfile(FileData *fd, PackedFile *oldpf) @@ -1993,7 +2049,7 @@ static void lib_link_material(FileData *fd, Main *main) ma->ipo= newlibadr_us(fd, ma->id.lib, ma->ipo); ma->group= newlibadr_us(fd, ma->id.lib, ma->group); - + for(a=0; a<MAX_MTEX; a++) { mtex= ma->mtex[a]; if(mtex) { @@ -2005,7 +2061,10 @@ static void lib_link_material(FileData *fd, Main *main) for (ml=ma->layers.first; ml; ml=ml->next) ml->mat= newlibadr_us(fd, ma->id.lib, ml->mat); - + + if(ma->nodetree) + lib_link_nodetree(fd, &ma->id, ma->nodetree); + ma->id.flag -= LIB_NEEDLINK; } ma= ma->id.next; @@ -2026,7 +2085,8 @@ static void direct_link_material(FileData *fd, Material *ma) direct_link_scriptlink(fd, &ma->scriptlink); link_list(fd, &ma->layers); - + + ma->nodetree= direct_link_nodetree(fd, ma->nodetree); } /* ************ READ MESH ***************** */ @@ -2994,6 +3054,13 @@ void lib_link_screen_restore(Main *newmain, Scene *curscene) ssound->sound= restore_pointer_by_name(newmain, (ID *)ssound->sound, 1); } + else if(sl->spacetype==SPACE_NODE) { + SpaceNode *snode= (SpaceNode *)sl; + + snode->nodetree= NULL; + snode->block= NULL; + snode->flag |= SNODE_DO_PREVIEW; + } } sa= sa->next; } @@ -3088,6 +3155,7 @@ static void direct_link_screen(FileData *fd, bScreen *sc) SpaceNode *snode= (SpaceNode *)sl; snode->nodetree= NULL; snode->block= NULL; + snode->flag |= SNODE_DO_PREVIEW; } } @@ -5115,11 +5183,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ma->strand_sta= ma->strand_end= 1.0f; ma->mode |= MA_TANGENT_STR; } - /* remove this test before 2.40 too! pad is set to denote check was done */ - if(ma->pad==0) { - if(ma->mode & MA_TRACEBLE) ma->mode |= MA_SHADBUF; - ma->pad= 1; - } + if(ma->mode & MA_TRACEBLE) ma->mode |= MA_SHADBUF; + /* orange stuff, so should be done for 2.40 too */ if(ma->layers.first==NULL) { ma->ml_flag= ML_RENDER; @@ -5379,6 +5444,13 @@ static void expand_material(FileData *fd, Main *mainvar, Material *ma) if(ml->mat) expand_doit(fd, mainvar, ml->mat); } + + if(ma->nodetree) { + bNode *node; + for(node= ma->nodetree->nodes.first; node; node= node->next) + if(node->id) + expand_doit(fd, mainvar, node->id); + } } static void expand_lamp(FileData *fd, Main *mainvar, Lamp *la) diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 23d9d04ce3b..704215aaa7e 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -124,6 +124,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi #include "DNA_material_types.h" #include "DNA_modifier_types.h" #include "DNA_nla_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_object_force.h" #include "DNA_oops_types.h" @@ -153,6 +154,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi #include "BKE_global.h" // for G #include "BKE_library.h" // for set_listbasepointers #include "BKE_main.h" // G.main +#include "BKE_node.h" #include "BKE_packedFile.h" // for packAll #include "BKE_screen.h" // for waitcursor #include "BKE_scene.h" // for do_seq @@ -317,7 +319,7 @@ static void writestruct(WriteData *wd, int filecode, char *structname, int nr, v BHead bh; short *sp; - if(adr==0 || nr==0) return; + if(adr==NULL || nr==0) return; /* init BHead */ bh.code= filecode; @@ -326,7 +328,7 @@ static void writestruct(WriteData *wd, int filecode, char *structname, int nr, v bh.SDNAnr= dna_findstruct_nr(wd->sdna, structname); if(bh.SDNAnr== -1) { - printf("error: can't find SDNA code %s\n", structname); + printf("error: can't find SDNA code <%s>\n", structname); return; } sp= wd->sdna->structs[bh.SDNAnr]; @@ -360,6 +362,33 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not if(len) mywrite(wd, adr, len); } +/* this is only direct data */ +static void write_nodetree(WriteData *wd, bNodeTree *ntree) +{ + bNode *node; + bNodeSocket *sock; + bNodeLink *link; + + writestruct(wd, DATA, "bNodeTree", 1, ntree); + + /* for link_list() speed, we write per list */ + + for(node= ntree->nodes.first; node; node= node->next) + writestruct(wd, DATA, "bNode", 1, node); + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->storage) + writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage); + for(sock= node->inputs.first; sock; sock= sock->next) + writestruct(wd, DATA, "bNodeSocket", 1, sock); + for(sock= node->outputs.first; sock; sock= sock->next) + writestruct(wd, DATA, "bNodeSocket", 1, sock); + } + + for(link= ntree->links.first; link; link= link->next) + writestruct(wd, DATA, "bNodeLink", 1, link); +} + static void write_scriptlink(WriteData *wd, ScriptLink *slink) { writedata(wd, DATA, sizeof(void *)*slink->totscript, slink->scripts); @@ -1014,7 +1043,9 @@ static void write_materials(WriteData *wd, ListBase *idbase) for (ml=ma->layers.first; ml; ml=ml->next) writestruct(wd, DATA, "MaterialLayer", 1, ml); - + + if(ma->nodetree) + write_nodetree(wd, ma->nodetree); } ma= ma->id.next; } diff --git a/source/blender/include/BIF_glutil.h b/source/blender/include/BIF_glutil.h index 43fa758d3cf..b585f91ec3e 100644 --- a/source/blender/include/BIF_glutil.h +++ b/source/blender/include/BIF_glutil.h @@ -125,7 +125,7 @@ void glaRasterPosSafe2f (float x, float y, float known_good_x, float known_good * to use the glScissor functionality if images are to be drawn * with an inset view matrix. */ -void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, void *rect); +void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, int format, void *rect); /** * Functions like a limited glDrawPixels, but actually draws the @@ -135,11 +135,11 @@ void glaDrawPixelsSafe (float x, float y, int img_w, int img_h, void *rect); * pixel unpacking parameters are _not_ respected. * @attention This routine makes many assumptions: the rect data - * is expected to be in RGBA unsigned byte format, and the + * is expected to be in RGBA byte or float format, and the * modelview and projection matrices are assumed to define a * 1-to-1 mapping to screen space. */ -void glaDrawPixelsTex (float x, float y, int img_w, int img_h, void *rect); +void glaDrawPixelsTex (float x, float y, int img_w, int img_h, int format, void *rect); /* 2D Drawing Assistance */ diff --git a/source/blender/include/BIF_interface.h b/source/blender/include/BIF_interface.h index 70a7de4a84c..9ddab3305c8 100644 --- a/source/blender/include/BIF_interface.h +++ b/source/blender/include/BIF_interface.h @@ -153,6 +153,7 @@ struct ScrArea; #define PULLDOWN (27<<9) #define ROUNDBOX (28<<9) #define CHARTAB (29<<9) +#define BUT_COLORBAND (30<<9) #define BUTTYPE (31<<9) diff --git a/source/blender/include/BIF_interface_icons.h b/source/blender/include/BIF_interface_icons.h index 2ec14b53cf2..ba5a119df7e 100644 --- a/source/blender/include/BIF_interface_icons.h +++ b/source/blender/include/BIF_interface_icons.h @@ -47,8 +47,8 @@ void BIF_icons_init(int first_dyn_id); int BIF_icon_get_width(int icon_id); int BIF_icon_get_height(int icon_id); void BIF_icon_set_aspect(int icon_id, float aspect); -void BIF_icon_draw(int x, int y, int icon_id); -void BIF_icon_draw_blended(int x, int y, int icon_id, int colorid, int shade); +void BIF_icon_draw(float x, float y, int icon_id); +void BIF_icon_draw_blended(float x, float y, int icon_id, int colorid, int shade); void BIF_icons_free(); void BIF_icons_free_drawinfo(void *drawinfo); diff --git a/source/blender/include/BIF_previewrender.h b/source/blender/include/BIF_previewrender.h index cb8041832b5..b8ed73505f5 100644 --- a/source/blender/include/BIF_previewrender.h +++ b/source/blender/include/BIF_previewrender.h @@ -35,6 +35,8 @@ struct RenderInfo; struct Image; struct ScrArea; +#define PREVIEW_RENDERSIZE 140 + typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha); /* stores rendered preview - is also used for icons */ @@ -45,22 +47,23 @@ typedef struct RenderInfo { short cury; } RenderInfo; -/* Set the previewrect for drawing */ -void BIF_set_previewrect(int win, int xmin, int ymin, int xmax, int ymax, short pr_rectx, short pr_recty); -void BIF_end_previewrect(void); - -void BIF_all_preview_changed(void); -void BIF_preview_changed (struct SpaceButs *sbuts); -void BIF_previewrender_buts (struct SpaceButs *sbuts); /* Render the preview - * a) into the ri->rect - * b) draw it in the area using the block UIMat - if doDraw is false, the preview is not drawn and the function is not dynamic, - so no events are processed. Hopefully fast enough for 64x64 rendering or - at least 32x32 */ -void BIF_previewrender (struct ID* id, struct RenderInfo *ri, struct ScrArea *area, int doDraw); +pr_method: +- PR_DRAW_RENDER: preview is rendered and drawn, as indicated by called context (buttons panel) +- PR_ICON_RENDER: the preview is not drawn and the function is not dynamic, + so no events are processed. Hopefully fast enough for at least 32x32 +- PR_DO_RENDER: preview is rendered, not drawn, but events are processed for afterqueue, + in use for node editor now. +*/ + +#define PR_DRAW_RENDER 0 +#define PR_ICON_RENDER 1 +#define PR_DO_RENDER 2 + +void BIF_previewrender (struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method); +void BIF_previewrender_buts (struct SpaceButs *sbuts); void BIF_previewdraw (void); -void BIF_previewdraw_render(struct RenderInfo* ri, struct ScrArea* area); +void BIF_preview_changed(short id_code); + -void BIF_calcpreview_image(struct Image* img, struct RenderInfo* ri, unsigned int w, unsigned int h); diff --git a/source/blender/include/BIF_resources.h b/source/blender/include/BIF_resources.h index 933c619f11f..3e366710992 100644 --- a/source/blender/include/BIF_resources.h +++ b/source/blender/include/BIF_resources.h @@ -182,8 +182,8 @@ typedef enum { ICON_CHECKBOX_HLT, ICON_LINK, ICON_INLINK, - ICON_BEVELBUT_HLT, - ICON_BEVELBUT_DEHLT, + ICON_BLANK12, + ICON_BLANK13, ICON_PASTEDOWN, ICON_COPYDOWN, ICON_CONSTANT, @@ -456,7 +456,13 @@ enum { TH_STRIP, TH_STRIP_SELECT, - TH_LAMP + TH_LAMP, + + TH_NODE, + TH_NODE_IN_OUT, + TH_NODE_OPERATOR, + TH_NODE_GENERATOR, + TH_NODE_FREE, }; /* XXX WARNING: previous is saved in file, so do not change order! */ diff --git a/source/blender/include/BSE_node.h b/source/blender/include/BSE_node.h index 0cb8018c0d0..458887c91d1 100644 --- a/source/blender/include/BSE_node.h +++ b/source/blender/include/BSE_node.h @@ -30,27 +30,36 @@ #ifndef BSE_NODE_H #define BSE_NODE_H +/* ********** drawing sizes *********** */ #define NODE_DY 20 #define NODE_DYS 10 -#define NODE_SOCK 5 +#define NODE_SOCKSIZE 5 +#define BASIS_RAD 8.0f +#define HIDDEN_RAD 15.0f + struct SpaceNode; struct bNode; - -/* ************* button events *********** */ - -#define B_NODE_EXEC 1 +struct Material; /* ************* API for editnode.c *********** */ +void snode_tag_dirty(struct SpaceNode *snode); + +void snode_set_context(struct SpaceNode *snode); void node_deselectall(struct SpaceNode *snode, int swap); void node_transform_ext(int mode, int unused); +void node_shader_default(struct Material *ma); -/* ************* Shader nodes ***************** */ +/* ************* drawnode.c *************** */ +void node_draw_link(struct SpaceNode *snode, struct bNodeLink *link); + +void init_node_butfuncs(void); -void node_shader_set_drawfunc(struct bNode *node); +/* ************* Shader nodes ***************** */ +struct bNode *node_add_shadernode(struct SpaceNode *snode, int type, float locx, float locy); #endif diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h index 5963d5e3e14..e0061dc3403 100644 --- a/source/blender/include/blendef.h +++ b/source/blender/include/blendef.h @@ -374,7 +374,8 @@ #define B_NLAHOME 801 /* NODE: 851-900 */ -#define B_NODEHOME 851 +#define B_NODEHOME 851 +#define B_NODE_USEMAT 852 /* FREE 901 - 999 */ diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 713f9abf488..7dae5af58e3 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -37,7 +37,9 @@ struct Base; struct Object; struct ID; - +struct ColorBand; +struct uiBlock; +struct rctf; /* buts->scaflag */ #define BUTS_SENS_SEL 1 @@ -87,6 +89,7 @@ extern void do_armbuts(unsigned short event); extern char *get_vertexgroup_menustr(struct Object *ob); // used in object buttons /* shading */ +extern void draw_colorband_buts_small(struct uiBlock *block, struct ColorBand *coba, rctf *rct, int event); extern void material_panels(void); extern void do_matbuts(unsigned short event); extern void lamp_panels(void); @@ -122,6 +125,7 @@ void test_matpoin_but(char *name, struct ID **idpp); void test_scriptpoin_but(char *name, struct ID **idpp); void test_actionpoin_but(char *name, ID **idpp); void test_grouppoin_but(char *name, ID **idpp); +void test_texpoin_but(char *name, ID **idpp); void test_idbutton_cb(void *namev, void *arg2_unused); @@ -169,20 +173,25 @@ void test_idbutton_cb(void *namev, void *arg2_unused); #define B_ACTCOL 1204 #define B_MATFROM 1205 #define B_MATPRV 1206 -#define B_MTEXCOL 1207 -#define B_TEXCLEAR 1208 -#define B_MATPRV_DRAW 1209 -#define B_MTEXPASTE 1210 -#define B_MTEXCOPY 1211 -#define B_MATLAY 1212 -#define B_MATHALO 1213 -#define B_MATZTRANSP 1214 -#define B_MATRAYTRANSP 1215 -#define B_MATCOLORBAND 1216 -/* yafray: material preset menu event */ -#define B_MAT_YF_PRESET 1217 - -#define B_MAT_LAYERBROWSE 1218 +#define B_LAMPPRV 1207 +#define B_WORLDPRV 1208 +#define B_TEXPRV 1209 +#define B_MTEXCOL 1210 +#define B_TEXCLEAR 1211 +#define B_MTEXPASTE 1212 +#define B_MTEXCOPY 1213 +#define B_MATLAY 1214 +#define B_MATHALO 1215 +#define B_MATZTRANSP 1216 +#define B_MATRAYTRANSP 1217 +#define B_MATCOLORBAND 1218 + /* yafray: material preset menu event */ +#define B_MAT_YF_PRESET 1219 + +#define B_MAT_LAYERBROWSE 1220 +#define B_MAT_USENODES 1221 + /* also handled in editnode.c */ +#define B_NODE_EXEC 1222 /* *********************** */ #define B_TEXBUTS 1400 @@ -207,7 +216,6 @@ void test_idbutton_cb(void *namev, void *arg2_unused); #define B_REDRAWCBAND 1318 #define B_BANDCOL 1319 #define B_LOADTEXIMA1 1320 -#define B_TEXPRV 1321 #define B_PLUGBUT 1325 /* B_PLUGBUT reserves 24 buttons at least! */ diff --git a/source/blender/include/interface.h b/source/blender/include/interface.h index 1c26a714c51..526f24e704e 100644 --- a/source/blender/include/interface.h +++ b/source/blender/include/interface.h @@ -223,6 +223,8 @@ extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, flo extern void ui_set_embossfunc(uiBut *but, int drawtype); extern void ui_draw_but(uiBut *but); extern void ui_rasterpos_safe(float x, float y, float aspect); +extern void ui_draw_tria_icon(float x, float y, float aspect, char dir); +extern void ui_draw_anti_x(float x1, float y1, float x2, float y2); #endif diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 79d73ff2b99..6d8527d5896 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -47,6 +47,7 @@ struct Ipo; struct Material; struct ColorBand; struct Group; +struct bNodeTree; typedef struct MaterialLayer { struct MaterialLayer *next, *prev; @@ -88,7 +89,7 @@ typedef struct Material { float sbias; /* shadow bias */ /* for buttons and render*/ - char rgbsel, texact, pr_type, pad; + char rgbsel, texact, pr_type, use_nodes; short pr_back, pr_lamp, septex, ml_flag; /* ml_flag is for disable base material */ /* shaders */ @@ -109,8 +110,9 @@ typedef struct Material { struct MTex *mtex[10]; ListBase layers; + struct bNodeTree *nodetree; struct Ipo *ipo; - struct Group *group; + struct Group *group; /* light group */ /* dynamic properties */ float friction, fh, reflect; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index db118d706b3..3c350e5c559 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -36,17 +36,28 @@ struct ID; struct SpaceNode; struct bNodeLink; +struct bNodeType; #define NODE_MAXSTR 32 + +typedef struct bNodeStack { + float vec[4]; + float min, max; /* min/max for values (UI writes it, execute might use it) */ + void *data; + short hasinput, pad; /* hasinput tagged for executing */ + int pad1; +} bNodeStack; + typedef struct bNodeSocket { struct bNodeSocket *next, *prev; char name[32]; + bNodeStack ns; /* custom data for inputs, only UI writes in this */ short type, flag, limit, stack_index; float locx, locy; - struct bNodeLink *link; /* input link to parent, max one! */ + struct bNodeLink *link; /* input link to parent, max one! set in nodeSolveOrder() */ } bNodeSocket; @@ -57,11 +68,13 @@ typedef struct bNodeSocket { #define SOCK_IMAGE 3 /* sock->flag, first bit is select */ +# +# +typedef struct bNodePreview { + float *rect; + char xsize, ysize; +} bNodePreview; -typedef struct bNodeStack { - float vec[4]; - void *data; -} bNodeStack; /* limit data in bNode to what we want to see saved? */ typedef struct bNode { @@ -69,23 +82,32 @@ typedef struct bNode { char name[32]; short type, flag, done, level; + short lasty, pad, pad1, pad2; ListBase inputs, outputs; - struct ID *id; /* optional link to libdata */ - bNodeStack ns; /* builtin data, for UI to write into */ + struct ID *id; /* optional link to libdata */ + void *storage; /* custom data, must be struct, for storage in file */ - float locx, locy; /* root offset for drawing */ - float width, prv_h; - rctf tot; /* entire boundbox */ - rctf prv; /* optional preview area */ + float locx, locy; /* root offset for drawing */ + float width; + short custom1, custom2; /* to be abused for buttons */ + rctf totr; /* entire boundbox */ + rctf butr; /* optional buttons area */ + rctf prvr; /* optional preview area */ + bNodePreview *preview; /* optional preview image */ - void (*drawfunc)(struct SpaceNode *, struct bNode *); - void (*execfunc)(struct bNode *, struct bNodeStack **); + struct bNodeType *typeinfo; /* lookup of callbacks and defaults */ } bNode; /* node->flag */ -#define NODE_SELECT 1 +#define NODE_SELECT 1 +#define NODE_OPTIONS 2 +#define NODE_PREVIEW 4 +#define NODE_HIDDEN 8 +#define NODE_ACTIVE 16 +#define NODE_ACTIVE_ID 32 +#define NODE_DO_OUTPUT 64 typedef struct bNodeLink { struct bNodeLink *next, *prev; @@ -99,10 +121,11 @@ typedef struct bNodeLink { typedef struct bNodeTree { ListBase nodes, links; - ListBase inputs, outputs; /* default inputs and outputs, for solving tree */ - bNodeStack *stack; + void *data; /* custom data, set by execute caller, no read/write handling */ + bNodeStack *stack; /* stack is only while executing */ - int type, init; + int type, init; /* set init on fileread */ + struct bNodeType **alltypes; /* type definitions, set on fileread */ } bNodeTree; @@ -111,9 +134,8 @@ typedef struct bNodeTree { #define NTREE_COMPOSIT 1 /* ntree->init, flag */ -#define NTREE_EXEC_SET 1 -#define NTREE_DRAW_SET 2 - +#define NTREE_TYPE_INIT 1 +#define NTREE_EXEC_INIT 2 #endif diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 4ae9445dca1..902e0805aaa 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -300,17 +300,19 @@ typedef struct SpaceNode { View2D v2d; - struct ID *from; - int flag; + struct ID *id, *from; /* context, no need to save in file? well... pinning... */ + short flag, menunr; /* menunr: browse id block in header */ float aspect; void *curfont; struct uiBlock *block; struct bNodeTree *nodetree; + int treetype, pad; /* treetype: same nodetree->type */ } SpaceNode; - +/* snode->flag */ +#define SNODE_DO_PREVIEW 1 # # diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index f1441e7b720..f5cc2ce4810 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -85,7 +85,7 @@ typedef struct ThemeSpace { char edge[4], edge_select[4]; char edge_seam[4], edge_facesel[4]; char face[4], face_select[4]; // solid faces - char face_dot[4]; // selected color + char face_dot[4]; // selected color char normal[4]; char bone_solid[4], bone_pose[4]; char strip[4], strip_select[4]; @@ -93,8 +93,8 @@ typedef struct ThemeSpace { char vertex_size, facedot_size; char bpad[2]; - char syntaxl[4], syntaxn[4], syntaxb[4]; //syn- - char syntaxv[4], syntaxc[4]; //tax + char syntaxl[4], syntaxn[4], syntaxb[4]; // syntax for textwindow and nodes + char syntaxv[4], syntaxc[4]; } ThemeSpace; @@ -119,6 +119,7 @@ typedef struct bTheme { ThemeSpace text; ThemeSpace toops; ThemeSpace ttime; + ThemeSpace tnode; } bTheme; diff --git a/source/blender/render/extern/include/render.h b/source/blender/render/extern/include/render.h index 5f8ceb45b15..c0eced8ad3a 100644 --- a/source/blender/render/extern/include/render.h +++ b/source/blender/render/extern/include/render.h @@ -190,6 +190,7 @@ void do_specular_ramp(ShadeInput *shi, float is, float t, float *spec); void ramp_spec_result(float *specr, float *specg, float *specb, ShadeInput *shi); void matlayer_blend(struct MaterialLayer *ml, float blendfac, struct ShadeResult *target, struct ShadeResult *src); +void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col); /* --------------------------------------------------------------------- */ /* ray.c (2) */ diff --git a/source/blender/render/extern/include/render_types.h b/source/blender/render/extern/include/render_types.h index dc2f5616f29..ed3a54975ce 100644 --- a/source/blender/render/extern/include/render_types.h +++ b/source/blender/render/extern/include/render_types.h @@ -102,7 +102,8 @@ typedef struct ShadeInput float dxrefract[3], dyrefract[3]; float dxstrand, dystrand; - float xs, ys; /* pixel to be rendered */ + int xs, ys; /* pixel to be rendered */ + short do_preview, pr_type; /* for nodes, in previewrender */ short osatex, puno; int mask; int depth; diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c index 30973b0891b..a91219846de 100644 --- a/source/blender/render/intern/source/ray.c +++ b/source/blender/render/intern/source/ray.c @@ -2071,7 +2071,7 @@ void ray_ao(ShadeInput *shi, World *wrld, float *shadfac) nrm= shi->facenor; } - vec= sphere_sampler(wrld->aomode, wrld->aosamp, floor(shi->xs+0.5), floor(shi->ys+0.5) ); + vec= sphere_sampler(wrld->aomode, wrld->aosamp, shi->xs, shi->ys); // warning: since we use full sphere now, and dotproduct is below, we do twice as much tot= 2*wrld->aosamp*wrld->aosamp; @@ -2202,7 +2202,7 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac) else shadfac[3]= 1.0; // 1.0=full light fac= 0.0; - jitlamp= give_jitter_plane(lar, floor(shi->xs+0.5), floor(shi->ys+0.5)); + jitlamp= give_jitter_plane(lar, shi->xs, shi->ys); a= lar->ray_totsamp; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 890a0b26674..acac0d48e2c 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -2198,7 +2198,7 @@ void shade_input_set_coords(ShadeInput *shi, float u, float v, int i1, int i2, i } if(texco & TEXCO_REFL) { /* mirror reflection colour textures (and envmap) */ - calc_R_ref(shi); + calc_R_ref(shi); /* wrong location for normal maps! XXXXXXXXXXXXXX */ } if(texco & TEXCO_STRESS) { float *s1, *s2, *s3; @@ -2279,9 +2279,10 @@ void *shadepixel(float x, float y, int z, int facenr, int mask, float *col, floa return NULL; } /* currently in use for dithering (soft shadow) and detecting thread */ - shi.xs= x; - shi.ys= y; - + shi.xs= (int)(x+0.5f); + shi.ys= (int)(y+0.5f); + shi.do_preview= 0; + /* mask is used to indicate amount of samples (ray shad/mir and AO) */ shi.mask= mask; shi.depth= 0; // means first hit, not raytracing diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index f792a07e307..9b38a65a4b9 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -2352,7 +2352,7 @@ void render_realtime_texture(ShadeInput *shi) tex2.type= TEX_IMAGE; } - if(((int)(shi->ys+0.5)) & 1) tex= &tex1; else tex= &tex2; // threadsafe + if(shi->ys & 1) tex= &tex1; else tex= &tex2; // threadsafe ima = shi->vlr->tface->tpage; if(ima) { diff --git a/source/blender/src/blenderbuttons.c b/source/blender/src/blenderbuttons.c index e8a31711523..0ac27df840c 100644 --- a/source/blender/src/blenderbuttons.c +++ b/source/blender/src/blenderbuttons.c @@ -1,1442 +1,1430 @@ /* DataToC output of file <blenderbuttons> */ -int datatoc_blenderbuttons_size= 49463; +int datatoc_blenderbuttons_size= 49081; char datatoc_blenderbuttons[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 0, 0, 0, 1, - 0, 8, 2, 0, 0, 0, 74,242, 89, 48, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, - 0, 0, 4,103, 65, 77, 65, 0, 0,192,153,201, 12,156,227, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,110, 39, 0, 0,115,175, 0, - 0,246,112, 0, 0,129,232, 0, 0,107,215, 0, 0,226,170, 0, 0, 48,131, 0, 0, 21, 42,251,118,133,113, 0, 0,192,173, 73, - 68, 65, 84,120,218, 98,244,137,169,101, 24, 5,163, 96, 20,140,130, 81, 48,242, 0, 64, 0, 49,141, 6,193, 40, 24, 5,163, 96, - 20,140, 76, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, - 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64, 44,112, -150,175,173, 12,241,218, 54, 31,126,130,204, 29,213, 59, 8,245,162,105,167,186,189, 7, 14, 28,112,112,112, 24, 13,231, 81,189, -163,122, 7,185, 94, 60, 0, 32,128, 88,134, 71, 61,150,158,158, 14,103,207,156, 57,115, 64,108,159, 49, 99, 6, 35, 35,227,176, -111, 50,192,131, 58, 50, 50,114,205,154, 53, 16,118, 72, 72,200,104, 99,106,248, 69, 52,253,179,210, 40,160, 51, 0, 8, 32, 22, - 90,164,128,219,183,111,247,244,244, 64,216, 37, 37, 37,170,170,170,116,240,201,255,255,255,129, 36,253,139, 96, 96, 40, 61,120, -240, 0,200, 80, 80, 80, 24,144,234, 7,107, 45,136,213, 37,192, 54, 59,126, 19,150, 47, 95,142,223,253, 64, 43, 86,173, 90, 5, - 97,175, 95,191,222,213,213, 21,194, 6,214, 4,180,171, 3,140,141,141,129,228,217,179,103,201,144, 29,153,224,222,189,123,157, -157,157,112,110,121,121,185,146,146,210, 32,175, 54, 6,208,205, 35, 25, 0, 4, 16, 11,158, 66, 28, 66,146, 90,124, 67,138,161, -198, 85, 45, 60,178,252, 95, 30,127,172, 15,171, 25,216, 98,145,214, 0,232, 53, 96,209,255, 0, 12,118,236,216, 65,255,118, 19, - 36,192,103,130, 1,144,221,213,213, 5,228,150,149,149, 97, 85, 28, 24, 24, 8, 97,252,249,243,247,215,239,159,191,126,254,130, -128, 63,127,254,224,210,130,181,244, 71, 3,192,154,128,166,117, 0,158,218, 11, 82, 1,140, 2, 92,237, 0, 32,128, 20,172,116, - 72,150, 16,171,201,200, 2, 3,232,230, 17, 14, 0, 2, 8,103, 5, 0,108,194,175,170,173, 10,107,110, 35, 41, 14,128, 17, 9, - 41,250,129,236, 55,223,222, 50, 8, 51, 84,238,109,248,116,239,125,122, 42,253,138, 69,204,196, 68,107,171,225,117,128,135,135, - 7,144, 4,178,233,233,217,253,251,247, 3, 25,142,142,142,104,117, 0, 30, 0, 44,238,127,253,250,253,235, 23, 74,233,127,230, -204, 25, 19, 19, 19,130, 54,134,133,133, 65, 24,145,145,145,187,119,239,134, 87, 0,100, 68, 16,145,161, 4,108,221, 3, 75,127, - 55, 55, 55,100,193, 93,187,118, 1,251, 43, 16, 54,214,169,136, 17, 94,250, 35,135, 45, 25,229, 50,217, 90,200,232, 7, 80,203, -205,163,128, 12, 0, 16, 64, 44,184,154,255,106,106,106,170, 60,124, 36,117, 2,224,165, 63,176,232,111,119,110,128, 8, 38,110, -204, 98, 16, 99, 8,236, 10, 35, 24,151,152, 5, 55,121,101,247,227,199,143,129,164,172,172, 44,156, 1, 49,153,186,135, 94,160, -121, 7, 94, 7,252,254,253,103,198,140, 25,148, 55,130,136,209,142, 86,250,195, 53, 98, 13, 73,148,210,255, 55,176,244,255,249, - 19, 92, 9,192, 75,255,255,255,254, 19, 83,250, 3, 85, 66,216,189,189,189,240, 38, 63,124, 50,128,120, 55,163, 57,155,120, 0, - 47,250,129, 53,144,161,161,225,104, 30, 70, 30, 69,193,154,120,224, 73, 2,168,128,224,184, 10,188, 67, 9, 73,195,112, 46, 49, -205, 32,204,162,156, 96, 70, 64,115, 51,176, 73,193,200,200,232,226,226, 66,146,155, 33, 32, 57, 57,121,238,220,185,163,201,128, - 36, 0, 16, 64, 76,184,154,255, 45,225, 33, 63, 94,191, 46,209,214,128,143,230,227, 7,144, 33, 35,120,233, 95, 82, 82, 2,140, - 66, 32, 57,223,127, 26, 80, 92, 64, 93, 4,174, 6, 15, 40,155,122, 11,136,178,123,174,199, 55, 95, 9,170,188, 64,170,103,158, - 60,121,130,167, 74,160,110,233, 15, 44,235, 49,139,108, 96, 29, 0, 44, 82,205,205,204, 72, 53, 13, 50,186, 2, 4,251, 97, 0, -127, 33, 14, 47, 73, 29,193, 0, 51,195,227, 46,253,255,130,138,253,159,160,193, 31,228,210,255,239,223,191, 95,191,127, 37,232, - 84, 72, 47, 1,185,163,176, 6, 12,136, 28,252, 1,185, 25,105, 36, 7,200, 38,232, 77,172,165, 63,176,232, 7,246,114, 32,165, - 63, 43, 11,235,104, 54, 38, 56,108, 2, 17, 68, 30,100,199, 95,148,147,215, 2,131, 40, 70, 46,253,113, 53,236,176,186, 25, 88, -250, 3,211,210,234,213,171,247,236,217, 67,170,155,129,165, 63, 11, 11, 11,144, 28, 77, 6, 36, 1,128, 0, 98,194,211,252,255, -246,226,185,167,161, 17, 49, 5, 55,164,206, 0, 54,255,129, 12, 72,233, 15,233, 52, 0, 73, 72, 29,240,228,211, 51,163, 50, 11, -130,117,201,215,239,192, 98,232,239,243,183, 63,159,190,254,241,248,229, 15, 34,139, 78, 72, 10,195, 85,250,211, 14, 96,214, 1, - 64,240,227,215,207, 31, 63,126, 16,111, 8,164, 28,135,140,173,139,138,138,194,155,198,248,115, 14,114, 59, 26,179,227,140, 39, -223,130,198,253,129,197, 63,184,241, 15, 47,253,127,255,254,253,245,235,215,207,159, 62,211,122,116, 98,213,170,213, 48, 30, 35, - 24, 50, 0, 69,136,175, 3,224,165, 63,164,232,103, 98, 98,226,224,224,224,230,225, 26,205,198, 52,234,215, 18,217,167,196, 90, -121,160,141, 8, 17,163, 23,222,143, 4,214, 1, 36, 57, 27, 82,250,131, 6, 52, 70,235, 0, 18, 1, 64, 0,118,205, 94, 7, 65, - 24,136,227, 36,208,224,238, 32,239, 64,124,156,250, 8,142, 60, 15,137, 3, 59, 60,150,176, 16,135,106, 75, 33, 90,130, 7, 37, - 23, 98,180,158,137, 35, 55, 53, 13,133,210,143,223,221,253,219,224, 45,202, 79,199,121, 16,155,242,108,147, 0, 74, 32, 96,195, -127,203,125,172,196,242,118, 31,125,125,131,106,123,169,205,173, 49, 87,101,132, 52,148, 31,120,185,252,131,193, 62, 22, 32,133, - 20, 66,252,119,212,210, 52,197,131, 95, 84,252, 97,149, 67,125,215,182,116, 7, 0, 77,178, 44, 43,171,138,249,254, 46,138,144, -254, 73,146,196,113,236,216, 54,240, 69,120, 12,125,192, 50, 47,113,159, 64,220, 39,254, 63, 70,250,247,150,254,224, 13,180,214, - 74, 41, 41, 73, 14, 0, 37, 32,107,244,216, 63, 47,114,111,240, 46,117, 61,206,154,157,179, 97, 24,125, 64, 81, 28, 56,167, 44, -176, 37,253, 25, 99, 97, 24,110, 38, 35,246,124, 53,138, 2,249, 9,220,116, 45,200,161, 8,185,141,115,110,209,255,211,109, 2, -164,255, 76,180, 32,128,200,102,213,130,136,246, 20, 64, 76, 88, 71,114, 76,148, 85,127,188,126, 13, 44,253,129,108, 59,112,179, -148,152, 78,192,189, 43,119,144, 13, 65, 99,191,189,252,130,160, 9,164,150,254,240,162, 31, 88, 13,200,202,202,194, 5,127,195, - 0,176,232, 7,182,109,223,189,123, 71,221, 80,131, 88,186, 99,199, 14,120, 63, 0, 82,250,235,233,233,253, 0,214, 0,223,191, -195,107, 38,252, 89,110,234,180,169, 64, 71,202, 72, 75,255,254,251, 23,173,244, 39,152,109, 32,117, 0,114,131, 11,178, 26, 21, -107,191, 4,165, 2,248,245, 27, 82,250,159, 62,117,250,219,247,239,192,210,243,227,199,143,192,128,122,255,254, 61,241, 33, 0, - 25, 5, 34,126,232, 31,148, 0,222,188,125,251,246,205,155,183,239, 64, 52,152, 9, 20,212,208,212,124, 7,102, 16,211,252, 7, -146,192,210, 31,218,240,231,230,230,225,225,229,229,225, 5, 50, 70,179, 49,174,210,156,248, 6, 56,100, 5, 1,156,129,139, 77, -146,237,104, 35, 66, 4,117,185,184,184, 0,235, 0, 96,233,239,234,234, 74,124,159, 3, 88,214, 3, 75,124, 56,119,180,244, 39, - 9, 0, 4, 16, 19,102,243,127, 85,109, 21,144,241,237,197,115,184, 32, 49, 51, 1, 37, 37, 37, 83, 83, 39, 50,128,103,125,129, -138,225,171, 72,129,108,215,197, 1, 64,246,185,174, 19, 64, 53,212,117, 61, 60,109, 61,121,242, 4,210,228,135,148,251,208,238, -203,215,175,192,210, 13,216, 30,231,226,162,254, 40, 1,208,234,140,140, 12,144,141,127,254, 92,187,118,237,252,185,115,250,122, -250, 63,126,128, 59, 0,223,191, 47, 89,188, 24, 34,139, 39,185,247,246,246,106,105,106, 1, 93, 11, 12,165, 63,191,127, 61,125, -242,148,108,239, 51,192,102, 32, 24,192,219, 17,240,245, 0,126,255,252,243, 23, 52,242,115,242,228,137,175,223,191,126,249,252, - 9, 88,250,191, 7,149,254,239, 72,170, 38, 33,253, 0,146, 90,106,135, 14, 29,250, 12, 2,159,192,228,103, 17, 97, 97, 96,233, -127,227,250,245,131,135, 14, 17,163, 29,210,252,103, 97, 97, 5,198, 38, 15,176,236, 7, 98, 30, 46, 78, 46,206, 23, 47, 94,140, -102, 99, 8, 40, 47, 47,135,151,191,240,201, 85, 8, 3, 34, 8, 81, 64,100,179, 29,255,184, 16,254,210,159,248,182, 63,154,155, -129,117, 0,176,244, 39,201,205,200,117,192,104,233, 79, 42, 0, 8, 32, 44, 67, 64,194,247, 31,188, 3, 15,254,192, 69,128,157, -128, 30,134, 27,248, 13,130, 12,245,220, 56,123, 77, 64, 93, 4, 88,226,247,196, 66, 43, 12, 72,233, 15,105,254, 19, 92, 77,180, -174,221,128,188,246,248,245,235,215, 33, 41, 0,121, 52,128, 21, 12, 94,191,126,237,229,229, 69,139,176,131,148,185,192,134,191, -153,153,217,143,159, 63,191,255,248, 14,110,253,127, 7, 49,126,252,152, 50,101, 10,174,156, 3, 89,169,249,247,239,223,179,103, -207,177,178, 48, 67, 66,230,254,131, 7, 79,159, 62, 93,190,124, 69,100,100, 4, 80, 4,222, 15,192,154,193,224,131, 78,104, 45, - 56,130, 43, 80, 33,109,255,227,199,143,127,253,242, 13, 82, 65,126,250,252,233,211,167,143,159, 62,125, 33,126, 32, 5,210,252, -135,239, 4, 38,166, 26, 0, 42,134,179, 21, 21, 20,128, 69, 63, 40,181, 92,191,126, 31,220,107, 65,150,197, 3, 44,173, 44,217, -217,216, 57, 57, 57,129, 61, 0,118,118,118, 96,228, 82,125,122,127, 72, 3,228,213, 50,240,197, 51,240,154, 0, 77, 1,254, 66, - 28,235, 80, 62, 73, 61, 15, 34,171, 13,106,185, 25, 82, 7,140,150,254,164, 2,128, 0, 98,193, 28,255,113, 94,178, 12,171, 82, -130,235, 65, 33,205, 7,163, 50, 11, 97, 93, 9, 72,185, 15, 31,252, 1, 54,255, 9,166, 6,242, 22,252, 66, 44,213,212,212,188, -124,249, 50,188, 8,195, 28,244, 7, 42, 35,254,124, 12, 82,109, 71, 22, 89,178,120, 9,176,244,135,236,176,194,186, 30, 31,121, -157,254,191,127,127,245,244,141, 46, 94,188,116,253,218, 53, 22, 86, 86, 96,201,248,228,233, 19, 96, 83,151,153,153, 57, 44, 44, - 12, 88, 7, 48, 48,240, 99,154, 0,212, 14,201, 93, 16,219,209,246, 1,224,119, 48,176,244, 63,122,244,232, 23, 32, 0,205,250, -126, 2,151,254, 64,226,243,151,207, 95,190,126,251, 70,208,179,192,162,255, 12, 24, 48, 96, 44, 3,197, 95, 13, 56, 56, 56, 32, - 7, 20,164,220, 63,127,254, 60, 3, 17,219,143,141,193, 0,200,224,225,226,225, 0, 21,254, 28,108,108,108, 76, 76, 76,163,165, - 63,250, 24, 44, 82,185,185,122,245,106, 96,107,154, 1,117, 66,149,152, 37,149,200,109, 11, 82, 87, 51,147, 49,238, 79, 21, 55, -195,235,128,209, 52, 64, 42, 0, 8, 32, 22,180, 86, 60,133,219, 46,224, 41, 0, 82, 13, 64,138,126, 6, 26,111,197,130, 88,170, -171,171,123,250,244,105, 96,123, 31, 81,241,188, 5,205, 72,199,198,198,210, 52, 4,145,189,246,255,255,255,152,216,152, 41, 83, -166,130,199,217,255,240,243,243, 19,172,231,110,221,186, 5,108,209, 66,244, 2,217,104,202,238,225,168,180,144,235, 0,200,108, - 48,100, 73, 40,254,112,134, 44,159,183,182,182,166,196,179,240, 53,160,164,158, 5, 4,212,123,224,192,129,229, 96,128,220, 51, - 32, 50,109, 0,171,144,223,127,126,255,254,252,123,116,202, 23, 23, 32,184, 98, 18,168,128,200,208,134,239, 3, 32, 47, 51, 18, -175,145,138,110, 30, 5,100, 0,128, 0,162,254, 97,112,192,216, 2, 13,253,119,209,245, 44, 32, 72,178, 51, 53, 53,221,182,109, - 27,164,220,167,188,111, 65,222, 96, 20,124, 47, 46,214,210,159, 42, 0,243,204, 6,200,178, 81,130, 77, 54,170,132, 3,220, 16, - 96,105, 78,234,217, 15, 14, 96, 64,170,141,163,231,252,144,209, 22,161,127,226, 39,207,198, 65,226,230, 17, 11, 0, 2,136, 38, -167,129, 82,222,147, 32,187, 14,160,209,112, 63,237, 50, 0,229,134,143,230,150, 81, 48,228,146,241, 40, 24, 36, 0, 32,128, 24, -169,123, 64,194, 40, 24, 5,163, 96, 20,140,130,161, 2, 0, 2,104,244, 70,176, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, - 43,128, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, 43,128, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, 43,128, 81, 48, - 10, 70,193, 40, 24,161, 0, 32,128, 70, 47,133, 31,213, 59,170,151,230,122,113, 45,207,165,181,222,209, 56, 26,213,139, 31, 0, - 4,208,104, 15, 96, 20,140, 2,218, 2,200,233,246, 16,146, 84, 64,204,145,250,163, 0, 43,184,121,243,230,104, 32, 16, 4, 0, - 1, 52, 90, 1, 12, 36,184,118,237, 90, 58, 18, 0,114, 7,191,222, 81, 64, 18,184,119,239, 30,228, 96, 3, 32,137,124,236, 1, -241,165, 63,228, 88, 89,178,207,228,193, 37, 66, 69,189,240, 59, 57,200, 3,180,168,222,128,165,127,127,127,255,104,242, 35, 8, - 0, 2,136,101,248,121,233,240,225,195,182,182,182,131,223,157,144,116,223,219,219, 11, 23, 41, 46, 46,102, 32,250, 50, 72, 32, -249,111,165, 32,162, 38, 15,159, 72, 7,189,163,128, 84,128,124,212, 1, 73,167, 26, 32,151,254, 64,146,145,145,145,248, 35, 22, - 40,217, 45, 72,134, 94,200, 57,254,120,156, 7,236,253, 64, 14,249,193,227, 89, 76,189, 4,117,225, 47,253,255,253,251, 55,107, -214,172,165, 75,151, 70, 71, 71,143,166, 67, 92, 0, 32,128,134, 97, 15, 96, 9,142,195,236, 6, 91,233,159,159,159,143, 92,250, - 67, 42, 3,160, 32, 49, 13,174, 5,185,220,200, 37, 56,164, 64, 7, 10,210, 84,239,199,143, 31, 51, 51, 51,225,183,208,188,120, -241, 2,168,165,181,181,181,185,185,185,170,170, 10,114, 94, 63, 46,192,246,241,171,110,230,124,158,253,247, 33,220, 63, 47,254, - 92, 77,255,113,169,149,237, 72,179,224,230, 42,249,115,187,164,135,107, 6, 35,227, 60,125,180,210, 31, 2, 72,234, 7,208,185, - 7, 0, 57,199, 31,162,114, 15, 24,160,149,227,248,111,248,130,235,197,212, 69, 70,231, 0, 94,250, 3,155, 83,192,210,255,200, -145, 35,163,165, 60, 30, 0, 16, 64,195,173, 2, 0, 54,255,129,109,165, 65, 30,235,144, 33, 23, 57, 57, 57,120,195, 31,210,246, -135, 11,226, 25,147,129, 72,197,217,176,193, 26,239,239,129, 8,194,134, 8,210, 72, 47, 16,156, 60,121,146,131,131,227,248,241, -227,136,212,195,196, 84, 93, 93, 93, 91, 91, 27, 31, 31,191,117,235, 86, 60,122, 37, 78, 94,251,207,193,202,117,252, 17, 92,132, -145,233,191, 94,245, 47,155,218,247,230,241,175, 78,111,149, 30,205,138,152,165, 63, 35, 12, 16, 89, 7, 32, 79, 24,164,163, 2, - 6, 66,211, 9,148,232,133,215, 1,239,222,185,204,156,249,158,164,210, 31,107,253, 1,215, 69,106,175, 20, 88,250,247,245,245, - 1, 67, 12,152, 50,207,156, 57, 3, 44, 13, 70,147, 19,126, 0, 16, 64, 76,248, 11, 83, 50, 66,144,194,241,101,160,141, 16,141, -228, 69, 30,176,249, 63, 99,198, 52,178, 59, 1,244, 73, 49, 19, 39, 78,132,183,253,129, 69,127, 47, 24,192,235, 0, 32, 27,168, - 0,143, 94,120,251, 29, 88,124,223,222, 22, 11, 68,240,114, 28, 40, 69,188, 94, 72,155,148, 72,189,192,210,231,216,177, 99,192, -222,244,163, 71,143,158, 63,127,142, 38,245,240,225, 67, 73, 73, 73, 6,220,154, 37,143, 93,121, 18,109,205,246,232, 35,227,115, -248,161,211,144,171,220, 24,222, 61,100, 23,146,252, 62,204,242,213,189,123,247,240, 20,181,120, 38, 3,208,218,254,104,247,202, -225,175, 3,144,111,224,154,137, 10, 24, 8,221,207,133, 44,251,127,149, 32, 50, 98, 32,241,110, 47, 72,185, 79, 82, 57,142, 92, -127, 0, 17,121,165, 63,176,123, 58, 97,194, 4, 96,219,191,160,160, 0, 88, 7, 64,218,130,211,167, 79, 31, 45,229,241, 0,128, - 0, 98,193, 83, 20, 46, 93,186, 28,146,224,136, 31, 82,135, 36,205,152,152, 24,136, 22,160, 33,144, 50,133,200,184, 4,170, 95, -178,100, 9, 80, 59,184, 40, 95, 66,146,213,240,230, 63, 36,159,144, 49, 19, 0,177,157, 84, 75, 41, 1,144,210, 31, 94,238, 35, -115, 9, 87,221,224,210, 31,194, 6,213, 1, 94,139,209, 6,118,240,235,133,199, 8,184, 14, 72, 39,168, 23, 88,196,255,250,245, -203,216,216, 24,216,187, 2,118, 2,130,130,130, 64,117,198,191,127,237,237,237, 95,190,124, 97,101,101, 5,102, 63, 92,122,133, - 30, 62,101,250,245,231,131,177, 2,235,145,103, 44,199, 95,254, 14, 82, 4,197,209,191,255,151,218,217,222,125,225,253,206,202, -227,154,121,123, 56,101, 42,130,205,222,206,206, 78, 96,121,135, 57,192,141, 89,178,195,155,255,152, 42, 7,225, 41, 94,233,233, -130, 72, 53, 10,168, 97, 1, 12, 6,178,239,249, 32,181,237, 15,204,245,240,187, 33,109,108,108,128,217,121,180,244, 39, 8, 0, - 2,136, 5,119, 81,184,108,230, 76, 80,240,101,100,100, 17, 89, 38, 66,198,181,181,180,180,224, 34,182, 96, 0,233, 19, 16,140, - 81,120,233, 15,183,139,212,226, 24,232,230,152,152, 40,112, 13, 20, 5,100,147, 90,121, 0,173,131,223,103, 48, 36,166,145,233, - 9,142, 30, 61,106,110,110, 14, 44,143,128,228,134, 13, 27, 2, 2, 2, 32, 67, 64,149,149,149, 12,224,171, 23,150, 47, 95, 14, -148, 50, 53, 53,197,212, 43,127,244,204, 11,115, 77, 96, 97,246,213, 92,150,121,195,243,223, 1,138,224, 33, 32, 6,189,202, 95, - 64,173, 95,223,126,220,183, 92, 69,222,252,139,158,233,147, 97, 16, 80,248, 47, 85,135,131,213, 96,128, 89,136, 35,223,169,130, -235, 90,105,172, 23, 55, 14, 56, 0,214,103,152, 75, 93, 33, 99, 59,164, 2, 50,116, 65,206, 12,103, 97, 97, 41, 44, 44, 60,115, -230,204,232,208, 63,145, 0, 32,128,176, 87, 0,192,182, 63,164, 36, 5,130,232,232, 72, 32,151, 96,129, 8, 25,234, 65, 46,253, -225, 0, 34, 8, 84,128, 85, 22,169,248, 70, 41,253, 33, 12,160, 32,145,101, 49, 48,202,129,197, 19, 68, 49,144, 4, 86, 0,196, -119, 2,224,165, 63,114,238, 34,178,206,163,164,253,130,220,234, 39,169,249, 15, 25,177, 1,182,250, 33,157, 0, 85, 82,154,255, - 80,189,225,233,240,187,159, 8,234,253,253,251, 55, 48, 83,241,242,242, 94,186,116,233,239,223,191,159, 62,125,186,126,253,186, -176,176, 48, 92, 1,144,237,237,237, 61,109,218, 52,204, 10,128,249,247,111,217, 51,151,217,120,165, 89, 47,189,253,248,151,247, -243, 39,182,191,215,191, 48, 8,115,192, 21,112, 11,255, 49,245,126,178,112,154,237,240,168, 0,128,161,138, 57,244,129,121,201, - 34,164, 7,128,182, 97,135,164,181, 58,180,184,225,142, 26,222,127, 15,233, 10, 32,247, 6,136,239, 64, 0,195,141,140,210,127, -233,210,165,135, 14, 29,250,191, 74,144, 49,236,125,127,127, 63,176,226, 4, 54, 77,102,204,152, 49, 90,190, 19, 4, 0, 1,196, -130,181, 52, 4,134, 32,114, 65, 12,172, 0,128,197, 43,176, 87,133,199,160,137, 19, 39, 66,134,110,176, 2,160, 20, 80, 1,158, -244, 13, 25,124, 71, 43,115,193,229,248, 18, 98,202,113,228, 46, 11, 4,196,198, 70, 47, 94,188,148,152,114, 28,185,244, 71,107, - 97, 17,212,139,199,203,120, 0,176,159, 4, 47,238,225,163,255,200,179, 2, 64, 5,120,244, 50,133, 67,135,242, 33,117, 0, 3, -210,154, 78,166,240,247, 36,232, 13, 79, 39, 82,239,133, 11, 23,228,228,228,128,109, 43, 8,119,209,162, 69,199,143, 31,247,241, -241, 65, 86,243,242,229, 75, 14, 14, 14, 76,189, 10, 23, 46,124,144,147, 60, 89,152, 4,225,178, 45,186,253,247,248, 71, 38, 31, - 20,149, 31, 95,114,178,115,252, 30, 54,153, 10, 88,178, 43, 41, 41,225,185,235,170,188,188,156,200,107, 14,145,135,128,112,117, - 8, 6,109, 32,144,161, 30, 82,113,146,164,119,217,178,165, 7, 14, 28, 96, 92, 3,106,142,236,170,225,117,107,249,108,103,103, - 55,186,244,147, 72, 0, 16, 64, 44,152,165, 33,114,243, 31,222, 9, 0, 22,166,200,181, 2, 86,128, 71, 22, 82,148, 19,108,254, - 99, 45, 97, 9,118, 2, 32,110, 70, 46,253, 33,131,128, 64, 7, 3,197,129, 89, 8, 79,213,133, 89,250,147, 84, 7,144, 55, 82, - 4,233, 9, 61,122,244, 8,178,230, 7,185,225, 15, 20,196,213,145, 66,214,187,232,200, 47,200,186, 29,228,198, 59, 80,144, 70, -122,129,197, 61,178, 79,237,237,237,187,187,187,157,157,157,255,253,251,215,214,214, 6, 36,191,127,255, 14, 12,103,172, 49,168, -126,252,248, 37, 91, 7, 56,247,143,189,228,223,238,199, 12,206, 98,255,255, 49, 92,106, 99,253,242,143,231,221,119,190,119,140, - 66,126, 49, 23,135, 83,190, 2,150,239,248,167, 91, 73, 41, 26, 87,129,200, 61, 97,196,244, 71,225,233, 22,235,106, 78, 60,247, - 53, 34,235, 5,182,163, 73,210,139,217,138,135,220,225, 76,159, 1, 55,208, 52, 53,164,244,191,244,103,254,254, 95,224,242,106, -180,244, 39, 22, 0, 4, 16, 74, 5,144,145,145, 5,186,213, 54, 38, 10,179, 37, 14, 25, 23, 2,162, 25, 51,166,209,200, 41, 88, - 11, 83,130, 53, 7,220,205,184, 12, 4, 86, 93, 64,132, 86, 61, 32, 87, 60,120, 50, 42, 48,121,209,104, 50, 0,158,217,200,216, - 8, 6, 84,144,144,158,158, 48,249, 43,234,102,174,247,180,211, 11,190,158, 30, 1,228,229,229,167, 76,153, 66,100, 89,182, 13, - 85,239, 63,121, 30,206, 41,154, 64,134,246, 76, 86, 6, 6, 96,171,255, 61, 24, 61, 28,174, 25, 12, 94, 16, 67, 24,116,184, 45, - 14,107, 73, 13, 23, 33,184, 10,136, 12,189,152,173,120, 34,251, 55,148,135, 45, 48, 25, 3,203,125, 32,123,193,254, 95, 43,142, -253, 2, 22, 5,163,251, 25, 73, 2, 0, 1,132, 82, 1,224, 41,220, 33,211,185, 4, 19, 31,217, 10,200,190,201, 22,127,133, 68, -161,179,105,157, 93,175, 93,187, 6, 95,253, 9, 25,162,193, 63, 77,130,166, 23,178,131,151,158,122, 71, 1,169,160,188,188, 28, - 62, 22, 4,100,211,199, 82, 58,239, 4, 30, 88,224,222,242,121,168, 56,117, 16, 2,128, 0, 98, 25, 13,130, 1, 4,192, 98,151, -236, 36, 59, 80,122, 71, 1,169, 99, 65,144,147, 18,128, 36,241,237, 98,148,213,159,176,193, 31, 92, 75, 66,113,141,231,224, 23, -161,133, 94, 90, 84, 93,248, 1,176,243, 10, 12, 22, 63,255, 52,104,119,115,251, 57, 8,195,203,211,104, 52,237, 17, 3, 0, 2, -104,180, 2, 24, 5,163,128,182,192,197,197, 5, 88, 1, 16, 63,177, 73,121,105, 59,176, 61, 0,250,214, 22,255, 33, 59, 10, 71, - 1,121, 0, 32,128, 70, 47,133, 31,137,128,243,231,141,239,236, 26,163,225, 48, 10, 70,193, 8, 7, 0, 1, 52,122, 28,244, 72, - 4,163,165,255, 40, 24, 5,163, 0, 8, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, - 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,136, 38,151,194,223,191,122,156,129,233, -135,164,140,244,231,239, 95,223,191,253,170,166,105, 67,188,222, 35,231,238, 50,252, 99,127,249,244, 41, 55, 39,183,160, 16,183, -185,137, 34,241,122, 41,113,243,191, 55, 83,120,121,190,115,114, 51,179, 48, 51, 49,114, 48, 62,255,148, 79,188,222, 79,188, 65, -130,194,130,252, 60,204, 12, 44, 12,239, 46,204,194,111, 47,167,244, 13,226,221,252,253, 41,202, 96,189, 20,215, 75,226,245, 62, -251, 38,142,162,247, 39, 9,246, 62, 67,157, 36,144,254, 69,194,245,170, 79,217,212, 7,131, 94,109,108,225,220,217,185,186,188, - 28,203, 81, 51, 87, 81,195,153, 83,230, 23, 9,113,244,132, 13, 37,109, 72,147, 16, 71,155,159,162,196,209,143,159,220,196,235, -229, 96,255,138, 98,148,223, 20,226,245,250,110,202, 65,230, 22,191, 32,225,216,156, 94,137, 12, 26,229,193, 81,189, 52,210,139, - 7, 0, 4, 16,190,101,160,169, 7,138, 24, 29,227,103,253,215, 39,198,160,123, 87,118, 49, 50,252,227, 97,231,156, 63,115,217, -194,133, 19,173, 93,172,255,124,253,166,165, 97,247,239, 31, 67,118,217, 95, 45, 45,245, 59,119, 30,254,248,254,135, 87,210, 26, - 83,239,209,243,175,254, 51, 48,126,249,249, 61,189,168,165,113,146,251,179,171,103,129,201,123,219,197, 39, 76, 76, 12, 19, 27, -106,110,221,186,169,160, 32,207,206,201, 34, 44,200,142,197,222,117,211,216,216,216, 56, 57, 57,121,120,120, 68, 4, 56, 68, 89, -121, 69, 37,185,249,217,121, 5,216,152, 88, 88, 88,254,255,251,251,137,153,225,211,171, 79,135,121,117,113,185,252,227,221,169, -188,156, 31,249, 4,216,120,184, 89,217, 56,153, 88,152, 25,152,216, 88,212,165,103,255,254,207,124,239, 89, 18,126, 95,239,127, -164, 44, 34, 34, 34,206,243,227,251,143,159, 76,236,156, 12,191, 25,254,200,197,124,120,255, 78,228,243, 54,218, 85,218,179,102, -205, 74, 75, 75, 27,109,188, 16, 4,184,138,123, 82,213, 0,129, 4, 39,215,211,167, 79, 89, 57,216,255,113,113,209,211, 11,223, -222, 93, 56,182,119, 5,178,136, 75,104,199,224, 12,237,197,139, 22,177,179,177,253,251,247,143,155,135,199,215,207,111, 52,249, - 13, 9, 0, 16, 64, 4,246, 1,252,223,187, 48,205,153,112, 29, 16,234,167,242,211, 73,232,247,151, 15, 44,127,153,204,244,100, -226,227,161,205,103, 96, 9,126,226,248, 2, 17, 57,233,127, 95, 62,217,155,235, 62,123,246,126,207,249, 63,104,122,211,211,219, - 24,216,248, 25,185,248,254, 51,255,191,120, 45,113,222,138,157,208, 38,249, 63, 6, 15, 75, 75,134, 47, 47, 24, 24,120,239, 94, -190,206, 42, 34, 96,109,161,195, 35, 32,134,197,122, 70, 38, 32, 98,252,207,204,250, 11,104,204, 31,102,102,102, 86,102,102, 54, - 86, 16,249,251, 47, 3,227,159,127, 32,119,224, 0, 47, 46,182, 8,241, 51,240,113,113,137,138, 8,243,241,113,253,103,250,251, -231,223,151,191, 12,127,121,120,184, 68, 36,100,148, 84,143,236, 57,136,253, 28,161, 25,187,127,241,243,114,243, 11,124,254,241, -141,237,235, 87, 14, 54,118, 14,214, 31,127, 65,237,193,111, 63,190,126,251,254,232,189,206,171, 55,239, 62,189,126, 18,102,133, -221,234,213,157,132,174, 73, 74,112, 17, 20, 23,196, 90,250, 83,177, 14,168,234,238, 6,146,109,165,165,100,232,173,236,234, 2, -146,237,101,101,196,107,185,242,244,233,173, 91,183,128,140, 32, 71, 71, 34,181,204, 92, 5, 58, 9, 7,249, 86, 44, 32, 27, 66, - 50,192,206, 71, 3,178,211,176, 29, 33, 9, 44,217,241,151,239,196,148,254,138,130, 66,223,127,253, 4, 50,216, 56, 57,126,125, -255,241,239,235,183, 55, 47,158, 75,234,234,226,209, 34,169,172, 70,208, 95,252,242,154, 55,246,109, 36,168, 12, 88,250,219,184, - 68,112, 8, 26, 16, 21, 88,161,239, 8, 42, 9, 11, 11, 91, 21,186, 7,171,148,227,158,215,112,182,150, 0,168,100,120,245,227, -223,247, 63,160, 16,254, 10, 38,103,154, 11,168,241,178, 98,213,219,211,211, 83, 85, 80,226, 31, 20,248,227,199,247,137,253,125, - 83,166, 76,201,201,201,161, 48,113,222,185,115,167, 27,156, 62, 9,110, 44, 56,126,252,248,131, 7, 15,222,190,125,251,249,243, -103, 94, 94, 94, 97, 97, 97, 5, 5, 5, 75, 96,233, 49, 10,192, 96,203,146,102, 56, 27,109,221, 63, 64, 0,225,171, 0,102, 59, -244, 5,159,104,253,119,108,107,154, 21, 3,254, 58,224,231,151,119, 18, 42,206, 45,165, 65, 11,102, 30,128,136, 28, 60, 54,227, -235,183,159, 94, 46,249, 86,214, 9, 17, 97, 78,156,156,236,191,254,254,249,252,237,151,154, 5,230,161, 61, 15, 25,126, 49, 4, - 69, 79, 79, 45,130,118, 45, 61,172, 28, 56, 56,216, 55,236,219,185,237,232,241, 69,243,167,253,248,254,147,141,153,133,135,139, -141,143,237,239,157, 71, 47,208,171, 40, 96, 17,240,255, 31, 8, 49,253, 3,178,127,254, 98,103, 0, 86, 49,236, 12,255,127,253, -253,203,204, 0, 44,202,255,254,250,247,231,239, 63,172,206,190,123,170, 93, 70,244, 63, 31, 47,183,180,140,162,134,174, 10, 47, - 15,231,199, 47,175, 95,188,126,241,254,227,203,223, 63, 24,185,128,181,130,168,117,112,224,229,181,235,213,209, 52, 78, 95,250, -248, 47, 47,239,119, 22, 6, 54, 14,182,239,223,216,126,125, 99,251,193,193,206,194, 8,204, 37,204, 63,190,127,249,254,237,243, -247,239, 95,191,127,250,248,249,197,195, 9, 19, 30, 43, 27, 99,223,255,217,189,168, 27, 87,120,150,198, 97, 47,145,223,191,127, -143,204, 22, 18, 18,130,148,134,130,130,130,119,239,222, 93,189,122, 53, 73,181, 2,155, 56,116,252, 1,104,168, 32,185,105,107, -214,234,213,217,217,217,191, 95,189, 34,166,244, 23, 19, 19, 11,114,115,251,205,206,222,219,219, 27,236,228, 68,204,241,150, 64, - 15,246, 52, 52, 64, 71, 42,234,235,123, 27, 27,177,178,113,105, 71,174, 3,128, 12, 99, 99,227, 61,123,238,185,184, 40, 17, 89, -250,107, 72, 72, 10,240,241, 65,146, 25, 55, 7,231,243,215,175, 62,189,255,192, 35, 32,248,240,244, 25,121, 83, 19, 60, 26,253, -210, 74, 98,130,125, 85, 21, 20, 32,220,250,222,201,112,169,198,226, 92, 32,249,104,251, 94, 51, 53, 89,162,134,122,136, 44,253, -161, 45, 11, 33, 66, 42, 8,239, 71,227,102, 97,188,216,152,204,200, 39,242,247,222,197,159,247,174,222,122,247,213,100, 59,190, -248,157, 49,115,102, 81,122,118, 92, 74,210,234,165, 43,128, 37,111, 75,103, 23,111, 67, 11,252,210, 8, 74,138,126, 80, 94,192, -219, 58, 1,150,248,187,118,237,250,253,251,183,178,178,178,173,173, 45, 63, 63,255,135, 15, 31,158, 61,123,118,255,254,125, 32, -233,230,230, 6,172, 15, 70, 75,127, 52, 46,114, 29, 0, 16, 64,232, 21, 64,218,109,216,209, 58,224, 29,118,255,255,125, 97,248, -245,243,247,129,101,105, 14, 12,132,250, 1,108, 90,154,234, 76, 76, 7,110,125,120,203,192,112,253,227,211,219,192,254,242,198, -173,147,190,189,249, 27,157, 88, 8,108,206,251,249, 90,254,101,225,193,165,249,214,173,235, 64, 53, 94,250,192,102,157, 20, 3, -131,252,143,159,191, 66, 60,220, 56, 4,152, 22, 45,219, 1,108,190,175, 89,177,128,249,207,103, 77,121,246, 59,143,208, 53,254, -251, 15,186,151, 10, 8,254,254,253,251,147,245,255,111,198,223,191,126,253,250,198,245,131,225, 31, 7,211,255,191,127,217,254, -127,249,245,227,215,247,111, 12,124, 88, 44, 21,229,249,201,194,194, 9,108, 47,168,168,168,136, 75,152, 51, 48, 51,253,253,123, -150,233,255,135, 31, 95,129, 85,198,215, 23,207,222,137, 10,191, 17, 22,176,150,148, 93,204,192,128,210,226,227,252,241,231,255, -207, 55, 12, 63,216,127, 49,253,254,202,198,242,133,147,149,133,149,141,225, 31, 55, 35, 51,227,151,175,223,222,191,120,120,247, -236,209,119,143, 30, 1, 93,197,244,159,153,200,120,154, 55,125, 30,132,145,148,137,115,220, 9,249,158, 41, 32,187,168,168,232, -209,163, 71,192, 34,146,188,189,151, 83,167, 78,125,249,242,229,154, 53,107,188,237,236, 4,197,196, 72,213, 14,108,251,191, 7, -151,140,144,131,225,210,195, 8, 28, 87, 9,108,251, 3, 75,127, 80, 66, 97, 99, 83, 83, 83, 91,187,111, 31, 49, 93, 1,202,207, - 64, 6,150,242,192, 66, 31,114, 97, 8,156, 12, 13, 13, 37, 88,250,171,137,137, 3, 75,127,102, 38,166,172,152,232,239, 63,126, -246,206,157,203,197,201,249, 3, 8,190,127,103, 98, 97,126,124,254,188,172,161, 33, 46,189,144, 82,254,246,131, 7,200, 92, 50, -128,185, 83,196,158,213, 21,174,126,201,255,217, 85,137,212, 2, 63,203, 19,114,155, 35, 86, 17, 92, 0,216,240,127,248,229,239, - 65, 87, 81,214,252,153,159,162, 21, 89, 4,197, 8,150,254,123,247,238, 85,144,148, 74,201,202,168, 40, 44,155, 50,127,134,153, -145,209,140,201, 51, 10,202, 74,150, 90,154, 95,190,124, 89, 23,111, 87, 9,127,209, 15, 52, 25,200,197,175, 30, 88,250,139,138, -138, 26, 26, 26, 50,129,123,249,192, 28,199,202,202, 10,108, 24, 73, 72, 72, 0,235, 0,160,108,112,112,240,104,233,159, 86, 14, - 29, 54,156,213, 89,129, 86, 7, 0, 4, 16, 74, 5,144,122,172,242, 27, 51,199,191,191,255,254, 49, 50,243,254,255,206, 0,108, - 6, 51, 48, 51, 72,171,177,254,250,250,127,207,188, 52,151, 36,188,117,192, 63,102,102, 72, 97, 7, 44,107,101,248,165,213, 31, -222, 92, 51,125,230,124,166,159, 92,110,142,214, 59,246, 30,253,246,141,129, 75,136, 31, 83, 27, 39,151,250,247,111, 55,129,197, - 55,124, 84,134,129,225, 25, 19,179, 67, 92,124,242, 63,246,175, 91,182,206,243,243, 77,226,226,102,248,246, 22,152,136, 37, 48, -181,255,102, 96,102, 5,151,254,191,255,252,253,249,233,247,183,223,223, 62,112,178,252,254,198,250,147,229, 55,243,111, 70, 96, - 65,254,233,251,159,175,159,127, 51,136,163,107,188,184,191, 83, 73,130,145,153,153,145,145,137,253,239,223,255,127,190, 61,250, -249,247,247,211, 23, 31,223,189,255,242,241,243, 95,166, 31, 63,254, 48,188, 96,102,189, 32, 37,247,137,151,131, 19,211, 94,160, - 87,255,127,254,241,253,243,179,191, 47, 63, 50, 43,203, 0,211,223,223, 63, 63, 63,188,120,112,243,212,241,215, 15, 31,129,139, - 45, 22, 38, 96,232, 50, 83,243, 12,119, 72, 3,127,214,172, 89, 33, 33, 33, 6, 6, 6,236,236,236,125,125,125,228, 25, 5,105, -254, 91,232,232,136,139,139, 3, 75,112, 31,123,123, 41,210,235, 0, 65,112,185,207, 42, 38, 6, 52, 1, 72, 18,236, 7, 0,219, -254,172, 63,127,174, 93,187, 22,185, 43, 64,252,112, 16,217, 0, 82,238, 35, 95,201, 2,172, 62, 9, 86, 0, 95,191,125, 19, 21, - 18, 74, 12, 9,249,240,241,211,235,119,111, 89, 89, 89, 32, 0, 88,196,176,115,114,125,122,251,230,243,227, 39,188,178, 56,167, -230,128,165,255,146,181,155,145, 43, 0, 72, 63,192,220, 72,207,203,209,158, 8, 87,127,102, 96,224,229, 21, 54,112,241,227,222, -189,105, 46,125, 70,255, 47, 45,156,240,115,199,124,177,217,231,128, 53, 1, 51,159,208,159,247,175,128,165, 63,176, 67,240,245, -207,127,102, 28,195,168,247,239,220,217,182,105,235,194,217, 11, 39,205,157, 54,163,111,130,144,176, 80, 75, 91,203,162,101, 75, -109, 45,172,231,205,157, 23, 20, 26,100,107,109, 75, 70,233,191,105,211, 38, 96,191, 86, 82, 82, 18,237, 2,106,180,145, 31, 96, -219,223,200,200,232,207,159, 63,192,174, 0, 7, 7, 7,176, 2,184,113,227, 6,176,169,193,195,195, 3,236,237,189,120,241, 2, -168,102,116, 44, 8, 81,128,148,119, 64,234, 0, 56, 0, 8, 32,148, 10, 96,182, 85, 59, 84, 29,211,229,255,251,230, 51, 10, 75, - 50,164, 76, 62,205,169,105,250,120,227,191, 89,181,204, 71,150,167,217, 50,205,250,135,165, 74,223,180,239, 93,154,202, 39,255, -248,252,226, 92, 96, 7,226, 29, 48,225, 50, 48,252,148, 87, 55,226, 96,103,249,254,245, 39,195, 47, 80,197, 0,236,139,189,122, -247, 30, 83,239,132,254, 34,208,221,241, 39,230, 50, 49, 65,150, 49,128,134,107,254,125,191,250,227,231,111, 78, 30, 14, 6, 54, - 80,197,240,249,211, 39, 49,164,251,167, 80, 60,240,239,215,191,127, 44,192, 20,240,243,231,207, 47, 44,204, 44,191,152, 24,158, -127,250,195,245,231, 47,219,191,255,172,204,223,152, 89,254,124,253,246,229, 23,150, 69, 29,188, 60, 95,255,252, 97,252,249,235, - 47, 48,123,223,186,243,232,201,243, 55,223,127,253,254,244,229,221,151,207, 31,126,252,253,197, 8, 76,244,223, 62,126,250,118, -255,225,211,143,111, 63,127,101, 96, 80, 65,211, 14,116, 22, 36, 71,252,249,248,245,201,133,235, 47,175,223,255,244,249,206,231, - 15, 31,254, 51,176,176, 50, 51,254,103,100,101, 98, 2,245,161, 8, 30, 83, 82, 26, 87,138,103, 44, 8,139,127, 89,160, 81, 6, -204, 30,192, 26, 23,249,176, 73, 82,155,255,192, 90, 4, 52,198, 45, 42, 74,252, 41, 99,216,139,117,112,185, 15,172, 3,240,116, - 2,174, 60,125,202, 0, 62,251, 26,216, 34,131,244, 3, 64,197,205,165, 75, 64,114,221,254,253,248,235,128,226,250,122,200, 72, - 23,144, 93,210,208, 0,239, 19,224, 25,249, 65, 6,192,230, 63,218, 56, 50,228,208, 99,248, 88, 16, 86, 32,192,194,242,227,215, - 79, 96, 8,223,184,119, 23,104,227,181, 91,183,127,253,250,205,196,192, 8, 12,127,160, 99,128, 45,142,239, 95,191,237, 94,181, - 50, 8,233, 48, 87, 52, 0, 47,253, 99,130,125,145,197, 79,158,187,164,170, 40,207, 78,216,225,176,177, 11,118, 85, 96,209, 15, -236, 7, 0,145,103, 96,242,111, 22, 85, 26,150, 16,239,158,179,201,169,189,202,230, 96,119,138,252,123,102,199,223, 79,160, 73, -133, 87,217, 86,242, 51,143,255,253,135,189, 41,163,174,170,206,197,197, 61,105,206, 84, 71,123,123,115, 75,139, 93,219,118,222, -184,115, 11,216, 49,231, 96,103,183, 54,182,222,186,105,235,155, 87,111, 2, 3, 3,137, 47,250,129,205,246,123,247, 64, 81,118, -234,212,169,140,140, 12, 60,189,219, 7, 15, 30, 40, 43, 43, 67, 24, 23, 47, 94,148,151,151, 87, 84, 84,124,255,254,253,153, 51, -103,148,148,148,128,141, 12,160, 8, 80,106,180, 2,192, 3, 0, 2, 8,203, 28, 64, 26,227,197,255, 7,151, 49, 50,179, 48,228, -206,205,127, 32, 57,169,111, 33,176,176,156, 94,123, 51,181, 77,157,121,207,172, 52, 89,205, 89,170, 89,192, 54, 55, 19, 19,202, -224,134, 10,159,204,149, 75,235,192, 76, 96,193,248, 21,124,212,251,111,134,223, 63, 89,254, 1,155, 14,160, 50,125,253,134, 93, - 64,210,218, 19, 75, 25,177,227,242,127, 15, 67, 29,120, 23, 22, 88,202, 49, 48,176, 50,176,114,252, 97,252,251, 15,124,210, 83, -120, 52,232, 76,249,135,199,102, 97,234, 5,166,203, 63,255,152,152,254,252, 97,250,245,243, 27,184, 27,248,157,153,153,251,207, -247, 79,223,129,133, 48, 35,176,103,240,237, 47,195,183, 95,127, 48,253,249,231,215,191, 31,172,204,255,190,253,249,243,239,227, -231, 47,191,153, 25, 89,127,254,249,253,235,255, 47, 32,193,192,246,143,137,145,129,145,253,223,199,239,127, 95,188,254,246,245, - 39,250,196, 53, 19, 35,180,195, 2, 44,151, 32,103, 81,253,254,241,253,227,187,119, 76,192, 80, 99,249,207,240,159,133,153,145, -129,248,150,255,205,135, 55,213,229,213,241,140,252, 32, 15,136,115,114,114,194,107, 2, 96, 62,129,148,254,192,106,128,159,159, -255,227,199,143, 31,128, 53, 16, 17, 99, 38,144,230, 63,176,155, 12,225,230,228,228, 76,158, 60,153,188, 78, 0,220, 4,200, 64, - 16,254,209,127, 70, 94, 94,160,131,203,202,202,128,141,232,223,239,223, 3,221, 92,145,147, 67,176, 31,128, 60,214,143,107, 62, - 0, 83, 87, 39,161,105,246,179, 96, 0, 97, 99,158,136,245,254,221, 59, 30, 94,222, 55,239,223,239, 63,121,146,133,137,249,231, -239,223,223,190,127, 7, 54, 48, 33, 85, 17, 48,145,252,250,249, 19,127, 80, 99, 14,251, 0, 69, 32,157, 0, 85, 5,133, 71,247, -238,144, 20,194,192, 58,224,235,235,147,219,215,207, 37,163, 31, 64,112,228, 7, 14, 46,172,154,109, 16, 95,200,174,168, 7,202, - 32,111,158,223,122, 7, 90,105,202,110,233,243,232,239, 31,174, 41, 39,177,106,249,244,233, 19, 59, 39,135,138,162,226,253, 39, -143,223,190,126, 27, 30, 19,189,109,239,238,137, 29,189,235,183,109, 82, 85, 84,141, 11,142, 61,126,238,232,250,181,107, 3,113, - 15,197,192, 75,127, 96,209,239,234,234, 10,169,161,159, 61,123, 6, 44,253,241,187,246,237,219,183,182,182,182,192, 60, 14, 44, -229,143, 30, 61,170,165,165, 5, 76, 81,178,178,178,192,206, 49, 19, 24, 0, 59, 16,240, 40, 30, 5, 88, 1, 64, 0,177, 96, 41, -253,247, 45, 96, 96,103,103, 16,146,251, 38,107, 62,169,101, 6,195,223,175, 12, 47, 62,213, 44, 63,152,225,159,193,176,103,225, -163, 23,175, 25, 84, 25,254,253,253,131, 86, 1,220,249,244, 73, 77,128,239,207, 79,134, 59, 7,150,168, 56,184,131,199, 72, 24, -126,255,250,205,202,192,244,229, 7,104, 17,133,135,131, 17,167,176, 52, 86, 71,120,232, 50,110,187,248,159, 21,216,220,151,115, -255,245,232, 48,164, 19,192,202,198,254,155,225, 7, 15, 39,232,238,192, 77,219,150,127,127,251,216, 66, 89, 0,203,192,211,191, -127,108,191,190,255,102, 96, 3, 86, 2, 12, 63, 64, 89, 20,216, 43,252, 9, 44,218, 89, 88, 25,126, 48,252,255, 7, 26, 26, 2, -138, 96,230,128,111, 63,254, 49, 51, 51,254,254,243,251,199,207,127,159, 62,255, 0,185,246,223,255, 95, 63,255, 1,107, 31,102, -160,110, 14, 6,198,239,127,255,129,150, 16,125,255,252, 29, 95, 8,130,186, 2,255, 24,254, 51, 50, 48, 49, 1, 75, 7,230,127, -255, 25,129, 12, 80, 45,248,143, 9, 88, 49, 49,254, 99,198,223,252, 39, 53,194,184, 96,203, 16,145, 75,127, 96,123, 7,216, 5, - 6,118,131,224, 45,101, 98,154,255, 10, 34, 34, 16, 46,144, 65, 97, 39,128,200,209,255,255,159, 63,215,214,214,254,124,251, 22, -114,253,163, 10,184, 6, 98,253,249,211,215,215,247,233,171, 87,210, 84, 93, 97, 9, 31,225,129, 79, 0,160, 1, 99, 99, 99,120, - 15,224,234, 83,140,246,193,207, 95, 31,126,189,251,241,227,135, 0, 63, 63, 7, 48, 41,254,253, 3, 12, 88, 96, 89,243, 11,216, - 17,248,253,251,223,159,191,248,195,249,246,131, 7,240, 25, 96,228,177, 32,228,153, 97, 82, 1,183,168, 57,176, 29, 69,134, 70, -226,231, 0,236,119,191,126,165,176, 6,216, 9, 96, 84,212,147,159,127,254,205,143,127,220, 44,140,191,142,108,184,121,239, 62, -174, 4,242,253,207,175,179,199, 79, 77,232,233,183,114,176,169,105,106,216,185,125,231,210, 69,139, 45,237,108,100, 21,228, 88, -184, 88,247, 30,222,187,108,225,226,117, 27,214,110,221,186,213,219,219, 27, 83, 59,228,158, 28,120,209, 15, 1,192,118, 12, 49, -254, 2,166,121, 96,137, 15, 74,192, 10, 10,192,216, 4,118,215,128,217, 31,216,234,103,103,103, 7, 54,134,128,130,188,188,188, - 64, 53, 35,185,124, 7,182,108,182, 44,105, 70, 27,246, 65, 6, 0, 1,132, 50,176, 7, 26,249, 57,188,148,129,147,227,193,167, - 95, 12,223, 63,178,255,251,166,167,163,196,240,246, 27,195,175, 63, 14,250,106,160,133,153,191,127, 48, 51,130,135,104,254,253, -197, 48,234,195,173, 15,143, 88,216, 25, 60,252, 10,151, 77, 2, 54, 82,126, 49,124,251,249,247, 59,195,134,253, 23,246,156, 6, -221, 23, 47, 35,167, 8, 90, 99,143, 3,120,233, 51,254,254,193,176,105,235, 14, 19,183, 92, 80,243,159,129,149,153,147, 33,204, - 39,212,203,206, 31, 40,251,228,225,221,255,191,255, 98,111,221, 0,155, 99,160,201,234,191, 63,127,129,166,127,127,254,248,254, -237,219,183, 47, 95,190,124,254,244, 17, 24,247,159, 62,127,249,241,229,203,247,239, 88,138,240,207, 95, 24,191,255,248, 11, 68, - 95,191,253,254,252,229,231,251,207, 63, 63,124,250,245,241,243,239, 15, 31, 64,228,187,183,127,222,189,255,243,238,227,159, 55, -239,126,189,124,131,101, 4,137, 9, 88, 28, 0,179,214, 95, 70, 70, 38, 96,153,255, 31,228,142,255,204,127,255, 65,195,243, 31, - 56,187, 16, 51,255,171,105,169,121,116,219,209,157,251,118, 66,234, 3, 96,111, 0,143, 98, 96, 18,103,129,133, 97, 23,120, 21, -102, 69, 69, 5,228,148,121,228,101,145,196, 52,255,197,197, 81,102, 69,178,179,179,183, 30, 58,244,140,136,197, 60, 88, 1,176, -249,143,191, 10, 1, 54,243, 33,140,149, 43, 87,222,121, 1, 90,202,181,229,192, 1,184,224,205,155, 55, 69, 69, 69,105,148, 7, - 32,165, 60,242, 21,137, 16, 54,158,241, 31, 80, 69,203,199,251,239,239,223, 79,239,222,191,121,243,230,237,135,247, 95,191,125, - 3,162,207, 95,190,124,253,248,233,243,135, 15,192, 84,246,235,199, 15, 96, 53,128, 75, 59,114, 41, 15, 47,253, 33,108,228, 21, - 65,248,193,151,215, 39,247,172, 70,100,221,111,239, 46,208,186,188,120, 30,174, 0, 44,247,129,165,255,207,131,107, 30, 38, 26, - 2, 75,255,195,174,162,127, 62,190, 54,217,241,138, 5, 71,244, 2, 91, 18,169,249,153,119,110,222, 60,126,224, 48, 63, 47,127, -100,120,164,128,176,208,185, 83,103,120,216, 56,184,185,185, 37, 21,164,150,175, 88, 94, 81, 93,245,133,184, 50, 29, 2,140,140, -136, 58,205, 31, 88,190, 3, 11,122, 96, 75, 31,216,234, 55, 51, 51,211,214,214, 22, 17, 17,225,224,224, 0, 22,253,250,250,250, - 2, 2, 2,144, 85,161, 35,188,141,143,220,187,197,236,233, 2, 4, 16,162, 7,144,118,107,218,255,215, 15,126,176,114,236,121, -197, 5,140,107,133, 15,207,153,215,181,108, 79,111,238,214, 82,145, 20,228,200,213,224,100,152,122,254,255,239, 95,143,153,193, -227, 6, 88,202, 25, 30, 96,138, 5, 82, 23, 47,109,214, 55,240,173,171, 89,180,113, 93,223,174,253,215, 29, 45,181, 89, 88,216, -119, 31, 62,247,159,153,229,215,223,191,248,221,234, 97,168,177,227,236, 13,134,222,142, 16, 95, 47, 31, 31,223,157,251,214, 3, - 27,232,222,238,145, 76,127,127,179, 50, 99, 47, 78,129, 69,255, 95, 80, 73,251,151, 5,216,210,255,207, 2,108, 2, 0, 27,194, -160, 37, 1,192,134, 56, 35,168,127, 0,233, 37, 96,233, 63,126,231,101, 98,126,207,198,206, 4,106, 53,255,253, 15,108,237,255, -251, 15,236, 61, 0, 59, 1, 12, 76, 28,255, 25,153,129,173,121,198,191, 76,140, 63,255,254,255,240,245, 63,159, 56,214, 1, 25, -196, 89,228,144,240, 96, 97,254,207, 4,170, 16,152,225,133, 33,168,110,192,221,252, 7,150,254,208, 86,234,130, 61, 64, 4,100, - 0, 43, 3, 6, 47,124, 65,244, 15, 60, 20,187,102,205, 26, 72,222, 83, 84, 84,132,120, 16,216, 44, 5,122,156, 96, 5, 0, 44, -253, 33,205,127, 69,234, 21,184,172,224,129, 35,111,123,156, 19,155, 86,186,186,189,189,189,192,102, 62,176,160, 7,246, 6, 2, -192, 39,227,171,171,171,195, 5, 31, 62,124, 40,194,206, 46, 1,235,145, 80,119, 14, 0, 8, 32, 87,178, 32, 95,123, 75,240,210, -218,247,111, 62, 50, 50,252, 1,181, 40, 94,126, 99,227,224, 0,109, 42, 4,247, 0,190,127,249,242,243,235, 87,208,132,211,135, - 15, 30,184,239,158,133,148,242,144, 81, 32,115, 35,189,147,231, 46,193,165,208,166, 4,112, 54,111, 95,159, 60,121, 96,189,179, - 87, 4,180, 50,248,120,251,230,165,163,100, 52,252,137, 31,255, 1,245,213,222,125,125,148, 98,250,255,254, 37,177,217,231,190, -254,249,255, 41, 90,145,127,217,253, 79,137,194,192,210,159, 9,119, 5,159,157,147, 83,219,209, 34, 38, 44,242,251,223,223,219, -143,239, 69, 71, 70, 45, 90,178,100,227,134, 77, 81,209, 81, 63,127,252, 60,124,230,216,247,239, 95,210, 18, 18,246, 30, 63,142, -185,142, 3, 24, 35,119,238,220,113, 3,119, 16,145,251, 1,111,223,190, 45, 45, 45,133, 79, 12, 96, 5,194,194,194,207,158, 61, - 19, 20, 20,156, 49, 99,134,169,169,169,161,161, 33, 27, 27, 27, 48,239,159, 56,113,194,194,194, 2,168, 0, 40, 43,140, 99,238, -112,196,214, 1,104, 0, 32,128, 16, 21,192, 44,181, 44,135,175, 51,111, 61,121,255,220, 23,220,232, 56, 89,241,127,203,116,169, -151,247,251,237,131, 24, 62,188, 99,104, 91,240,255,233,141,191,156,220, 31,222,129,186,239,140, 24, 91,171, 14, 30,216,104,239, -224, 12,100,124,253,247,251,206,135, 71,192, 18, 89,133, 79,209,209, 81, 79, 92, 68,226,237,199, 79,160, 14,194,175, 63,207, 63, -124,213,196,230, 8, 25, 57,203, 39,143,142,131,211, 44,139, 7,104, 37, 40,203,142,203,191,119,110, 89,243,242,205, 51, 97, 1, - 80, 23, 79,128,141, 85, 82, 0,251, 18,210, 95, 12, 44,108,160,150, 24, 51,176,209,205,244, 23,216, 71,249,243,151,149, 5, 82, -250, 51,128, 23,137,130,182, 8, 96, 3, 1, 17, 21, 27, 22,151,112,177,253,103, 97,133,245, 36,126, 51,252,249,207,240,227, 23, -195,223,159,192,134, 61, 35, 35, 27, 35,208,220,175, 63, 25,146, 19,186,208,182, 86,195,103,128,255, 49, 1,235, 13,208,248, 15, -164, 13, 14,236, 1, 48, 49,131,170, 35,160,236,127,102, 96,183, 0, 95, 39, 0, 94,250,163,177, 65,117, 0,174,225,166,191,127, -129, 69, 15,176,248,134, 84, 0,107,192, 0,200, 85, 86, 86, 6,218, 62,113,226, 68, 96,135,224,221, 59,124,187,129, 74,192, 96, -199,142, 29, 95, 95,162,156, 88, 0,172, 15,238,223,191,207,128,119, 83, 24,230,206, 47, 96,209, 15,172, 78,128, 65,231, 99,111, - 47,141,123,254, 0, 88,178, 91,233,233,189,125,240, 0, 88,202,223,130,173, 5, 82,149,148, 44, 42, 42, 58,122,244,168,154,154, -154,142,180, 52,158,105, 15,228,113,127,226,231, 0,144, 39, 3,202,203, 65,139, 62,239,221,131,182,253,225,219, 2,240, 44, 4, -226,145, 22,251,254,252, 5, 48,101,125, 5, 54, 50,223,188, 6, 38,174,255,255,255,253,248,241,227, 63, 24,220,191,118,253,247, -175,159,120,150, 0,161,244,110, 29,237,129, 8,190, 36,148,152, 33,160, 47,111, 78, 1, 75,127,144, 51,184,185, 55, 34,117, 2, - 76,108, 3,105, 90, 82,152,108,127,117,198,147,193,192,216,229, 85,182,149,196,180, 99,192,250, 64,144,141,241,237,187,247, 44, -140,140, 44,120,199, 8,227,226,226,224,236,205,155, 55,123,121,123,110,217,180,101,213,170, 85, 13,213,181,187, 14,236,101,102, - 97,150,150,145, 6, 6, 36, 3, 27,150,133,124, 42, 42, 42,152,213,192,238,221,187, 25, 8,109, 1, 3,182,244,239,221,187,167, -165,165, 85, 80, 80,176, 98,197, 10,126,126,254, 27, 55,110, 32,143, 13, 0,101, 21,200, 29,112, 27, 33, 0, 32,128, 80,230, 0, - 14, 24,166, 51,192, 86, 54,111,121, 37,224, 35,202,248,255,204,182,255,199, 55,129,234,126, 14,142, 31, 92,188,187, 5, 28, 94, - 88,186,128,199, 34,208, 55, 4,222,188,245,235,200,137, 54, 80,153,200,204, 1, 25,174,184,243,233,121, 93, 78,210,183,111, 63, - 63,125, 7,205, 1,252, 98, 98,119,242, 8,193,234,136,218,234,132, 29, 91,193,219,106,254, 66, 6, 91,254,120,232, 50, 70,100, -245,113,113,177,243,129,231, 0, 88,255,253,144, 22,197, 94,190,176,252,255,243,139, 17, 84, 7, 0,139,138,191,192, 60, 10,204, -169,127,192,115,182,140, 76,192,238,192, 31, 72, 69,133,163, 14,248,240, 93,224,251,207,183,108, 44, 32, 69, 64, 21,127,128,213, -199,239,255,191,255,252,255,242,253, 31,168,249,207,192,248,251, 31,116, 48, 7,189, 32, 6,141,238,255, 5,194,255,192, 98, 1, - 60,254,195,200,128,110, 5, 68, 91, 94,161, 35,174,115, 57,174, 31,191, 78,106,108, 1,211,244,247,239,223,117,117,117,149,148, -148, 30, 60,120,176, 10,188, 75, 22, 82, 25, 64, 64, 71, 71, 7,193, 58, 0, 8,176, 78,175, 5,199,199, 51, 16,177, 41, 12,178, - 53, 23, 25,248, 58, 56, 16,156, 61,150,128, 53,196,144,123, 3,192,134,191,137,186, 58,219,215,175,248,189, 76, 73,250, 70, 46, -229,145,119, 81, 48, 16,177, 79,152, 83, 82,226,219,237, 59,127,255,252,249,244,254, 3,184,119, 5,138,226,247, 47, 95,125,122, -255, 30,232, 42, 60,205,127,180,201,128, 37,107, 55, 35, 47,253, 68,158, 30,192, 14,190, 93, 60,177, 31,178,158,130, 97,227,106, -208, 2, 80, 35,251, 8, 33, 49, 3, 90,150, 3,255, 81,234, 0,134,217, 6, 25,117, 47,254,253,211, 95,112,234,148,135,184,246, -150,151,192,210,159,151,149,216,131, 35,129,145,187,239,192, 62, 39, 87,231, 77,107, 55, 52,119,118,148,127,252,248,255,223,191, -149, 43,215,138,136,136, 60,250,132, 83, 23, 90, 53,192, 64,104, 11, 24, 16, 88, 90, 90, 2,219,248,231,206,157, 51, 50, 50,114, -118,118,222,191,127,191,156,156, 28,176,133,100,111,111, 15,140, 32,160, 56, 43, 43,235, 8, 95, 2, 4,217, 7, 0,239, 1,160, -113,129, 0, 32,128,112,238, 4, 6,246, 3,230, 94,222,163,243,247,170, 4,235,199, 31,255, 89,110,255, 23, 96,126,253,233,133, - 5,116, 27, 33, 19,182, 1, 25, 81, 33, 67,175,132,184,191,255,225, 77,245,255, 95,190,126, 98,102,225,103, 96,226, 42,235, 33, -176, 83,201,195, 91,103,195,212, 10, 6,166,111,240,130,148,135,135,255,239,239,247, 12,255,191, 62, 60, 54,203, 68, 79, 14,231, -224, 50,176,145, 13,206,154,127, 24,152,217,254,131,171, 1,112,233, 15,106, 46, 51, 64, 9, 92, 32, 33,173,102,214,228,134, 63, -191,223,177,128, 23, 57,131,250,248,127,254,255,248,205,240,233, 51,176, 51,240,255,207,127, 38, 22, 86,198,214, 38, 44,139, 91, - 82, 82, 64,195,199, 11, 23,220, 97,252, 13,106,254,131,186, 25, 32, 10,220, 74,250,207,204, 8,154,139, 98, 41, 46,113,195, 99, -117, 74,115,202,131,187, 15,200,136, 81, 96,250,126, 15, 94, 63, 99,108,108,108,102,102,246,250,245,235,187,119,239,130, 22, 38, -254,251,183,118,237, 90,130,117, 64, 78,124, 60,167,152,152, 15,182,225,154, 28,112, 5,192,137,187, 40,135,100, 72, 52,189,210, -226,226, 36,185, 31,216, 27,176, 6,247, 6,196, 56, 57,117,172,172,104,154,250,209,202,119, 96,136,161,205, 6, 19,172, 3,132, - 85, 85, 62,191,127,207,194,206,246,243,231,143,191,191,255, 0, 3,153, 87, 80,240,227,187,119,192,210, 31,127,243, 31,190, 17, - 12, 50, 1,112,242,220, 37, 96, 5, 0, 31,253,199,181, 47, 76, 77,242,253,155,183,111, 86,173, 94, 14, 23, 9,139, 78,126,247, -139,180,117,159,152, 99, 62, 24, 34,140, 4,251, 1, 12,219,161, 7, 57,168,108,132,238,189,255,248,251, 47,241,110,112,114,112, -186, 40,120,209,205,219, 35, 53, 54, 89, 79, 95,119,211,198,205,199, 47,156, 77, 75, 75,123, 68,232,144, 50,120, 53,208, 13, 6, - 4,119, 56, 2,107, 11, 96,143, 97,203,150, 45,192, 38, 17,176,223, 0, 89, 11,119,245,234, 85, 96,219, 31, 88,250,195,235,146, - 17, 14,208, 54, 3, 35, 3,128, 0,194,119, 20,196, 63, 93,151, 75, 12, 46,151, 72,177, 73, 71,199,122,210,164, 69,121,249,145, -210,242,192, 84,251,147,149,157,227,201,243, 79,246,190,113,196,232, 53, 52, 84, 74, 72, 8, 91, 48,111, 29,195,191,135,192,150, -253,159, 31,223,165, 37,249,229,248,254, 16,208,246,247, 31, 11,211,191,223,140, 44,172,255,255, 64,171, 1, 32,241,255, 47,145, -203, 90,210,114, 65, 67, 10,245,149,153,172, 44,140,144,115,131,254,254,253,251,225, 51,176, 38, 96, 96,102,249, 55,109, 42,190, -244, 23,159, 0,218, 28, 48,111,238, 77, 6,200,137, 52, 76,192,238, 2,104,204,167,168,196,135,160,189, 31,191,124,196,122,212, - 15, 65, 0, 44,131,128,157, 0,160, 35, 63,125,250,196,204,204, 12,100, 72, 72, 72,252,254,253, 27, 57,171, 0,235, 0, 92,103, - 66, 64,154,234,130,100, 45,247, 20,130, 4, 41,137, 37, 62, 38, 16, 39,113, 88,150,236, 57, 0,180,146, 29,235, 90, 32,130,219, -193, 20,204, 76,129,228,141,131, 7,127,124,251,254,239,239, 95, 77, 99, 99, 93, 43, 59, 30,105,188, 1,248,159,241,225,253,187, -160, 25, 23, 6,134,164, 32,232,148, 14, 80, 4,153,141,117,139,200,173,231,192, 36, 33, 24, 30,157,242,240,241,139, 19,135,182, - 0, 69, 86, 45,157,107,110,231,195, 43,110, 67, 76, 64,133,129,246, 97, 16, 62,233,225, 47, 35,246, 77, 8,143, 2, 37,182, 63, -251, 65,173, 66, 71, 31, 12,206,156, 57,179,247,196, 65, 97, 17, 97,146, 14, 41,129, 84, 3,196,168,228,229,229, 13, 14, 14, 62, -126,252, 56,176, 25,116,234,212,169,209,179,128, 48, 71,255,209, 74,127,180,249, 0,128, 0,162,254,165,240,202, 26,166, 91,119, -222, 9,240,230, 18,147,150,125,247,249,143,189,119, 44,241,122, 45, 77, 53, 44, 77,171,210,211,235, 24, 24, 94, 10,242,178,200, - 9,253, 35, 60,106,153, 88, 66,185,155, 27,219,167, 3,201,252,130,156, 95,223,127,255, 3, 47,181,236,159,218, 79,164,222,164, -100,208, 73, 65,243,230,220,248,247,159,185,178,194,159, 14,145, 10, 58,242,232,231,207, 95,191,126, 65,138, 69, 72,129, 56, 92, -207, 7, 37,120,194, 4,241,128,152, 83, 63,113, 1, 13,123,123,226, 21, 63,191,119,211, 92, 85,134,108,187,222,254, 82,225, 17, - 87,113, 9,181, 33, 85, 35,174, 83,222,144, 0,211, 31, 70,246,239, 76,216,231,255,239,126,254,163,198,139,167, 64, 32,103,161, -176,137,137, 9, 29, 18,137, 37, 24,140, 22,247,184,234, 0, 60,178, 0, 1, 52,122, 41,252,144, 4,163,183,186,143,130, 81, 48, - 10, 40, 7, 0, 1, 52,122, 35,216,144, 4,163,165,255, 40, 24, 5,163,128,114, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20, -140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, - 64, 52,185, 20,126, 84,239,168,222,193,169, 23,114, 26,196,104, 88,141,234, 29, 81,122,241, 0,128, 0, 98, 65,203, 30,196,232, -193,154,133, 40,209, 59, 10, 72, 5,184, 10,178, 81, 64,106, 40, 17, 25,146,143, 30, 61,122,250,244, 41, 59, 59,187,136,136,136, -156,156, 28,221,188, 0, 63,243,117, 48,231,160, 87,175, 94, 61,125,250, 20,191, 26,105,105,105, 49,108,187, 79, 40,209, 59, 10, - 40, 7, 0, 1,132,190,236,151,224,206,123, 60, 27,172,208,244, 98, 30, 77, 76,211, 51,135,233, 95,184,224, 87, 80, 80, 80,160, -169,169,137, 95,187, 52,234, 25, 56,200, 57, 33, 52, 52,212,197,197, 5,143, 94,170,212, 1,238,238,238, 64,114,231,206,157,116, -208,251,245,235,215,181,107,215, 66, 46,133, 15, 14, 14, 54,196,125,159, 34,166,103, 9, 94, 10, 63, 99,198, 12,172,173, 13,252, -161, 68, 76, 24, 2, 75,168,159, 63,127, 2,173,224,224,224,248,241,227, 7,176, 38, 56,125,250,180,190,190,190,138,138, 10, 46, - 45,214,214,214, 4,253,245,252,249,115,200,181, 39,248, 1,176,244,135, 28,247, 77, 76, 88, 17,179, 23, 36, 44, 44, 12,127,186, -130, 0,121,121,121, 6,240,121,203, 64,191, 67,226, 14, 79,154, 4,166,219,162,162, 34, 60,150,190,127,255,222,220,220, 28,107, - 80, 3,245,106,105,105,225,209,251,242,229,203,218,218,218,209,230, 14, 37, 0,207,165,240, 0, 1,196, 50,108, 60, 73,255, 70, -241,198, 25, 30,184,164, 2, 50,119, 16,212,190,127,255,126,120,246,248,246,237, 27, 23, 23,215,235,215,175, 9,214, 46,123,246, -236, 65,102, 35,103, 72, 32,119,245,234,213,196, 7,194,229,203,151, 33,133, 56,154, 57, 36,129,140,140,140,236,236,108, 98,174, -126,133,220, 4, 25, 23, 23, 7,244,111,111,111,175,130,130,130,160, 32,225,189,208,192,146,119,251,246,237, 16,182,135,135,199, -142, 29, 59,176,178,241,244, 56,225, 9, 3,200, 48, 54, 54,158, 53,107, 22,164,160, 36, 38,193,124,252,248,145, 23, 12,128,165, - 63, 39, 39, 39,176, 50,248,240,225, 3, 63, 63,255,169, 83,167, 24,192, 27, 86,113,105,212,209,209, 1, 22,151,240,130, 27,185, - 21, 15, 44,208,129,228,137, 19, 39,162,162,162,136, 9, 97, 34, 75,127, 8,152, 48, 97, 2,229, 9,155,155,155,251,218,181,107, -172,172,172,191,126,253, 2, 6,242,237,219,183, 43, 43, 43, 9,234,122,137,116,188,160,173,173,237,225,195,135,225,220, 55,111, -222, 16,169, 17, 19, 60,128, 29,162, 55, 10, 40, 47,253, 25, 48, 46,133, 7, 8,192,222, 25,219, 48, 8, 3, 81, 52,146,171,204, - 16, 15,225, 34, 61,131,120, 10,247, 46,211, 51,144,229, 13, 34,121, 28,183,121,242, 33, 11,129, 2, 7,105, 40,242, 43, 64, 50, - 58,225,227,223, 63, 23,247, 47, 90, 0, 74, 41, 74,133,120,157,131,145,199,243, 53,137,154,119, 84, 46, 17,234, 23,121, 53,142, -163, 70,199, 45,124,225, 33,238,148, 18, 44,185,152,116,166, 65, 55,133, 23,111,200,163, 64,251,231,156,187, 41,252,238,151, 71, -251,203,204, 72, 49,133,167, 6,104, 90,129,223, 77,225, 9, 12,210,159,155,194,147, 39,176,243,110,192,236, 14,188,127,107,102, - 9,104,127,154,140,123, 51,133,175,181, 26, 99,120,213, 70, 1, 16,150,239, 26, 95,110, 79,128,133, 68,171,111, 2, 64, 8, 65, - 46,122, 70,173,159,124, 3,194, 31,178,142, 49, 82, 3, 72,140, 97, 24,148,236, 63, 7,236,239,189,159,215, 0,105, 35, 54, 18, -233,244,230, 58,231,104,163, 41, 87, 50,203, 86, 96,173, 37,193,248, 41,200,207, 63,251, 79,172,210,124,225,215,166,240, 31, 1, -216, 59,155, 19, 6, 97, 56,138, 11,210, 13,114,235, 16, 30, 29,160,189,101,129,220, 29, 35,251,184, 71,134,201, 49,217, 64,232, -207,252,105, 16, 81, 19,219, 82, 40,244, 29,130, 40,228,160,201,251,240,144,247, 73, 1, 96,155, 21,239, 84,130,205,134,181, 60, -171, 1, 44,187,223,250, 57,158,217,255, 20,157, 9,133,193,218,114,120,250,242, 52,208,122, 96,255,155,185, 20,229, 46,165,240, -140, 53, 46,126,133, 91, 2, 83, 49, 3, 99,113, 6, 40, 21,215,255, 90, 20,120, 7,155,165,240,197,208,195,215, 65, 0,134, 97, - 32, 7,132, 16, 46,207, 86,120, 46, 80,130, 24,227,113,114,130,253,179, 42,139, 0, 72, 14, 72, 77,100,181,121, 11,222,207,181, -207, 95, 88,216,216,109,231,156,214, 26, 37, 80, 74,113, 13,251, 35, 6,172,210,182,173,233, 55,154,217,223, 90, 43,155,113,149, - 3,246, 48,142,227, 65, 8,240,222, 27, 99,246,158, 78,211,116, 77,224,109, 75, 56,238,186,174,239,123, 49, 28,127,251,191,100, -255,102,171, 20,254, 33, 0,123,215,110,195, 48, 8, 68,163,140,132,216,129, 79,155, 53,178, 6, 27,100,141,136, 58, 29,107, 32, -209,177,131, 27, 40,242,146, 83, 40,130, 13, 1, 81,230, 10,203,182,140,125, 6,241,222,221, 67,226, 86, 18, 64, 45, 92,252,184, - 50,188,138, 3,180,214,163,121, 64,215,195,238,171, 46,215,199,253, 38, 38,126, 16,240,135,121, 85,123, 27, 99, 28,165,132,137, -126, 46, 69,225,129,218,136,149, 48, 3, 39, 8,128,140, 26,130, 3,142,250,138,212,255,211,167, 40,124,217, 59,158,138,194,211, -205,198, 64, 75, 41,203,122,146, 82,170,228, 4, 13,229,167,142, 66,234,162,240, 69, 11,218,181, 16,194,249,189,151, 56, 78,240, - 69,239, 61,109,190, 68, 69,225, 95,181,166,183,205, 90,219,128,242,130,254,200, 54,190,216,104, 72,213,193,195,228,240,104, 42, - 48, 97, 41, 37,198,152,115,142,115,142, 81, 35,145, 13,151, 66,136,156,115,183, 57, 16, 31, 71, 99,204,145, 22,180,220, 16,118, - 32,161, 4,167,162, 91,224, 57,198,136,208, 31,124, 0,183,255,208,223,181,167, 0,162,102, 5, 64,245, 73, 96, 50,234, 0, 96, -115,146,164,126, 0, 36,107, 45, 93,186, 20, 77,124,219,182,109, 64, 65, 34, 13, 57,113, 95,203, 66,241, 26,241, 35, 63,240, 6, - 38,188,169, 8, 76,190,144,194,136,212,210, 31, 94,135,145,212, 60,132, 52,255,209, 46,133, 39,175, 19, 0, 55, 1,207,165,240, -240, 38, 63,176, 76, 1, 54,102, 85, 85, 85,129,141,104,118,118,118,126,126,254,150,150, 22,130,253, 0,228,177,126, 92,243, 1, -100, 84,237,192,130, 24,174, 6,243, 68, 44, 96, 3,159,151,151, 23, 88,234, 29, 59,118, 12,216,248, 5,150, 44,223,145, 46,133, - 7,221, 59, 77,232, 82,120,204, 97, 31,120, 91, 30, 24,221,175, 72,188,125, 19, 24,191,144, 21, 65,100,244, 3, 8,142,252,192, - 1, 48, 34, 74, 75, 75, 33, 57, 14,104,221,237,219,183, 25, 64,199,244, 26, 2,235, 63, 98,214,225, 80, 82,214, 67, 42, 15, 50, - 12, 4,198, 35, 48,118, 44, 45, 45,225, 7,207, 1, 93, 11,236,187,140, 22,238, 12, 72,119, 2, 35, 15, 1, 33,167,118,128, 0, - 26,236,147,192,244,169, 3,128,234, 33,253, 86,120, 71,152,200,210, 31,216,252, 39,219,107,144,230, 63, 90,195,255,197,139, 23, -180, 46,253,225,205,127, 29, 29, 29, 8, 23,200,160,176, 19,128, 31,192, 71,255,185,185,185,107,107,107,129,165, 63, 68,220,192, - 0,116,201, 9,176,220,247,245,245, 61,114,228, 8,144,164,162,165,240, 48,129, 79, 0,160, 1, 96,179, 17,222, 3,192, 92, 55, - 13, 44, 83,128,117,192,143, 31, 63,128,181, 20,176,174,130, 92,183, 9,191, 20, 30,200,192, 95,250, 67, 42,117,204,177, 32,228, -153, 97, 82, 1,217, 26,137,159, 3, 0,214,199,222,222,222,192, 28,196,197,197,229,224,224, 0, 12, 1, 96,148, 1,107,232, 5, - 11, 22, 48, 49,209,118,211, 40,176,172,135, 15, 31, 65, 50, 32,241,213, 9,176, 65,243,232,209,163,240,240,112, 6,240,165,211, -160,171,199, 70, 1, 90, 63, 24,199,189,240, 0, 1,200, 59,131, 28,132, 65, 32,138,238, 61,141,186, 55,158,171, 27,238,194,198, -112,136, 90, 57, 66, 87,156,130, 21, 97,107,244,153, 73, 8,193, 90, 1, 99, 98,226, 95,145,118, 51,105, 50,111,102, 24,202,252, -250,159,192, 29,157, 0, 84,159,188, 39, 88,164,186,181,158,254,162,253,110,123,158, 46,167,105, 35,241,128,106,160,201, 84, 48, - 52,142,163,236,227,227,126,117,137,225, 45,125,156, 14,250, 75,250,255, 60, 20, 30, 27,228, 85,135,222, 14,133, 7, 34,178,192, - 63,231,249, 49,220,220, 24,147, 30,126,117, 40,124, 58,243, 83, 68,205,245,102, 59,233, 63,148,199, 66,239,189,244,234, 81,140, - 49,132, 0, 95,168, 6,168, 0,174,175,199, 13,229,176, 46,250,246,197,185,254,245, 40,146,155, 93,115,108,244, 67,105,173,225, - 62,244,119,206, 89,107,161,191, 82,138,216, 60, 12, 67, 77, 0, 56, 44,169, 41, 6,224,134,173,244,151, 77, 72,161, 63, 98,113, -108,185,187,251, 79, 68, 5,144, 58, 1,185,238, 2,104,144, 78, 2, 83, 82,250, 3,211, 16, 25,221,100,200, 88, 16,176, 43, 64, -124,233, 15, 44,238,129,165, 63,116,148, 99,221,250,181,224, 91,252,128,149, 1,131,147, 35, 3, 3,225,101,160,144, 85,137,144, -177, 32, 96, 19, 21,114, 9, 42,176, 8, 38, 34,249,130,138, 90,248,189,240,164,150,254,144,230, 63,214,198, 62,121,157, 0, 72, -181,145,147,147,131, 51,160,130,131,145, 47,133,143,137,137, 97,192,184, 20, 62, 54, 22,231,189, 17, 20,206, 1, 48,144,117, 41, -188,176,176,240,219,183,111,129,237,253,215,175, 95, 3,123, 0,240, 75,225,129,253, 54, 96,124, 1, 75,127, 96, 53,128, 54,184, -143, 12, 32,165, 60,100, 20, 8,237, 38, 50, 60,186,208, 74,127,200, 38, 0,100, 46, 25, 13,127,226,199,127,128,224,246,237,219, -192,232, 0,122,208,210,210, 18, 72, 2, 3, 13, 88,158,110,218,180,137,153,153,153,152, 10,128,146, 86, 60,178, 9, 36,233, 50, - 6, 3, 32,227,220,185,115, 64, 55,219,216,216, 0,147, 22,176,151,137,188, 96,122,196, 2,200, 42, 32,180, 73, 96,228, 85, 64, - 0, 1,216,187,130, 20,134, 65, 32,248, 1,159, 32,248, 12,207,130, 63,242,149,130, 79,240,228, 55,188,116,154,129,101, 91, 75, -220,228, 80,122,232,158, 36, 36, 16, 54, 58, 51,113, 71,246,119,139,192,223, 68,127,205, 1,151,180,255,199,241,147, 3,108, 19, -151, 3, 8, 46,125,100,172,214,186,125,118,237, 11, 79, 71,208,246,253,165, 41,252,170,161,104,164, 59,241,228,173, 39,191, 72, - 39, 64, 70,160,191,108, 40,173,129,239, 24, 66, 96,255,119, 16, 0,189, 64,250,162,110, 41,254,206,117,175,231, 0,236, 53, 0, - 61, 9,145,147,156, 51, 16, 65,239,152,157,231,202,123,223,123,103,231,181, 57, 39, 25, 72,154,194,179, 38,108, 52,243,228, 35, - 68,191, 91,118,114, 4,238,113,179, 94, 68,183,237,164,198,160,227,179,148, 2,249,159, 82, 2, 31, 56,231,198, 24, 70, 2, 16, - 4,167,144,186, 87, 18,184,170,253,185,142,144,177,214, 26, 6,128,254, 24, 35,242,134, 95,153,127, 29,120, 27, 15, 1,196,130, -153,223,200, 54, 11, 45,117, 34,183, 95,144,155, 69,180, 43,253,129,201,142,194,165,114, 36,105,127,252, 4,231,120, 61, 39, 39, - 23, 65,237, 88, 7,166,137, 4,192, 2, 5, 88,226,239,221,187, 23,126, 47, 60,124, 49, 40, 49,117, 24,214, 75,225, 33, 59,110, - 8,110, 10,195,172,212,115,115,115,241,148,254, 16, 32, 36, 36, 4, 25,226, 7,182,166,145, 27,254, 53, 53, 53,248,147, 28,133, -251, 0,144, 67, 3,109,171, 4,193,250, 30,216, 21,219,182,109,219,159, 63,127, 62,124,128, 92, 10, 15,114, 9,176, 67, 0,228, - 2,217,196, 55,228,129,246, 34, 47,253, 68,158, 30,192, 95,250, 51,144, 59,199, 67,121, 29, 80, 81, 81,113,240,224, 65, 96, 52, -181,183,183, 3, 91, 12,192, 14, 16,100, 75, 4,193, 33, 62, 50, 90,241,200,122, 73, 5,192,154,233,233,211,167,200,251, 0, 46, - 94,188, 8,236,186, 1, 91, 21, 68,174, 91, 29, 9, 0,109, 18, 24, 25, 0, 4, 16, 11,254, 66, 28, 87,223,150,214,128,140,210, -159,206,249,164,165,165, 5,255,254, 70,130,149, 37, 37, 67,186,144, 66, 19,178, 12, 31,200,128,236, 5,131,223, 11,143,167, 92, -131, 92,236, 14, 44,188,144,231, 0, 32,205,219,178,178, 50,252,165, 45, 86,189,164, 14, 25, 17,217,240,167, 86,151, 20, 57, 28, - 48, 47,133,199, 95, 7, 0,131,197,219,219, 27,216,146,101, 99, 99,251,249,243, 39,176, 14, 0,134,176,128,128, 0,176,192,194, -115, 80, 7,114, 62,130, 79,255, 2,237, 5,170,135,231, 29, 92,185, 12,146, 36,208,182, 13,147, 58,247,139, 57,230, 67,210, 40, - 16,164, 14,128,111,254,202,202,202,130, 48,128, 61, 33, 60, 90,158, 61,123,134,188,219,107,197,138, 21, 4, 79,248,193,165,151, - 36,112, 1, 12,208, 4,159,128,193,104,185,207,128,116, 39, 48,114,209,143,188, 10, 8, 32,128, 88,168, 88,190, 99,234,165, 79, -109, 65,255,210, 31, 8, 68,193,128,108,237, 74, 96, 64, 45,199,192,199,127,144,203, 62,172,151,125,146,125,228, 3,133,122,177, -246, 6,136, 4,100,207, 1,160, 37, 9,172, 93, 46,130,201, 6,216,173,188,123,247,238,254,253,251,191,127,255,254,247,239, 95, - 3, 3,131,176,176, 48,130,113,119,226,196, 9,120, 55, 2, 46,130,204,198,149, 42,224,141, 3, 72,205, 1,204, 65, 4, 43, 27, - 56, 8,163,236,254,100,178,115,144,180,180,116, 96, 96, 32,126, 53,205,205,205, 84,215, 59, 10, 72,170, 3, 48, 75,127, 32, 0, - 8, 32, 22,106,149,161,163,167, 53, 13, 56, 64,139, 2,226,143,132, 29, 66,158, 26, 16,163,148,193,128,120,245,192,254, 13,145, -231,252,224,105, 28,144, 81,221, 82,171,134, 38, 21,136,137,137,145, 29,182,148,232, 29, 5,196,215, 1,184,164, 0, 2,104,244, - 82,248, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70,111, 4, 27, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5, -163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140, -130, 17, 10, 0, 2,136,134,151,194,143, 94,192, 61,170,119,136,234,221,236, 55,133,120,189,190,155,114,168,165,119,163, 47, 9, -122,253, 55,163,232,245,177, 1, 93, 47,202,200,200,248,251,247,239,251,247,239,255,250,245,139,133,133,229,201,147, 39,145,252, - 10, 59,207,156,249,174, 39,107, 97, 97,193,204,204, 12, 89, 68,187,229,200, 83,106,133, 21,196, 94, 56,128,236, 80,185,122,245, -170,148,148,212,187,119,239,128, 36, 39, 39, 39, 3,108, 67, 31,154,189, 88,245, 62,190,178, 36,221,246,209,178, 51,106, 44, 98, -110, 60,188,124,184,244,142,166,103,226,245,226, 1, 0, 1, 68,194, 81, 16,248, 55, 37, 82,241, 2,110,147, 51,107,174,191,124, -207,203,204,172,199,205,180,203, 54,129,160,250,255,255,255, 50, 50,226,220,245,247,239,255, 47,134,255, 12, 76, 76,108, 4,205, - 25, 18, 23,112, 15, 54,112,243,230,205,254,254,254,222, 42, 16,123,195, 97,208, 25, 0,120, 20, 63,120,242,248,233,147, 39, 55, -111,220,120,255,254,189,188,188, 60, 15, 47,175,135,171, 27,126,243, 33, 71, 36, 65, 0,174,203,203,128,226,196,199, 20,100, 23, - 52,214, 59,132,241,129,208,119,144,180, 6, 58,136,105,181, 16, 9, 26,141,251, 25,148,226,193,201,107, 1,195,217, 34,146,195, - 55,228, 13,194,222, 53, 34,120, 20, 2, 75,207,175, 95,191,238,218,181, 11,152,140, 67, 89,133, 37,100, 69,127,124,253,206,249, -237,143,117, 73,170,157,111,248,150,185, 51, 54,239,221,235,230,230, 70,135, 36,241,247,239, 95,160, 27,244,245,245,213,212,212, -206,157, 59,247,227,199, 15, 85, 85, 85,204,195,225,177,130, 63,127,254, 92, 60,115, 94, 38,217,176,204, 76,251,196,174,158,181, -151, 29, 84,117,156,136,212, 59, 10,200, 0, 0, 1, 68, 84, 5, 64,204,145, 62, 84,185,128,219,245,242,122,185,151, 15, 24, 88, - 25,152,255,253,249,247,225,203,179, 55,140,127,174, 84,252,116, 12,229,214,192,115,116,215,255, 83,151,107,126,255,102, 17, 22, - 98, 97,102,102,249,249,147,233,198, 45,230,111,223,216, 76, 12,254,253,250,195,120,232, 4, 15, 80, 69,124,112,168, 0, 31,225, - 10,128,164, 11,184,113,213, 28,180,190,178,131, 1,114,140,101, 61, 35, 99, 19,214,186,240, 63, 80, 42,236,122, 40,125,150,132, -195, 74,255,255,224,210,223,238,200,145, 35,120, 42, 0, 61,253, 93, 90, 90, 38,171, 87,243,157, 60, 14,218, 6,117,235,198, 77, - 32,153,146,184,238,227,151,156,207, 31,240,157, 36,225,234,234, 10,172, 6,128,165,252,190,125,251,176,158,148, 71,252,166,127, -204,148,156,145,158, 62,131,184,202, 3,249, 26,122, 18,128, 82, 60,226, 80, 54, 50, 42, 0,152,239,240,156, 60, 10, 1,119,239, -222, 61,176,106, 85,147, 75,152, 65,116, 22,155,184, 32, 3, 11, 19, 3, 3, 19,176,249,195,240,143,245,223,207,255, 94,241,105, -143, 38,117, 28, 59,118,204,202,202,138,214,133, 41, 19, 19,147,129,129,193,129, 3, 7,128,117,128,153,153,217,139, 23, 47, 46, - 94,188,168,167,167, 71,204, 49, 51, 64,207, 58, 59,185,182,247,109, 42, 79,184,108,225,145,105, 97,190,167,100,242, 19, 53,211, - 56,172,122, 33,177,137,191,122, 0,202,146, 92,217, 15, 35,128,118, 33, 48,162,239, 5, 91,253, 15, 16, 64, 44, 68,102, 24,131, - 56,221, 76,235, 28,226,235, 0, 50, 46,224, 54,190,119, 92, 65, 92,138,193,192,140,145,135, 95,127,215,170, 55,255,126, 63,255, -248, 89,139,227,223,133,109, 75, 63,255,103,224,213,196, 94, 7, 0, 99,158,155,139,229,223, 63,214,143, 31,217,216, 88, 88, 56, - 57, 89, 29,173, 24,254, 1, 19, 33, 35,235,171,119, 12,108,172,172, 44,140,191,254,252,254, 77,108,110, 37,177,236,134, 31,217, - 8, 57,136,106,235, 13,214, 31,191,127,167, 39,154, 16,172, 6, 8,214,169,248,246,127,214,131, 50, 3,228, 22, 36,172, 82,196, -128,219,123,249,122, 86, 69, 66,216,197,161,203,213, 92, 62,145, 81,250,247,245,245, 1,115,123,113, 27,244,226, 39, 60, 57,220, -193,225,163,154, 26,176,233,189,217,214,118, 18, 92, 48, 42,138, 1,124,135,219,148,229,171,240,213, 1,144,210, 31,114,176, 87, -120,120, 56,228,212, 35,130, 5, 34,214,182, 63,228,192, 12,184, 59, 51, 50,136, 45,253,201, 4,198,125, 12,176,139,218, 65, 21, -128, 81, 47,195,185, 98, 26, 89, 5,172, 29,167, 7,166, 41, 58,185, 50, 48,255,100,100,101, 98,100, 97, 98,100,102,253,255,159, -241,223,215, 63,255,255,254,253,255,235,111,106,124, 86, 86, 93,254, 93,113,113,146, 54,181,145, 1,128,121, 65, 82, 82, 18, 24, -206, 7, 15, 30,188,113,227, 6,176,254,182,180,180, 60,121,242,164,182,182, 54, 65,189, 71,246, 46, 15, 50,248,118,246, 51,115, - 84,253, 23, 27,195,137, 57, 5,225, 61,229, 31,202,123,150, 42, 25, 70,225, 41,220,225,197, 11, 48,138,209, 68, 40, 57,143,114, - 36, 0,128, 0, 98, 33,166,144, 90,182, 99,169,178,138,114,122, 83, 42, 49,117, 0,121, 23,112, 91,221,220,167, 45, 47,203, 40, - 37,203, 16,152,245,255,235, 87,134,119,111,133, 94, 61,253,125,116,235,215,119, 63,185, 25,254,190, 56,184,233,159,148, 10, 63, - 63, 63,214, 26, 0, 88,250, 63,125,206,114,245,182, 56,232,200, 66, 6,102,126,222,191,134, 90,223, 21,229,153,216, 88,152, 88, - 89,216, 68, 5, 24,127,254,252, 1, 63, 67, 31, 15, 32,245, 2,110, 72,233, 15, 41,250, 65,126, 63,242,251,251, 47,208, 5,191, -206,229,187, 59, 59, 93, 9,154,115,183,227, 46, 43,227,109,104, 52, 48, 62,101, 20,209,128,177, 95,137, 38,226,219, 28, 15,108, -251, 35, 95,102,130, 34,149,190, 26, 44,133,175,249,255,230,178,100,205, 20,255,255, 12,255,219, 11, 54,152, 59,168, 45,155,118, -184,119,117, 20,195,234,255,245, 69,211,164,212,137,109, 74,127,121,152, 46,205,193,240,237,237, 85, 96,227,139, 87, 76, 15, 82, -250, 79,159, 62, 29,171, 98, 94,129, 43,106,106,192, 50,247, 24,176,159,112,242, 36, 3,248,206, 62, 16,128,239,240,143, 12,155, - 50, 99, 78, 53,211, 63, 89,172,218, 33,165, 63,176,237, 15, 44, 83,240,220, 59, 70,176, 41, 3, 41,253,145,234,131,244, 25, 51, -176, 39, 75,166,176,247, 12,176, 20,195, 8,198,255, 66, 81,101, 25, 33,163, 50, 32,202, 27,181,207,195, 20,254, 30, 50, 96, 3, - 26,126,252,151, 80, 80, 80, 0, 17, 7, 50,128, 53, 1,147,106, 50,212, 96,176, 26, 52,189, 44,225,232,246, 34,223,195, 8,146, -197,109,239,143, 31, 63, 36,228, 21, 24,254,253, 98, 98,103, 96,100, 97,254,243,249,227,143,123,247, 95, 63,121, 42, 99,229,192, -200, 38,192,248,251, 23, 3, 51, 83,103,102,137,235,172,134,162,162, 34,178,203, 11, 92, 71,140,192, 75,100, 96,122,248,254,253, -187,144,144, 16,176,125, 0, 12,237,251,247,239, 47, 88,176, 64, 83, 83,243,195,135, 15, 4, 59, 88, 64,189,242, 76, 39, 37,229, - 60, 62, 28,188,252,241, 61,251,226, 45,127,182,157, 88,146, 23,202,201,242, 13, 24,107, 81,216,251,187,163, 0, 47,192,140, 44, -180, 62, 1, 64, 0,177,224, 47,250,129, 65,236, 88,101, 63,235,224,204, 52,134,244, 11,139, 46, 51, 88, 19,182, 18, 82,238,127, -251,182, 20, 24,167, 63,126,204, 19, 18,218, 67,204, 5,220,234,111,174, 51,104,104, 50,120, 37, 48,124,126,195,248,246, 29,131, -184, 36,195,167,119,188,204,255,249, 56, 24, 36,126, 50,188,250,242,225,251,190,245,252,129, 9,216,135, 62,191,177, 92,191, 45, - 4,236, 60,114,179,126,103,102, 98, 6,182,125, 94,190,228, 86, 87,249, 39, 35,201, 24, 23,250,247,255, 63,166, 15,239, 88,136, -169, 0, 72,189,128, 27,185,244,103, 96, 97,190,247, 28,148,123, 31,189,252, 33, 39,206,161,154,176,185,179,211, 23,191, 33,192, -210, 31, 88,238, 51, 51,190,249,251, 95,132, 93,140,145, 59,226,217,191,127,239,126,252, 88,253,247, 76, 25, 37, 61, 21,130,181, - 87,245, 20, 63, 75,161,154, 41, 27,146,121,152,228,128,220,172, 92,117,125, 51,165,165, 83, 15, 54,246,101,207,156, 73,108,103, - 25, 88, 4,165, 23, 94,129,132,191,141,141, 13,176, 2,192, 85,250,131,106, 68,135,183, 12, 12,151, 24, 24,174,124,120,201,163, - 42,199, 48,123,246,151,253,251, 25, 84, 85,129, 78, 5,149,114, 64, 65, 80, 23, 83,247,250,165,139,178, 88, 75,127, 96,219,246, - 31, 24, 48,128,239,147, 33,181,192,130,179,145, 75,127, 6,208, 52, 0,206,216, 1,118, 11, 32,101, 56,214, 90,246, 31,172,220, - 1, 54,118,128,225,176,249, 16,202,132,219,244, 25, 51, 33,253, 11, 5, 5, 5, 96,246,153, 56,113, 34, 68, 28,200, 0, 86, 0, - 59,119,238,132,159, 91,201,128,161, 23,210, 29, 1,234, 74, 77, 77,197, 50, 62, 14,235,244,204,154, 61, 27,104,239,150,195, 79, -209, 74, 67, 22, 94, 94, 6, 86,230,191,223, 62, 92,223,182,119,233,170, 53,211,158,129, 44, 58,213,200,167,106,231,245,243,209, -227,171, 23,207, 94,190,127,235,227,139, 23, 87,174, 0, 35, 78,130,140,210, 4,243,216, 53,204, 18,252,217,179,103,181,181,181, - 61, 61, 61,191,126,253, 2,102, 73, 94, 94,222,175, 95,191,158, 58,117, 10,127,178,132,232,253,240,228,104,227,252, 71,115, 11, -164,222,125, 5,246,230,153,100, 4, 57, 94,188,249,149,222,245, 71,223,196, 88, 14,119,175, 14, 82, 13,192, 35, 26,147, 49, 10, -208, 74,127,228, 90, 1, 32,128,152,112,229, 25,200,185,231,136,222,186, 71, 52, 49, 22, 64,110,128,249,246,109, 25,164,244,231, - 56,253,224,219, 78, 21, 6, 66, 55,195,200, 28, 92,193,250,251, 59, 35, 43, 35,195,243, 7, 12,191,255, 48, 60,190,246,255,229, -115,198, 55,207,121,254,252, 99,101,248,207,244,159,231,205,183, 63, 29,187, 79,224,210, 46, 45,193,226,226,192,160,173,246,139, -133,153, 21,216,228, 23,225, 97, 55,212,103, 98,101,101, 99,103, 99,255,255,143,253,225, 19,118,208, 21,126,255,136,106, 44, 64, - 46,224,134, 4, 2,254,211, 58,129,178,200,151,138, 68, 78,120,178,247,236,123, 96,233, 15,169, 3,110, 63,249,206,224,178, 10, -191, 9,192,210, 31, 84, 13,124,190,204,205,125,135,157,227, 51,176,244,255,253,251, 44, 51,179,210,175,175,111,105,151, 2,238, -158,255, 2,140, 26,120,233,255,252,230,127, 35, 95,230,220, 22, 87, 27, 87, 96,247,252, 63, 88,150, 48, 88,182,108, 89,113, 27, - 35,143,168, 46, 48, 76, 61, 2, 51,143, 28, 57,130, 71,241, 63,166,199, 98, 98,208,210,255,243, 91,208, 41,217,250,250,160,210, - 63, 46, 14, 90,250,127,126,203, 9, 68, 66, 92,207,177,106, 15, 9, 9,113,116,116,116,114,114, 10, 15, 15,103, 70, 5,112, 17, -252,174, 69, 75,201,196,214,112, 72,101, 19, 4, 96,114, 25, 25,176,180, 43,224, 26,221,220,220,208,218,218,192, 78, 0,228,216, - 62,196,240, 37, 42,216, 48,115, 38,176,116,134, 24, 14,247, 38,124,112, 28,206,197,106, 47,219,255,255, 76, 92,236,191, 95, 60, -156, 89, 83,179,224,235,135,247,246, 22, 16,241,185, 75, 22, 52,148,164,168, 21, 69, 54, 93,222,183,234,253,125, 87, 63, 63, 34, - 59,184,192,226, 30,152, 11,206,159, 63,143, 84,101,206,192, 58,202, 7, 9,144,203,151, 47, 31, 60,120, 48, 50, 50, 18,216, 75, -251,242,229, 11,228, 0,109, 96,191,132,135,135, 39, 44, 44,204,218,218, 26, 87,209, 15,210,123,124,237,173,157, 69, 69,149,189, -155,235,165,174, 63,101,249,248,133,249, 31, 35,195,219, 47,191,254, 11, 43, 23, 86,181,250, 4,196,224,172,170,129,213, 56, 56, -195,206, 4, 3,172,140, 81,128,171,244, 7, 2,128, 0, 98,193, 90,244,147,209, 49, 68, 19, 1,150,254,104,221, 2, 60, 23,112, -243,127,120,252,159,241, 3,227,249, 99,255, 63,125,102, 20, 19,103, 96,227, 97, 60,179,151, 65, 84,140,129,153,229,207,175,255, -191,254,254,123,247,143,225, 63, 35, 46, 87,253,127,243,142,229,248, 25,118, 41,113,150, 80,255,223,172,172,192, 54, 16, 35, 51, - 51, 11, 51,248, 14, 11, 14, 54, 70, 49, 81,134,143,111,255,146,116,207, 1, 49, 23,112,163, 52,255, 25, 24,150,231, 72,194,217, - 38, 21,247, 88,255,191,249,205, 40, 66,240, 10,111,142, 47,251,133,154,150,188, 46,206,120,243,142, 83,234,247,213,191,127, 65, - 21,198,195, 11, 18,180, 75, 4, 93, 51,138, 83,220,102,194, 75,127,136,160,133, 96,141,149,118,136,165,208, 85,160, 44,193, 60, -179,116,233,210, 67,135, 14,189,125,235, 44, 44,188,151, 71, 68, 7,152, 90,152,152,152,240,204,179, 61,122, 4,172, 44,175, 64, -198,141,128, 30,126,247,149,193,204, 12, 60, 9,113,155, 97,234, 84,134,207,159, 24,190,126, 97,248,242,149,129, 91, 16,223, 36, - 4,230,136,255,221,187,119,129,100, 91, 91, 27,144, 84, 83, 83, 35,111, 52, 3, 30,221,120,148,229,231,231,195, 91,241,200, 69, - 57,126,195, 21, 21, 21,225,163,255,112, 0,233, 4, 0,165, 16,157, 0, 84,144, 44,173,118,235,234,181,167,130,130,192, 32,205, -203,203,155, 52,105, 18,241,246,218,254, 20,248,255,239, 75, 74, 91,181,110, 72,200,204,182, 54,248,253, 45, 51,111, 67, 2, 31, -116, 76,255,238,221,187,129, 86,131, 51,248, 55,130,165, 63,164, 75, 7, 12, 28, 96, 43,219,192,192, 0, 88, 19, 0, 53,102,102, -102, 62,254,140,165,138,125,242,228,137,191,191, 63,208,107,219,182,109,131, 92,153,201, 0, 94,210,195, 0,190, 71, 8,207, 60, - 45, 80,252,222,205, 11, 13,101, 73,194,170,171,207,175,142,191,244,152,241,209, 75, 22, 96,171,239,231,175,223,239,254, 11,103, - 39,103,145,183, 4,136,146,123, 77, 70, 20, 0, 8, 32, 44, 67, 64,192,106, 28,153,251,225,233,123, 98, 74, 76,120, 15, 0, 60, - 4, 4,138, 48, 96,243,159,253,202,211,191, 2,160, 70, 31,254, 11,184, 47, 60,120,245,147,251,175,250,247,243,210,143,110, 49, -168,232, 49, 48,253, 97,224, 19,250,121,241,230,215,207, 76, 95,255,254,255,244,239, 15, 63, 3, 59,195,255, 63, 56, 18,208,191, - 47, 95,152,217,152,255,124,250,200,116,234, 18,171,131, 57,203,191,127, 44,143, 31,179,158,187,194,201,195,206, 40, 33,202,100, - 99,249,251,202, 59, 96, 33, 69, 90,130, 32,166,149, 84,190, 26, 20, 50,157,161,130,144, 66, 31, 58,176,243,255, 13, 43,176,117, -255,255,253,162, 20,193, 72,188,119,210,177,190, 60,253,151, 1, 52,250,209,195,194, 31,249,242,225,153, 46, 25,110, 9,205,143, - 79,159,190,120,240,140,166, 81,174,111,166,244, 21, 28,165,223, 56,175,113,125,215, 90,215, 8,157, 33,183,118,209, 62,190,138, -112,219, 63,208,238,208,134, 13, 46, 2,199,247,244, 87, 51, 20,182,254,183,179,179,195,191,244, 83, 65, 70, 22,121,210,113,203, - 22,208,220,239,178,101,192, 78,192,255, 9, 19, 24,155,154,190,128, 42, 6, 6, 6, 85,117,193,226, 66,124, 86, 67, 26,191,192, - 14,193,202,149, 43,225,237, 98, 15, 15, 15,204, 82,146,248,106,158,160, 26, 96,137, 9, 44,178, 49, 43,128,190,190, 62,228,245, -169,152,192,197,197, 5,126, 21, 59, 50, 0, 10,246,247,247,227,234, 16, 31,186,246,168,170,169, 36,185,190,172,242,215, 47,160, -165,152, 94, 3,218,187,103,207, 30,172,101,162,157,150,220,188,185, 83,141,163,162, 26, 27, 27,177,214, 19, 64, 65,160,246,217, -179,103, 19, 19, 56,192,210, 31, 50,197, 10,172, 38,103,192, 0, 80, 4, 88, 19, 60,198,182,198,252,247,239,223, 91,182,108,113, -118,118,190,125,251,246,215,175, 95,129, 92, 96, 13,244,235,215, 47,200,181, 57,248, 75,240,159, 63,127,158, 93, 27,101, 23,212, -180,243,224,221,251,207,153, 63,125,101, 98,102, 97,120,250,149, 51,175,162,154,160, 94,200,212, 14,254,177,160, 81,128,171,249, - 15, 4, 0, 1,196,132,150, 37,128,192, 1, 12, 46,194,192,189,211, 15, 63,126,255, 40,108, 70,212,218,103, 72, 41,207,197, 21, - 13, 44,253, 89, 31,190,253,207,200,200,150,252,150,129,208, 5,220, 44, 60,108,127,254, 51, 60,248,241,235,217,235, 55,127,175, - 28,100,184,120,234,231,165,243,191, 63,188,125,243,253,223,251,175,156,183,127,254,127,203,192,252,227, 47,214,210,255, 47,176, - 63, 44, 45,197, 44, 47,247,159,133,153, 5,152,230,128, 45,255,175,223, 88,111,222,226,228,231,100, 17, 21, 98, 55, 53,100,226, -224, 96, 7, 15, 89, 19,104, 68,144,113, 1,247,163,151, 63,246,158,125, 15, 47,250, 33,165, 63,251,191,135, 64,212,224,206,242, - 8,216,244,197, 11,214,222,255, 39,218, 11,109, 56,223,255,250,247,201,221,167, 55,143, 94,125,241,224, 3,173,147,194,178,105, -160, 10,254,211,171,255,192,210,223, 33,153, 37,168,158, 21,130,122, 87, 69, 49, 50, 48,226,207,108,254, 54, 7,227,139, 92, 4, - 79,236, 5,230,186,141, 71, 29, 24,192,199,229, 19,180, 81, 77, 67, 29,169, 10, 97,152, 50,133,225,206, 29, 80, 63,160,177,241, - 63, 28, 8, 10, 10,226, 28, 68, 2,143,221,255, 5, 3, 96,147, 31,216,246,191, 5, 6,192,162,176,164,164,132, 96, 56, 83, 2, - 32, 77,117,180,242, 20,216, 39, 0,122, 31, 87, 43, 30,222, 2, 69,107,254, 67, 0, 86, 65, 56, 56,204,254,129,145,137,103, 78, - 85, 43,207,150, 61,192, 44, 3, 63, 83, 58, 93, 85, 39,223,216,138,139,139, 11, 88,221,214,214,214, 2, 61,142,121,139,214,220, -167,183,158,107,107, 73, 75, 75, 3,131, 11,179,198,130,244, 63,136,239, 27,193, 23,216, 0,155,252, 12,176,205, 19, 88, 47,146, -131,120, 86, 86, 86, 22, 24, 17,192, 78,134,138,138, 10, 11, 11, 11,164,134,182,176,176, 32,166,169,174,172, 97, 56,107,151,192, -165,109,245,182,150,154,220, 28, 76,220, 92,127, 57,217,127,122,250, 19,117,183, 1,176,188,130,184, 19,207, 88,208, 40,192, 3, - 0, 2,136, 9,107,152, 2, 65, 62, 24, 0,185,205, 25,205,191, 95,253,225,228,228, 32, 50, 52, 33,117, 62,151,251,157,255,204, - 76,181,235,190, 49, 16,113, 1,183,178,169,227, 55, 14,161, 23,255,217, 78,255,100, 60,249,254,247,229, 23,255,111,190,100,188, -249,145,243,213, 55,174, 7,127,190,124,251,245,239,212,199,111, 88,111,224, 99,100,100,102,100, 96, 18,224,101,178, 52,102, 14, -245,255,235,104, 14, 76,123, 44, 34, 66, 44,142, 54,140, 78,246,204, 86,230, 92,194, 34, 2,236,108,236,192,226,159,137,233, 63, -254,210,159,212, 11,184,129,138, 65, 3,253, 12, 12,103, 58, 64,125,133,157,165,160, 21, 74,192,134, 63,243,255,175, 63,153,228, -129,236,119,239,222, 17,115,131, 43, 48,112,128,249,121,217,151,175,223,127, 49,197,175,152,243,138,131, 19,200,160, 93,124,151, -132, 45, 63,254,174,117,217, 98,104, 83, 31,216,252,183, 16,172,129,176, 91,179,183,204,192, 61, 9, 12, 44, 20,250,107, 24, 18, -138,156, 5, 78,236,113,236,178,103,242,102, 56,112,224, 0,145, 73, 66, 94, 94, 30,206,118,114, 98, 16, 16, 0,118,176, 24,204, -245,121, 57,216,152,153, 97, 61, 51, 19, 83, 83,156,105,148,137, 9, 50,226, 15, 44,250,213,144, 64, 19, 24, 60,123,246,140, 96, - 17,131, 60,136, 15, 7, 25, 25, 68,181, 16,129, 45,125,180, 27,181,128,133, 56,254,230, 63,242,220, 3,188, 1, 11, 97,163, 77, - 68,163,129, 95,140,140,255,190,253,100,149,144, 79,111,105, 73,224, 22, 16, 56,112, 28, 58, 52, 20,147,208,208, 51,231,118,223, -242, 58, 93,167, 48, 65,197,221,155, 54, 97, 54, 80, 2, 50,210,181,117,116, 32, 19,212,127, 97, 0, 62,128,134,204,197, 58,224, - 3, 44,220, 33,115,188,144, 65,127,120, 89, 15,108,242, 67, 26,215,192,154, 0,200,198,229, 83, 86, 86,214,128,128,128,143, 31, - 63, 2,107, 38, 78, 78, 78, 81, 81, 81, 1, 1, 1,252,183, 72,194,245,178,179,179, 7,103, 76, 90,112,218,228,193,227, 79,226, -252,204,150,234,140,122,138,255,185,249,248, 70, 75,103, 90, 55,255,129, 0, 32,128, 88,240,119,144,225,141, 98, 25,123, 41, 34, -219, 14,240, 11,184,217,146, 87, 51, 16,119, 1,247, 61, 61, 23,150, 59, 55,126,124,249,244,233,231,239,215, 63,216, 95,254,248, -174,197,194,246,244,255,215,247,255,127,127,254,253,127,239,199,255, 15,126,254, 11,198, 57, 38, 3,108,182, 50,190,126,207,120, -250, 52, 59, 59, 43, 27, 43, 27,155,172, 36,155,163, 45, 19, 27, 27, 11,176,163,252,240, 17,227,229,171,156, 98, 34,204,127,255, -254,199, 95,250, 51,144,120, 1, 55,104,140,168, 51,140,213,121, 26,144,249,246, 45,116,218,150,237,223,243, 95, 76,146,217,186, -183,158, 63, 7, 21, 19,248,203,199,140,117,179,224, 85,227,106,216,125,181, 43, 46, 31,163,233, 30, 46, 85,231, 79, 12,171,254, - 31,221,115, 21,200,182,210, 6,237,170, 45, 43,168, 63,118, 85,187,103, 85, 84,213, 84,111,252, 14, 6,182,253,133,132, 32,163, - 90, 7,192, 53,156,203,255,255,171,193, 5,235,255,213,171,241, 93,144, 27, 18, 20,188,123,231, 46, 6,240,194,127, 71, 71,198, - 55,143,249,191,190,231,248,254,137,109,197, 66,198,252,252,255, 15, 95,125, 54,183,180,208,211,214,193, 63, 7, 0, 25,244, 7, -166, 43, 6,240, 37,130, 16,241, 87, 96, 64,204, 56, 15, 48,102,129, 21, 9,114,249, 11,108, 50, 18,179, 11, 12, 50,104, 14,159, - 9,128,244, 6,240, 55,255, 25,144, 86, 61, 32,175,231,193,191, 20, 2, 82, 87,253,249,252,153, 85, 68,136,153,139, 71, 59, 56, -164,201,205,181, 10,178,148,211,208,232,239,247, 31,172,194,226,186, 22, 14, 10, 50,138,147,174, 31,215,209,209,121,126, 26,229, - 70,210, 12, 80,210, 5, 85,114, 89,192,178, 27,188, 90,244, 15, 82,137, 15,108,148, 3, 69,224, 11, 76,189, 81,203, 2, 96,201, - 14,244, 35,100,156, 7, 24, 98,144,161, 30,100, 89, 60,165, 63,196,217,192,226, 30,216,222,191,113,227,198,185,115,231,128,145, -197,205,205,253,237,219, 55, 34, 7,235,197,197,197,253,253,253, 79, 28, 57, 53, 97,245,110, 62, 70, 54,117,241,159,119,222,112, -219,168,255,134,215, 16,184, 6,244,129,226,240, 12, 59, 58, 4, 68, 30, 0, 8, 32, 22, 98,198, 73,129, 65,249,228,224, 51,134, - 40,162, 74,127,120,137,134,102, 14,254, 58, 64, 86, 76,248,220,215,223,175,153,126, 63,250,241,147,243, 23,203,134,159,159,126, -252,253,247,224, 7,195,233,111,223,129,241,234,225,225,129,107, 80, 30,146, 62,132,248, 24,117,117,254,220,186,205,206,196,200, -248,251, 15,211,167,207, 76, 98, 34,140, 31, 63, 51,222,188,197,202,206, 10, 76,253, 44,255,254, 49,225, 47,253, 25, 72,191,128, - 27,188,102, 52, 11,216, 7, 0, 54,246,129,253,223, 78, 87,134,242,221,118, 5, 58,199, 32,141, 68,130,205,127,228,142, 17, 50, - 27, 82,198,225,111, 52, 49,212, 51,154,204,186,135, 57, 87, 1,221, 9,188, 7,223,229, 80,109,217, 91,170,167,250, 30, 95,245, -223, 82,232,170,181,139,246,145,221, 87, 79,188,111, 1,214,162,173,217,155,129, 69, 43, 30,123,129,165, 63, 48,168, 3, 3, 3, -103,207,254, 4,201,146,140,176,245, 40,161,161,136,232,222,124,216, 18, 83,111,118, 94,238,212, 73,147,129,205,255, 95, 47,100, - 31,127, 96,255, 7,234, 59, 49, 72,126, 21, 47, 77,251,188,251,132,186,150, 37,190, 58, 15, 82,244, 67,110,121,125,241,226, 5, -164, 79,240,242,229, 75, 6, 82,230,250, 32,147,153,104,163,231, 51, 64,130,233,120,214,131,194, 99, 4, 62, 19, 0,236, 13, 16, -211,252, 71, 46,164,136, 87, 12,108, 50,191,120,248, 64, 81, 89,245,223,159,159,140,127,254,178,240,242,241, 26,153,240, 24,154, -254,251,250,231,239,183,159,255,255,252,101,248,251,175,124,122, 79,120, 84, 56,102,227,250,207, 10, 65, 60, 38,163,201,250,111, - 70, 87, 0, 44,226, 33, 35,254, 12, 72,247, 0, 35,215, 1,248, 61,168,174,174, 62,121,242,228,215,175, 95,187,186,186,158, 57, -115, 6, 88,250, 3,181, 16,188, 51, 21,162,215,194,220, 60, 35, 57,227,254,147,251,177,201, 25, 39,119, 47,124,254,249,157,137, -189,171,184,140, 26,122,194,198,150, 17,224, 5, 20,230,254,175,209,141, 96,196, 0,128, 0, 98, 33, 50,243, 16,217,246, 71, 46, -209, 72,186,128,251,190, 77,164,160, 13,195,221, 89, 61,239, 56, 25,223,254,255,254,243, 31,179, 56, 11, 7, 19,199,191,255, 95, -191,225,191, 19, 21,216,166,187,115,143, 81, 76,132, 65,128,159, 81, 71,235, 15, 59, 43, 51, 27,235,159, 95,127,216, 95,191, 99, -120,246,244,173, 32, 47,203,237,251, 44,252,252, 2, 63,126,252,192, 95,250, 51,144,126,138, 3,100,223,128,137, 9,104,223,175, -144,144,208,243,231,207, 11,116,158,195, 75,127,130, 70, 97,189,162,150, 40, 0,222,238,139,188,219, 14, 77, 10, 63, 16,214,123, - 58, 99,230,140, 91,123,248,122, 87, 71, 30, 95, 5,234, 64,149,132, 45, 7,245, 12,240,150,254,144,136, 3, 23,244,159,192,121, -143, 1,173,100, 91,208,187, 23, 72,114,203, 1,243, 33,150, 73, 66, 96, 3, 31,104,130,136,216,174,191,159,207, 48, 50, 51,124, -251,193,201,248,249, 15, 11, 19,139,184,178,166,155,156, 23,203,127,156,206, 6, 22, 40, 42, 42, 42,148,167, 79,200, 48, 49,176, - 14,128, 47,143,129,247, 3,136,159, 9,128, 20, 67, 4,155,255,100, 3, 39, 39,167,236, 85,179,154, 62,127, 48,176,183, 97, 18, - 23, 4, 89,247,251, 63,232, 56, 7, 6, 86, 70,102, 22, 70, 54,230,217, 51,250,248,156, 77,148,149,149,169,190, 7, 10, 50,212, - 51,125,250,116, 32,169,175,175, 79,146, 94, 96, 13,189,119,239, 94,102,102,102, 91, 91, 91, 96,240,162, 13,253, 3, 59, 4,192, -130, 30, 45,216,225, 0,216, 99, 88,180, 96, 33, 27, 51,123, 72,100, 8, 80,141,141, 87, 10, 74,189,245,231, 15, 68,239,232,170, - 30, 90,140,255, 0, 1, 64, 0,177, 80,203, 26,170, 92,192,109,146, 86, 2, 44,148,127,237, 92,199,244,237,231,219,191,255, 21, -205,108,236,229,228,240,151,164,192,100,167,167, 30, 7,222,235,203,196,242,255, 39,184, 97,192,240, 26, 54, 42,192,202,193,160, -165,137,179, 33, 6, 41,193,201,187,128, 27,110, 2,100,205, 40,188,189, 15,100, 16, 83, 30, 65,236, 37, 47,168,195,174,135,130, - 3, 19,139, 59,195, 8,245, 30,224, 64,205,229,211, 76, 23,184, 59,137, 61, 7, 2, 92,202, 51,198, 23, 65,207,231,130, 4, 42, - 80, 16, 88,238,115,203,133, 18,212,254,242,185,219, 75, 6,183,127, 76,143,249,249, 62, 50, 8, 49,128,142,127,248,197,192, 66, - 98,210,162, 4, 64,234, 0, 50, 52,194,103, 2, 72,106,254,227,105,189, 98, 5,192,146, 93, 34, 47,111,194,174, 93,247,154, 55, -132,178, 10, 11,128, 15,116,251,254,237, 79,126, 73, 37, 51,151,208,182,133, 51, 47,138, 48,186,145,114,152,207,223,191,127, 24, - 24,136, 45, 58, 9, 14,245,224,242,221,173, 91,183,128,164,134,134,198,219,183,111,129,189,109, 96,169, 45, 44, 44,204, 0, 59, -159,142,141,141, 13,210,105,195,170,247,212,169, 83,255,254, 48, 90, 89,235, 3,123,120, 64,149,191,126,253,146,145,145,129, 72, -125,252,248, 17,216,209, 1, 26,194,206,206,142,167,221, 9,201,218,200,140,209, 33, 32,226, 1, 64, 0,177,208,200, 92,178, 51, - 45,232, 62,236,204, 18,146,180,112,112,112, 2, 17,249,214,145,117, 1, 55,102, 53, 64,134,189,228, 89,135,199,181,180, 62, 3, - 14,220,192,103, 0, 31,198,131, 44, 24, 74,146, 33, 76,255,100, 63,127,144, 29,168, 20, 79,222,209, 96,192, 86, 63,193, 17,124, -172,128, 36, 93,192, 82,143,139,139, 43, 48, 48, 16,114,164,243, 35,216,145,206, 71,247,238,134, 28,233,236,108,225,140, 75,239, -236,247,237,169,130,149, 40, 66,120, 79, 15,197, 85, 7,144,225, 71, 83, 83, 83,200,146,127, 96,119, 28, 88,130, 3, 25,175, 95, -191, 6,146, 60, 60,160, 85,206, 16, 17, 86, 86, 86,172,254,245,241,241,129, 40, 0,234,133,116,211, 33,203,186, 32,171,194, 32, - 34,192,138, 1,107, 3,110,116,145, 15, 49, 0,255,173,239, 0, 1, 52,122, 41,252, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64, -163, 55,130,141,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52, 90, 1,140,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52, 90, 1,140, -130, 81, 48, 10, 70,193, 8, 5, 0, 1,196, 50, 26, 4, 67, 5, 24,226,184,220, 7, 15, 56, 63, 58,193, 51, 10, 70,193, 40,192, - 13, 0, 2,136,134,151,194,211, 65, 47, 27,219, 46, 78,246, 23,172,108, 31,254,253, 3, 45, 73, 4,157,255,201, 8, 62, 5, 20, -180,110,152,233, 63, 35, 11,136, 98,248,179,121, 43,235,255,255,255,245,244, 18, 6,131,155, 41,209, 43, 67,202,178,135, 39,168, -203,224, 70, 47,209, 30,213, 59,170,119,100,234,197, 3, 0, 2,104,104,247, 0, 14, 29,185, 99,102,242, 91, 80,128,225,221,123, -198,243, 23, 57, 88,152, 88,188,220,255,238,222, 47, 10, 44,246, 25,153,152, 56,120, 25,156,204, 62, 48, 48,176,216, 88,254, 63, -117,134,128, 79,247, 31, 3, 29,106,207,250,255,183,185,173,211,199,151,143, 46,223,126,248,247,219, 15,250,220,172, 59,210,192, -245,155,231,126,253,248,198,203, 43, 69,210, 66, 88,172,203,186,137, 92, 8, 72,137, 94, 8, 80, 84, 84,132, 28,229, 15, 57, 81, -153, 36,255, 34,159,132, 72,222, 90,210, 81, 48, 10,104, 4, 0, 2, 8,189, 88, 92,184,104, 46,126, 13,241,113,201,184,164, 40, +137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 0, 0, 0, 1, 0, 8, + 2, 0, 0, 0, 74,242, 89, 48, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, + 4,103, 65, 77, 65, 0, 0,192,153,201, 12,156,227, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,110, 39, 0, 0,115,175, 0, 0,246, +112, 0, 0,129,232, 0, 0,107,215, 0, 0,226,170, 0, 0, 48,131, 0, 0, 21, 42,251,118,133,113, 0, 0,191, 47, 73, 68, 65, + 84,120,218, 98,244,137,169,101, 24, 5,163, 96, 20,140,130, 81, 48,242, 0, 64, 0, 49,141, 6,193, 40, 24, 5,163, 96, 20,140, + 76, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64, +163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64, 44,112,150,175, +173, 12,241,218, 54, 31,126,130,204, 29,213, 59, 8,245,162,105,167,186,189, 7, 14, 28,112,112,112, 24, 13,231, 81,189,163,122, + 7,185, 94, 60, 0, 32,128, 88,134, 71, 61,150,158,158, 14,103,207,156, 57,115, 64,108,159, 49, 99, 6, 35, 35,227,176,111, 50, +192,131, 58, 50, 50,114,205,154, 53, 16,118, 72, 72,200,104, 99,106,248, 69, 52,253,179,210, 40,160, 51, 0, 8, 32, 22, 90,164, +128,219,183,111,247,244,244, 64,216, 37, 37, 37,170,170,170,116,240,201,255,255,255,129, 36,253,139, 96, 96, 40, 61,120,240, 0, +200, 80, 80, 80, 24,144,234, 7,107, 45,136,213, 37,192, 54, 59,126, 19,150, 47, 95,142,223,253, 64, 43, 86,173, 90, 5, 97,175, + 95,191,222,213,213, 21,194, 6,214, 4,180,171, 3,140,141,141,129,228,217,179,103,201,144, 29,153,224,222,189,123,157,157,157, +112,110,121,121,185,146,146,210, 32,175, 54, 6,208,205, 35, 25, 0, 4, 16, 11,158, 66, 28, 66,146, 90,124, 67,138,161,198, 85, + 45, 60,178,252, 95, 30,127,172, 15,171, 25,216, 98,145,214, 0,232, 53, 96,209,255, 0, 12,118,236,216, 65,255,118, 19, 36,192, +103,130, 1,144,221,213,213, 5,228,150,149,149, 97, 85, 28, 24, 24, 8, 97,252,249,243,247,215,239,159,191,126,254,130,128, 63, +127,254,224,210,130,181,244, 71, 3,192,154,128,166,117, 0,158,218, 11, 82, 1,140, 2, 92,237, 0, 32,128, 20,172,116, 72,150, + 16,171,201,200, 2, 3,232,230, 17, 14, 0, 2, 8,103, 5, 0,108,194,175,170,173, 10,107,110, 35, 41, 14,128, 17, 9, 41,250, +129,236, 55,223,222, 50, 8, 51, 84,238,109,248,116,239,125,122, 42,253,138, 69,204,196, 68,107,171,225,117,128,135,135, 7,144, + 4,178,233,233,217,253,251,247, 3, 25,142,142,142,104,117, 0, 30, 0, 44,238,127,253,250,253,235, 23, 74,233,127,230,204, 25, + 19, 19, 19,130, 54,134,133,133, 65, 24,145,145,145,187,119,239,134, 87, 0,100, 68, 16,145,161, 4,108,221, 3, 75,127, 55, 55, + 55,100,193, 93,187,118, 1,251, 43, 16, 54,214,169,136, 17, 94,250, 35,135, 45, 25,229, 50,217, 90,200,232, 7, 80,203,205,163, +128, 12, 0, 16, 64, 44,184,154,255,106,106,106,170, 60,124, 36,117, 2,224,165, 63,176,232,111,119,110,128, 8, 38,110,204, 98, + 16, 99, 8,236, 10, 35, 24,151,152, 5, 55,121,101,247,227,199,143,129,164,172,172, 44,156, 1, 49,153,186,135, 94,160,121, 7, + 94, 7,252,254,253,103,198,140, 25,148, 55,130,136,209,142, 86,250,195, 53, 98, 13, 73,148,210,255, 55,176,244,255,249, 19, 92, + 9,192, 75,255,255,255,254, 19, 83,250, 3, 85, 66,216,189,189,189,240, 38, 63,124, 50,128,120, 55,163, 57,155,120, 0, 47,250, +129, 53,144,161,161,225,104, 30, 70, 30, 69,193,154,120,224, 73, 2,168,128,224,184, 10,188, 67, 9, 73,195,112, 46, 49,205, 32, +204,162,156, 96, 70, 64,115, 51,176, 73,193,200,200,232,226,226, 66,146,155, 33, 32, 57, 57,121,238,220,185,163,201,128, 36, 0, + 16, 64, 76,184,154,255, 45,225, 33, 63, 94,191, 46,209,214,128,143,230,227, 7,144, 33, 35,120,233, 95, 82, 82, 2,140, 66, 32, + 57,223,127, 26, 80, 92, 64, 93, 4,174, 6, 15, 40,155,122, 11,136,178,123,174,199, 55, 95, 9,170,188, 64,170,103,158, 60,121, +130,167, 74,160,110,233, 15, 44,235, 49,139,108, 96, 29, 0, 44, 82,205,205,204, 72, 53, 13, 50,186, 2, 4,251, 97, 0,127, 33, + 14, 47, 73, 29,193, 0, 51,195,227, 46,253,255,130,138,253,159,160,193, 31,228,210,255,239,223,191, 95,191,127, 37,232, 84, 72, + 47, 1,185,163,176, 6, 12,136, 28,252, 1,185, 25,105, 36, 7,200, 38,232, 77,172,165, 63,176,232, 7,246,114, 32,165, 63, 43, + 11,235,104, 54, 38, 56,108, 2, 17, 68, 30,100,199, 95,148,147,215, 2,131, 40, 70, 46,253,113, 53,236,176,186, 25, 88,250, 3, +211,210,234,213,171,247,236,217, 67,170,155,129,165, 63, 11, 11, 11,144, 28, 77, 6, 36, 1,128, 0, 98,194,211,252,255,246,226, +185,167,161, 17, 49, 5, 55,164,206, 0, 54,255,129, 12, 72,233, 15,233, 52, 0, 73, 72, 29,240,228,211, 51,163, 50, 11,130,117, +201,215,239,192, 98,232,239,243,183, 63,159,190,254,241,248,229, 15, 34,139, 78, 72, 10,195, 85,250,211, 14, 96,214, 1, 64,240, +227,215,207, 31, 63,126, 16,111, 8,164, 28,135,140,173,139,138,138,194,155,198,248,115, 14,114, 59, 26,179,227,140, 39,223,130, +198,253,129,197, 63,184,241, 15, 47,253,127,255,254,253,245,235,215,207,159, 62,211,122,116, 98,213,170,213, 48, 30, 35, 24, 50, + 0, 69,136,175, 3,224,165, 63,164,232,103, 98, 98,226,224,224,224,230,225, 26,205,198, 52,234,215, 18,217,167,196, 90,121,160, +141, 8, 17,163, 23,222,143, 4,214, 1, 36, 57, 27, 82,250,131, 6, 52, 70,235, 0, 18, 1, 64, 0,118,205, 94, 7, 65, 24,136, +227, 36,208,224,238, 32,239, 64,124,156,250, 8,142, 60, 15,137, 3, 59, 60,150,176, 16,135,106, 75, 33, 90,130, 7, 37, 23, 98, +180,158,137, 35, 55, 53, 13,133,210,143,223,221,253,219,224, 45,202, 79,199,121, 16,155,242,108,147, 0, 74, 32, 96,195,127,203, +125,172,196,242,118, 31,125,125,131,106,123,169,205,173, 49, 87,101,132, 52,148, 31,120,185,252,131,193, 62, 22, 32,133, 20, 66, +252,119,212,210, 52,197,131, 95, 84,252, 97,149, 67,125,215,182,116, 7, 0, 77,178, 44, 43,171,138,249,254, 46,138,144,254, 73, +146,196,113,236,216, 54,240, 69,120, 12,125,192, 50, 47,113,159, 64,220, 39,254, 63, 70,250,247,150,254,224, 13,180,214, 74, 41, + 41, 73, 14, 0, 37, 32,107,244,216, 63, 47,114,111,240, 46,117, 61,206,154,157,179, 97, 24,125, 64, 81, 28, 56,167, 44,176, 37, +253, 25, 99, 97, 24,110, 38, 35,246,124, 53,138, 2,249, 9,220,116, 45,200,161, 8,185,141,115,110,209,255,211,109, 2,164,255, + 76,180, 32,128,200,102,213,130,136,246, 20, 64, 76, 88, 71,114, 76,148, 85,127,188,126, 13, 44,253,129,108, 59,112,179,148,152, + 78,192,189, 43,119,144, 13, 65, 99,191,189,252,130,160, 9,164,150,254,240,162, 31, 88, 13,200,202,202,194, 5,127,195, 0,176, +232, 7,182,109,223,189,123, 71,221, 80,131, 88,186, 99,199, 14,120, 63, 0, 82,250,235,233,233,253, 0,214, 0,223,191,195,107, + 38,252, 89,110,234,180,169, 64, 71,202, 72, 75,255,254,251, 23,173,244, 39,152,109, 32,117, 0,114,131, 11,178, 26, 21,107,191, + 4,165, 2,248,245, 27, 82,250,159, 62,117,250,219,247,239,192,210,243,227,199,143,192,128,122,255,254, 61,241, 33, 0, 25, 5, + 34,126,232, 31,148, 0,222,188,125,251,246,205,155,183,239, 64, 52,152, 9, 20,212,208,212,124, 7,102, 16,211,252, 7,146,192, +210, 31,218,240,231,230,230,225,225,229,229,225, 5, 50, 70,179, 49,174,210,156,248, 6, 56,100, 5, 1,156,129,139, 77,146,237, +104, 35, 66, 4,117,185,184,184, 0,235, 0, 96,233,239,234,234, 74,124,159, 3, 88,214, 3, 75,124, 56,119,180,244, 39, 9, 0, + 4, 16, 19,102,243,127, 85,109, 21,144,241,237,197,115,184, 32, 49, 51, 1, 37, 37, 37, 83, 83, 39, 50,128,103,125,129,138,225, +171, 72,129,108,215,197, 1, 64,246,185,174, 19, 64, 53,212,117, 61, 60,109, 61,121,242, 4,210,228,135,148,251,208,238,203,215, +175,192,210, 13,216, 30,231,226,162,254, 40, 1,208,234,140,140, 12,144,141,127,254, 92,187,118,237,252,185,115,250,122,250, 63, +126,128, 59, 0,223,191, 47, 89,188, 24, 34,139, 39,185,247,246,246,106,105,106, 1, 93, 11, 12,165, 63,191,127, 61,125,242,148, +108,239, 51,192,102, 32, 24,192,219, 17,240,245, 0,126,255,252,243, 23, 52,242,115,242,228,137,175,223,191,126,249,252, 9, 88, +250,191, 7,149,254,239, 72,170, 38, 33,253, 0,146, 90,106,135, 14, 29,250, 12, 2,159,192,228,103, 17, 97, 97, 96,233,127,227, +250,245,131,135, 14, 17,163, 29,210,252,103, 97, 97, 5,198, 38, 15,176,236, 7, 98, 30, 46, 78, 46,206, 23, 47, 94,140,102, 99, + 8, 40, 47, 47,135,151,191,240,201, 85, 8, 3, 34, 8, 81, 64,100,179, 29,255,184, 16,254,210,159,248,182, 63,154,155,129,117, + 0,176,244, 39,201,205,200,117,192,104,233, 79, 42, 0, 8, 32, 44, 67, 64,194,247, 31,188, 3, 15,254,192, 69,128,157,128, 30, +134, 27,248, 13,130, 12,245,220, 56,123, 77, 64, 93, 4, 88,226,247,196, 66, 43, 12, 72,233, 15,105,254, 19, 92, 77,180,174,221, +128,188,246,248,245,235,215, 33, 41, 0,121, 52,128, 21, 12, 94,191,126,237,229,229, 69,139,176,131,148,185,192,134,191,153,153, +217,143,159, 63,191,255,248, 14,110,253,127, 7, 49,126,252,152, 50,101, 10,174,156, 3, 89,169,249,247,239,223,179,103,207,177, +178, 48, 67, 66,230,254,131, 7, 79,159, 62, 93,190,124, 69,100,100, 4, 80, 4,222, 15,192,154,193,224,131, 78,104, 45, 56,130, + 43, 80, 33,109,255,227,199,143,127,253,242, 13, 82, 65,126,250,252,233,211,167,143,159, 62,125, 33,126, 32, 5,210,252,135,239, + 4, 38,166, 26, 0, 42,134,179, 21, 21, 20,128, 69, 63, 40,181, 92,191,126, 31,220,107, 65,150,197, 3, 44,173, 44,217,217,216, + 57, 57, 57,129, 61, 0,118,118,118, 96,228, 82,125,122,127, 72, 3,228,213, 50,240,197, 51,240,154, 0, 77, 1,254, 66, 28,235, + 80, 62, 73, 61, 15, 34,171, 13,106,185, 25, 82, 7,140,150,254,164, 2,128, 0, 98,193, 28,255,113, 94,178, 12,171, 82,130,235, + 65, 33,205, 7,163, 50, 11, 97, 93, 9, 72,185, 15, 31,252, 1, 54,255, 9,166, 6,242, 22,252, 66, 44,213,212,212,188,124,249, + 50,188, 8,195, 28,244, 7, 42, 35,254,124, 12, 82,109, 71, 22, 89,178,120, 9,176,244,135,236,176,194,186, 30, 31,121,157,254, +191,127,127,245,244,141, 46, 94,188,116,253,218, 53, 22, 86, 86, 96,201,248,228,233, 19, 96, 83,151,153,153, 57, 44, 44, 12, 88, + 7, 48, 48,240, 99,154, 0,212, 14,201, 93, 16,219,209,246, 1,224,119, 48,176,244, 63,122,244,232, 23, 32, 0,205,250,126, 2, +151,254, 64,226,243,151,207, 95,190,126,251, 70,208,179,192,162,255, 12, 24, 48, 96, 44, 3,197, 95, 13, 56, 56, 56, 32, 7, 20, +164,220, 63,127,254, 60, 3, 17,219,143,141,193, 0,200,224,225,226,225, 0, 21,254, 28,108,108,108, 76, 76, 76,163,165, 63,250, + 24, 44, 82,185,185,122,245,106, 96,107,154, 1,117, 66,149,152, 37,149,200,109, 11, 82, 87, 51,147, 49,238, 79, 21, 55,195,235, +128,209, 52, 64, 42, 0, 8, 32, 22,180, 86, 60,133,219, 46,224, 41, 0, 82, 13, 64,138,126, 6, 26,111,197,130, 88,170,171,171, +123,250,244,105, 96,123, 31, 81,241,188, 5,205, 72,199,198,198,210, 52, 4,145,189,246,255,255,255,152,216,152, 41, 83,166,130, +199,217,255,240,243,243, 19,172,231,110,221,186, 5,108,209, 66,244, 2,217,104,202,238,225,168,180,144,235, 0,200,108, 48,100, + 73, 40,254,112,134, 44,159,183,182,182,166,196,179,240, 53,160,164,158, 5, 4,212,123,224,192,129,229, 96,128,220, 51, 32, 50, +109, 0,171,144,223,127,126,255,254,252,123,116,202, 23, 23, 32,184, 98, 18,168,128,200,208,134,239, 3, 32, 47, 51, 18,175,145, +138,110, 30, 5,100, 0,128, 0,162,254, 97,112,192,216, 2, 13,253,119,209,245, 44, 32, 72,178, 51, 53, 53,221,182,109, 27,164, +220,167,188,111, 65,222, 96, 20,124, 47, 46,214,210,159, 42, 0,243,204, 6,200,178, 81,130, 77, 54,170,132, 3,220, 16, 96,105, + 78,234,217, 15, 14, 96, 64,170,141,163,231,252,144,209, 22,161,127,226, 39,207,198, 65,226,230, 17, 11, 0, 2,136, 38,167,129, + 82,222,147, 32,187, 14,160,209,112, 63,237, 50, 0,229,134,143,230,150, 81, 48,228,146,241, 40, 24, 36, 0, 32,128, 24,169,123, + 64,194, 40, 24, 5,163, 96, 20,140,130,161, 2, 0, 2,104,244, 70,176, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, 43,128, + 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, 43,128, 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70, 43,128, 81, 48, 10, 70, +193, 40, 24,161, 0, 32,128, 70, 47,133, 31,213, 59,170,151,230,122,113, 45,207,165,181,222,209, 56, 26,213,139, 31, 0, 4,208, +104, 15, 96, 20,140, 2,218, 2,200,233,246, 16,146, 84, 64,204,145,250,163, 0, 43,184,121,243,230,104, 32, 16, 4, 0, 1, 52, + 90, 1, 12, 36,184,118,237, 90, 58, 18, 0,114, 7,191,222, 81, 64, 18,184,119,239, 30,228, 96, 3, 32,137,124,236, 1,241,165, + 63,228, 88, 89,178,207,228,193, 37, 66, 69,189,240, 59, 57,200, 3,180,168,222,128,165,127,127,127,255,104,242, 35, 8, 0, 2, +136,101,248,121,233,240,225,195,182,182,182,131,223,157,144,116,223,219,219, 11, 23, 41, 46, 46,102, 32,250, 50, 72, 32,249,111, +165, 32,162, 38, 15,159, 72, 7,189,163,128, 84,128,124,212, 1, 73,167, 26, 32,151,254, 64,146,145,145,145,248, 35, 22, 40,217, + 45, 72,134, 94,200, 57,254,120,156, 7,236,253, 64, 14,249,193,227, 89, 76,189, 4,117,225, 47,253,255,253,251, 55,107,214,172, +165, 75,151, 70, 71, 71,143,166, 67, 92, 0, 32,128,134, 97, 15, 96, 9,142,195,236, 6, 91,233,159,159,159,143, 92,250, 67, 42, + 3,160, 32, 49, 13,174, 5,185,220,200, 37, 56,164, 64, 7, 10,210, 84,239,199,143, 31, 51, 51, 51,225,183,208,188,120,241, 2, +168,165,181,181,181,185,185,185,170,170, 10,114, 94, 63, 46,192,246,241,171,110,230,124,158,253,247, 33,220, 63, 47,254, 92, 77, +255,113,169,149,237, 72,179,224,230, 42,249,115,187,164,135,107, 6, 35,227, 60,125,180,210, 31, 2, 72,234, 7,208,185, 7, 0, + 57,199, 31,162,114, 15, 24,160,149,227,248,111,248,130,235,197,212, 69, 70,231, 0, 94,250, 3,155, 83,192,210,255,200,145, 35, +163,165, 60, 30, 0, 16, 64,195,173, 2, 0, 54,255,129,109,165, 65, 30,235,144, 33, 23, 57, 57, 57,120,195, 31,210,246,135, 11, +226, 25,147,129, 72,197,217,176,193, 26,239,239,129, 8,194,134, 8,210, 72, 47, 16,156, 60,121,146,131,131,227,248,241,227,136, +212,195,196, 84, 93, 93, 93, 91, 91, 27, 31, 31,191,117,235, 86, 60,122, 37, 78, 94,251,207,193,202,117,252, 17, 92,132,145,233, +191, 94,245, 47,155,218,247,230,241,175, 78,111,149, 30,205,138,152,165, 63, 35, 12, 16, 89, 7, 32, 79, 24,164,163, 2, 6, 66, +211, 9,148,232,133,215, 1,239,222,185,204,156,249,158,164,210, 31,107,253, 1,215, 69,106,175, 20, 88,250,247,245,245, 1, 67, + 12,152, 50,207,156, 57, 3, 44, 13, 70,147, 19,126, 0, 16, 64, 76,248, 11, 83, 50, 66,144,194,241,101,160,141, 16,141,228, 69, + 30,176,249, 63, 99,198, 52,178, 59, 1,244, 73, 49, 19, 39, 78,132,183,253,129, 69,127, 47, 24,192,235, 0, 32, 27,168, 0,143, + 94,120,251, 29, 88,124,223,222, 22, 11, 68,240,114, 28, 40, 69,188, 94, 72,155,148, 72,189,192,210,231,216,177, 99,192,222,244, +163, 71,143,158, 63,127,142, 38,245,240,225, 67, 73, 73, 73, 6,220,154, 37,143, 93,121, 18,109,205,246,232, 35,227,115,248,161, +211,144,171,220, 24,222, 61,100, 23,146,252, 62,204,242,213,189,123,247,240, 20,181,120, 38, 3,208,218,254,104,247,202,225,175, + 3,144,111,224,154,137, 10, 24, 8,221,207,133, 44,251,127,149, 32, 50, 98, 32,241,110, 47, 72,185, 79, 82, 57,142, 92,127, 0, + 17,121,165, 63,176,123, 58, 97,194, 4, 96,219,191,160,160, 0, 88, 7, 64,218,130,211,167, 79, 31, 45,229,241, 0,128, 0, 98, +193, 83, 20, 46, 93,186, 28,146,224,136, 31, 82,135, 36,205,152,152, 24,136, 22,160, 33,144, 50,133,200,184, 4,170, 95,178,100, + 9, 80, 59,184, 40, 95, 66,146,213,240,230, 63, 36,159,144, 49, 19, 0,177,157, 84, 75, 41, 1,144,210, 31, 94,238, 35,115, 9, + 87,221,224,210, 31,194, 6,213, 1, 94,139,209, 6,118,240,235,133,199, 8,184, 14, 72, 39,168, 23, 88,196,255,250,245,203,216, +216, 24,216,187, 2,118, 2,130,130,130, 64,117,198,191,127,237,237,237, 95,190,124, 97,101,101, 5,102, 63, 92,122,133, 30, 62, +101,250,245,231,131,177, 2,235,145,103, 44,199, 95,254, 14, 82, 4,197,209,191,255,151,218,217,222,125,225,253,206,202,227,154, +121,123, 56,101, 42,130,205,222,206,206, 78, 96,121,135, 57,192,141, 89,178,195,155,255,152, 42, 7,225, 41, 94,233,233,130, 72, + 53, 10,168, 97, 1, 12, 6,178,239,249, 32,181,237, 15,204,245,240,187, 33,109,108,108,128,217,121,180,244, 39, 8, 0, 2,136, + 5,119, 81,184,108,230, 76, 80,240,101,100,100, 17, 89, 38, 66,198,181,181,180,180,224, 34,182, 96, 0,233, 19, 16,140, 81,120, +233, 15,183,139,212,226, 24,232,230,152,152, 40,112, 13, 20, 5,100,147, 90,121, 0,173,131,223,103, 48, 36,166,145,233, 9,142, + 30, 61,106,110,110, 14, 44,143,128,228,134, 13, 27, 2, 2, 2, 32, 67, 64,149,149,149, 12,224,171, 23,150, 47, 95, 14,148, 50, + 53, 53,197,212, 43,127,244,204, 11,115, 77, 96, 97,246,213, 92,150,121,195,243,223, 1,138,224, 33, 32, 6,189,202, 95, 64,173, + 95,223,126,220,183, 92, 69,222,252,139,158,233,147, 97, 16, 80,248, 47, 85,135,131,213, 96,128, 89,136, 35,223,169,130,235, 90, +105,172, 23, 55, 14, 56, 0,214,103,152, 75, 93, 33, 99, 59,164, 2, 50,116, 65,206, 12,103, 97, 97, 41, 44, 44, 60,115,230,204, +232,208, 63,145, 0, 32,128,176, 87, 0,192,182, 63,164, 36, 5,130,232,232, 72, 32,151, 96,129, 8, 25,234, 65, 46,253,225, 0, + 34, 8, 84,128, 85, 22,169,248, 70, 41,253, 33, 12,160, 32,145,101, 49, 48,202,129,197, 19, 68, 49,144, 4, 86, 0,196,119, 2, +224,165, 63,114,238, 34,178,206,163,164,253,130,220,234, 39,169,249, 15, 25,177, 1,182,250, 33,157, 0, 85, 82,154,255, 80,189, +225,233,240,187,159, 8,234,253,253,251, 55, 48, 83,241,242,242, 94,186,116,233,239,223,191,159, 62,125,186,126,253,186,176,176, + 48, 92, 1,144,237,237,237, 61,109,218, 52,204, 10,128,249,247,111,217, 51,151,217,120,165, 89, 47,189,253,248,151,247,243, 39, +182,191,215,191, 48, 8,115,192, 21,112, 11,255, 49,245,126,178,112,154,237,240,168, 0,128,161,138, 57,244,129,121,201, 34,164, + 7,128,182, 97,135,164,181, 58,180,184,225,142, 26,222,127, 15,233, 10, 32,247, 6,136,239, 64, 0,195,141,140,210,127,233,210, +165,135, 14, 29,250,191, 74,144, 49,236,125,127,127, 63,176,226, 4, 54, 77,102,204,152, 49, 90,190, 19, 4, 0, 1,196,130,181, + 52, 4,134, 32,114, 65, 12,172, 0,128,197, 43,176, 87,133,199,160,137, 19, 39, 66,134,110,176, 2,160, 20, 80, 1,158,244, 13, + 25,124, 71, 43,115,193,229,248, 18, 98,202,113,228, 46, 11, 4,196,198, 70, 47, 94,188,148,152,114, 28,185,244, 71,107, 97, 17, +212,139,199,203,120, 0,176,159, 4, 47,238,225,163,255,200,179, 2, 64, 5,120,244, 50,133, 67,135,242, 33,117, 0, 3,210,154, + 78,166,240,247, 36,232, 13, 79, 39, 82,239,133, 11, 23,228,228,228,128,109, 43, 8,119,209,162, 69,199,143, 31,247,241,241, 65, + 86,243,242,229, 75, 14, 14, 14, 76,189, 10, 23, 46,124,144,147, 60, 89,152, 4,225,178, 45,186,253,247,248, 71, 38, 31, 20,149, + 31, 95,114,178,115,252, 30, 54,153, 10, 88,178, 43, 41, 41,225,185,235,170,188,188,156,200,107, 14,145,135,128,112,117, 8, 6, +109, 32,144,161, 30, 82,113,146,164,119,217,178,165, 7, 14, 28, 96, 92, 3,106,142,236,170,225,117,107,249,108,103,103, 55,186, +244,147, 72, 0, 16, 64, 44,152,165, 33,114,243, 31,222, 9, 0, 22,166,200,181, 2, 86,128, 71, 22, 82,148, 19,108,254, 99, 45, + 97, 9,118, 2, 32,110, 70, 46,253, 33,131,128, 64, 7, 3,197,129, 89, 8, 79,213,133, 89,250,147, 84, 7,144, 55, 82, 4,233, + 9, 61,122,244, 8,178,230, 7,185,225, 15, 20,196,213,145, 66,214,187,232,200, 47,200,186, 29,228,198, 59, 80,144, 70,122,129, +197, 61,178, 79,237,237,237,187,187,187,157,157,157,255,253,251,215,214,214, 6, 36,191,127,255, 14, 12,103,172, 49,168,126,252, +248, 37, 91, 7, 56,247,143,189,228,223,238,199, 12,206, 98,255,255, 49, 92,106, 99,253,242,143,231,221,119,190,119,140, 66,126, + 49, 23,135, 83,190, 2,150,239,248,167, 91, 73, 41, 26, 87,129,200, 61, 97,196,244, 71,225,233, 22,235,106, 78, 60,247, 53, 34, +235, 5,182,163, 73,210,139,217,138,135,220,225, 76,159, 1, 55,208, 52, 53,164,244,191,244,103,254,254, 95,224,242,106,180,244, + 39, 22, 0, 4, 16, 74, 5,144,145,145, 5,186,213, 54, 38, 10,179, 37, 14, 25, 23, 2,162, 25, 51,166,209,200, 41, 88, 11, 83, +130, 53, 7,220,205,184, 12, 4, 86, 93, 64,132, 86, 61, 32, 87, 60,120, 50, 42, 48,121,209,104, 50, 0,158,217,200,216, 8, 6, + 84,144,144,158,158, 48,249, 43,234,102,174,247,180,211, 11,190,158, 30, 1,228,229,229,167, 76,153, 66,100, 89,182, 13, 85,239, + 63,121, 30,206, 41,154, 64,134,246, 76, 86, 6, 6, 96,171,255, 61, 24, 61, 28,174, 25, 12, 94, 16, 67, 24,116,184, 45, 14,107, + 73, 13, 23, 33,184, 10,136, 12,189,152,173,120, 34,251, 55,148,135, 45, 48, 25, 3,203,125, 32,123,193,254, 95, 43,142,253, 2, + 22, 5,163,251, 25, 73, 2, 0, 1,132, 82, 1,224, 41,220, 33,211,185, 4, 19, 31,217, 10,200,190,201, 22,127,133, 68,161,179, +105,157, 93,175, 93,187, 6, 95,253, 9, 25,162,193, 63, 77,130,166, 23,178,131,151,158,122, 71, 1,169,160,188,188, 28, 62, 22, + 4,100,211,199, 82, 58,239, 4, 30, 88,224,222,242,121,168, 56,117, 16, 2,128, 0, 98, 25, 13,130, 1, 4,192, 98,151,236, 36, + 59, 80,122, 71, 1,169, 99, 65,144,147, 18,128, 36,241,237, 98,148,213,159,176,193, 31, 92, 75, 66,113,141,231,224, 23,161,133, + 94, 90, 84, 93,248, 1,176,243, 10, 12, 22, 63,255, 52,104,119,115,251, 57, 8,195,203,211,104, 52,237, 17, 3, 0, 2,104,180, + 2, 24, 5,163,128,182,192,197,197, 5, 88, 1, 16, 63,177, 73,121,105, 59,176, 61, 0,250,214, 22,255, 33, 59, 10, 71, 1,121, + 0, 32,128, 70, 47,133, 31,137,128,243,231,141,239,236, 26,163,225, 48, 10, 70,193, 8, 7, 0, 1, 52,122, 28,244, 72, 4,163, +165,255, 40, 24, 5,163, 0, 8, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20, +140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,136, 38,151,194,223,191,122,156,129,233,135,164, +140,244,231,239, 95,223,191,253,170,166,105, 67,188,222, 35,231,238, 50,252, 99,127,249,244, 41, 55, 39,183,160, 16,183,185,137, + 34,241,122, 41,113,243,191, 55, 83,120,121,190,115,114, 51,179, 48, 51, 49,114, 48, 62,255,148, 79,188,222, 79,188, 65,130,194, +130,252, 60,204, 12, 44, 12,239, 46,204,194,111, 47,167,244, 13,226,221,252,253, 41,202, 96,189, 20,215, 75,226,245, 62,251, 38, +142,162,247, 39, 9,246, 62, 67,157, 36,144,254, 69,194,245,170, 79,217,212, 7,131, 94,109,108,225,220,217,185,186,188, 28,203, + 81, 51, 87, 81,195,153, 83,230, 23, 9,113,244,132, 13, 37,109, 72,147, 16, 71,155,159,162,196,209,143,159,220,196,235,229, 96, +255,138, 98,148,223, 20,226,245,250,110,202, 65,230, 22,191, 32,225,216,156, 94,137, 12, 26,229,193, 81,189, 52,210,139, 7, 0, + 4, 16,190,101,160,169, 7,138, 24, 29,227,103,253,215, 39,198,160,123, 87,118, 49, 50,252,227, 97,231,156, 63,115,217,194,133, + 19,173, 93,172,255,124,253,166,165, 97,247,239, 31, 67,118,217, 95, 45, 45,245, 59,119, 30,254,248,254,135, 87,210, 26, 83,239, +209,243,175,254, 51, 48,126,249,249, 61,189,168,165,113,146,251,179,171,103,129,201,123,219,197, 39, 76, 76, 12, 19, 27,106,110, +221,186,169,160, 32,207,206,201, 34, 44,200,142,197,222,117,211,216,216,216, 56, 57, 57,121,120,120, 68, 4, 56, 68, 89,121, 69, + 37,185,249,217,121, 5,216,152, 88, 88, 88,254,255,251,251,137,153,225,211,171, 79,135,121,117,113,185,252,227,221,169,188,156, + 31,249, 4,216,120,184, 89,217, 56,153, 88,152, 25,152,216, 88,212,165,103,255,254,207,124,239, 89, 18,126, 95,239,127,164, 44, + 34, 34, 34,206,243,227,251,143,159, 76,236,156, 12,191, 25,254,200,197,124,120,255, 78,228,243, 54,218, 85,218,179,102,205, 74, + 75, 75, 27,109,188, 16, 4,184,138,123, 82,213, 0,129, 4, 39,215,211,167, 79, 89, 57,216,255,113,113,209,211, 11,223,222, 93, + 56,182,119, 5,178,136, 75,104,199,224, 12,237,197,139, 22,177,179,177,253,251,247,143,155,135,199,215,207,111, 52,249, 13, 9, + 0, 16, 64, 4,246, 1,252,223,187, 48,205,153,112, 29, 16,234,167,242,211, 73,232,247,151, 15, 44,127,153,204,244,100,226,227, +161,205,103, 96, 9,126,226,248, 2, 17, 57,233,127, 95, 62,217,155,235, 62,123,246,126,207,249, 63,104,122,211,211,219, 24,216, +248, 25,185,248,254, 51,255,191,120, 45,113,222,138,157,208, 38,249, 63, 6, 15, 75, 75,134, 47, 47, 24, 24,120,239, 94,190,206, + 42, 34, 96,109,161,195, 35, 32,134,197,122, 70, 38, 32, 98,252,207,204,250, 11,104,204, 31,102,102,102, 86,102,102, 54, 86, 16, +249,251, 47, 3,227,159,127, 32,119,224, 0, 47, 46,182, 8,241, 51,240,113,113,137,138, 8,243,241,113,253,103,250,251,231,223, +151,191, 12,127,121,120,184, 68, 36,100,148, 84,143,236, 57,136,253, 28,161, 25,187,127,241,243,114,243, 11,124,254,241,141,237, +235, 87, 14, 54,118, 14,214, 31,127, 65,237,193,111, 63,190,126,251,254,232,189,206,171, 55,239, 62,189,126, 18,102,133,221,234, +213,157,132,174, 73, 74,112, 17, 20, 23,196, 90,250, 83,177, 14,168,234,238, 6,146,109,165,165,100,232,173,236,234, 2,146,237, +101,101,196,107,185,242,244,233,173, 91,183,128,140, 32, 71, 71, 34,181,204, 92, 5, 58, 9, 7,249, 86, 44, 32, 27, 66, 50,192, +206, 71, 3,178,211,176, 29, 33, 9, 44,217,241,151,239,196,148,254,138,130, 66,223,127,253, 4, 50,216, 56, 57,126,125,255,241, +239,235,183, 55, 47,158, 75,234,234,226,209, 34,169,172, 70,208, 95,252,242,154, 55,246,109, 36,168, 12, 88,250,219,184, 68,112, + 8, 26, 16, 21, 88,161,239, 8, 42, 9, 11, 11, 91, 21,186, 7,171,148,227,158,215,112,182,150, 0,168,100,120,245,227,223,247, + 63,160, 16,254, 10, 38,103,154, 11,168,241,178, 98,213,219,211,211, 83, 85, 80,226, 31, 20,248,227,199,247,137,253,125, 83,166, + 76,201,201,201,161, 48,113,222,185,115,167, 27,156, 62, 9,110, 44, 56,126,252,248,131, 7, 15,222,190,125,251,249,243,103, 94, + 94, 94, 97, 97, 97, 5, 5, 5, 75, 96,233, 49, 10,192, 96,203,146,102, 56, 27,109,221, 63, 64, 0,225,171, 0,102, 59,244, 5, +159,104,253,119,108,107,154, 21, 3,254, 58,224,231,151,119, 18, 42,206, 45,165, 65, 11,102, 30,128,136, 28, 60, 54,227,235,183, +159, 94, 46,249, 86,214, 9, 17, 97, 78,156,156,236,191,254,254,249,252,237,151,154, 5,230,161, 61, 15, 25,126, 49, 4, 69, 79, + 79, 45,130,118, 45, 61,172, 28, 56, 56,216, 55,236,219,185,237,232,241, 69,243,167,253,248,254,147,141,153,133,135,139,141,143, +237,239,157, 71, 47,208,171, 40, 96, 17,240,255, 31, 8, 49,253, 3,178,127,254, 98,103, 0, 86, 49,236, 12,255,127,253,253,203, +204, 0, 44,202,255,254,250,247,231,239, 63,172,206,190,123,170, 93, 70,244, 63, 31, 47,183,180,140,162,134,174, 10, 47, 15,231, +199, 47,175, 95,188,126,241,254,227,203,223, 63, 24,185,128,181,130,168,117,112,224,229,181,235,213,209, 52, 78, 95,250,248, 47, + 47,239,119, 22, 6, 54, 14,182,239,223,216,126,125, 99,251,193,193,206,194, 8,204, 37,204, 63,190,127,249,254,237,243,247,239, + 95,191,127,250,248,249,197,195, 9, 19, 30, 43, 27, 99,223,255,217,189,168, 27, 87,120,150,198, 97, 47,145,223,191,127,143,204, + 22, 18, 18,130,148,134,130,130,130,119,239,222, 93,189,122, 53, 73,181, 2,155, 56,116,252, 1,104,168, 32,185,105,107,214,234, +213,217,217,217,191, 95,189, 34,166,244, 23, 19, 19, 11,114,115,251,205,206,222,219,219, 27,236,228, 68,204,241,150, 64, 15,246, + 52, 52, 64, 71, 42,234,235,123, 27, 27,177,178,113,105, 71,174, 3,128, 12, 99, 99,227, 61,123,238,185,184, 40, 17, 89,250,107, + 72, 72, 10,240,241, 65,146, 25, 55, 7,231,243,215,175, 62,189,255,192, 35, 32,248,240,244, 25,121, 83, 19, 60, 26,253,210, 74, + 98,130,125, 85, 21, 20, 32,220,250,222,201,112,169,198,226, 92, 32,249,104,251, 94, 51, 53, 89,162,134,122,136, 44,253,161, 45, + 11, 33, 66, 42, 8,239, 71,227,102, 97,188,216,152,204,200, 39,242,247,222,197,159,247,174,222,122,247,213,100, 59,190,248,157, + 49,115,102, 81,122,118, 92, 74,210,234,165, 43,128, 37,111, 75,103, 23,111, 67, 11,252,210, 8, 74,138,126, 80, 94,192,219, 58, + 1,150,248,187,118,237,250,253,251,183,178,178,178,173,173, 45, 63, 63,255,135, 15, 31,158, 61,123,118,255,254,125, 32,233,230, +230, 6,172, 15, 70, 75,127, 52, 46,114, 29, 0, 16, 64,232, 21, 64,218,109,216,209, 58,224, 29,118,255,255,125, 97,248,245,243, +247,129,101,105, 14, 12,132,250, 1,108, 90,154,234, 76, 76, 7,110,125,120,203,192,112,253,227,211,219,192,254,242,198,173,147, +190,189,249, 27,157, 88, 8,108,206,251,249, 90,254,101,225,193,165,249,214,173,235, 64, 53, 94,250,192,102,157, 20, 3,131,252, +143,159,191, 66, 60,220, 56, 4,152, 22, 45,219, 1,108,190,175, 89,177,128,249,207,103, 77,121,246, 59,143,208, 53,254,251, 15, +186,151, 10, 8,254,254,253,251,147,245,255,111,198,223,191,126,253,250,198,245,131,225, 31, 7,211,255,191,127,217,254,127,249, +245,227,215,247,111, 12,124, 88, 44, 21,229,249,201,194,194, 9,108, 47,168,168,168,136, 75,152, 51, 48, 51,253,253,123,150,233, +255,135, 31, 95,129, 85,198,215, 23,207,222,137, 10,191, 17, 22,176,150,148, 93,204,192,128,210,226,227,252,241,231,255,207, 55, + 12, 63,216,127, 49,253,254,202,198,242,133,147,149,133,149,141,225, 31, 55, 35, 51,227,151,175,223,222,191,120,120,247,236,209, +119,143, 30, 1, 93,197,244,159,153,200,120,154, 55,125, 30,132,145,148,137,115,220, 9,249,158, 41, 32,187,168,168,232,209,163, + 71,192, 34,146,188,189,151, 83,167, 78,125,249,242,229,154, 53,107,188,237,236, 4,197,196, 72,213, 14,108,251,191, 7,151,140, +144,131,225,210,195, 8, 28, 87, 9,108,251, 3, 75,127, 80, 66, 97, 99, 83, 83, 83, 91,187,111, 31, 49, 93, 1,202,207, 64, 6, +150,242,192, 66, 31,114, 97, 8,156, 12, 13, 13, 37, 88,250,171,137,137, 3, 75,127,102, 38,166,172,152,232,239, 63,126,246,206, +157,203,197,201,249, 3, 8,190,127,103, 98, 97,126,124,254,188,172,161, 33, 46,189,144, 82,254,246,131, 7,200, 92, 50,128,185, + 83,196,158,213, 21,174,126,201,255,217, 85,137,212, 2, 63,203, 19,114,155, 35, 86, 17, 92, 0,216,240,127,248,229,239, 65, 87, + 81,214,252,153,159,162, 21, 89, 4,197, 8,150,254,123,247,238, 85,144,148, 74,201,202,168, 40, 44,155, 50,127,134,153,145,209, +140,201, 51, 10,202, 74,150, 90,154, 95,190,124, 89, 23,111, 87, 9,127,209, 15, 52, 25,200,197,175, 30, 88,250,139,138,138, 26, + 26, 26, 50,129,123,249,192, 28,199,202,202, 10,108, 24, 73, 72, 72, 0,235, 0,160,108,112,112,240,104,233,159, 86, 14, 29, 54, +156,213, 89,129, 86, 7, 0, 4, 16, 74, 5,144,122,172,242, 27, 51,199,191,191,255,254, 49, 50,243,254,255,206, 0,108, 6, 51, + 48, 51, 72,171,177,254,250,250,127,207,188, 52,151, 36,188,117,192, 63,102,102, 72, 97, 7, 44,107,101,248,165,213, 31,222, 92, + 51,125,230,124,166,159, 92,110,142,214, 59,246, 30,253,246,141,129, 75,136, 31, 83, 27, 39,151,250,247,111, 55,129,197, 55,124, + 84,134,129,225, 25, 19,179, 67, 92,124,242, 63,246,175, 91,182,206,243,243, 77,226,226,102,248,246, 22,152,136, 37, 48,181,255, +102, 96,102, 5,151,254,191,255,252,253,249,233,247,183,223,223, 62,112,178,252,254,198,250,147,229, 55,243,111, 70, 96, 65,254, +233,251,159,175,159,127, 51,136,163,107,188,184,191, 83, 73,130,145,153,153,145,145,137,253,239,223,255,127,190, 61,250,249,247, +247,211, 23, 31,223,189,255,242,241,243, 95,166, 31, 63,254, 48,188, 96,102,189, 32, 37,247,137,151,131, 19,211, 94,160, 87,255, +127,254,241,253,243,179,191, 47, 63, 50, 43,203, 0,211,223,223, 63, 63, 63,188,120,112,243,212,241,215, 15, 31,129,139, 45, 22, + 38, 96,232, 50, 83,243, 12,119, 72, 3,127,214,172, 89, 33, 33, 33, 6, 6, 6,236,236,236,125,125,125,228, 25, 5,105,254, 91, +232,232,136,139,139, 3, 75,112, 31,123,123, 41,210,235, 0, 65,112,185,207, 42, 38, 6, 52, 1, 72, 18,236, 7, 0,219,254,172, + 63,127,174, 93,187, 22,185, 43, 64,252,112, 16,217, 0, 82,238, 35, 95,201, 2,172, 62, 9, 86, 0, 95,191,125, 19, 21, 18, 74, + 12, 9,249,240,241,211,235,119,111, 89, 89, 89, 32, 0, 88,196,176,115,114,125,122,251,230,243,227, 39,188,178, 56,167,230,128, +165,255,146,181,155,145, 43, 0, 72, 63,192,220, 72,207,203,209,158, 8, 87,127,102, 96,224,229, 21, 54,112,241,227,222,189,105, + 46,125, 70,255, 47, 45,156,240,115,199,124,177,217,231,128, 53, 1, 51,159,208,159,247,175,128,165, 63,176, 67,240,245,207,127, +102, 28,195,168,247,239,220,217,182,105,235,194,217, 11, 39,205,157, 54,163,111,130,144,176, 80, 75, 91,203,162,101, 75,109, 45, +172,231,205,157, 23, 20, 26,100,107,109, 75, 70,233,191,105,211, 38, 96,191, 86, 82, 82, 18,237, 2,106,180,145, 31, 96,219,223, +200,200,232,207,159, 63,192,174, 0, 7, 7, 7,176, 2,184,113,227, 6,176,169,193,195,195, 3,236,237,189,120,241, 2,168,102, +116, 44, 8, 81,128,148,119, 64,234, 0, 56, 0, 8, 32,148, 10, 96,182, 85, 59, 84, 29,211,229,255,251,230, 51, 10, 75, 50,164, + 76, 62,205,169,105,250,120,227,191, 89,181,204, 71,150,167,217, 50,205,250,135,165, 74,223,180,239, 93,154,202, 39,255,248,252, +226, 92, 96, 7,226, 29, 48,225, 50, 48,252,148, 87, 55,226, 96,103,249,254,245, 39,195, 47, 80,197, 0,236,139,189,122,247, 30, + 83,239,132,254, 34,208,221,241, 39,230, 50, 49, 65,150, 49,128,134,107,254,125,191,250,227,231,111, 78, 30, 14, 6, 54, 80,197, +240,249,211, 39, 49,164,251,167, 80, 60,240,239,215,191,127, 44,192, 20,240,243,231,207, 47, 44,204, 44,191,152, 24,158,127,250, +195,245,231, 47,219,191,255,172,204,223,152, 89,254,124,253,246,229, 23,150, 69, 29,188, 60, 95,255,252, 97,252,249,235, 47, 48, +123,223,186,243,232,201,243, 55,223,127,253,254,244,229,221,151,207, 31,126,252,253,197, 8, 76,244,223, 62,126,250,118,255,225, +211,143,111, 63,127,101, 96, 80, 65,211, 14,116, 22, 36, 71,252,249,248,245,201,133,235, 47,175,223,255,244,249,206,231, 15, 31, +254, 51,176,176, 50, 51,254,103,100,101, 98, 2,245,161, 8, 30, 83, 82, 26, 87,138,103, 44, 8,139,127, 89,160, 81, 6,204, 30, +192, 26, 23,249,176, 73, 82,155,255,192, 90, 4, 52,198, 45, 42, 74,252, 41, 99,216,139,117,112,185, 15,172, 3,240,116, 2,174, + 60,125,202, 0, 62,251, 26,216, 34,131,244, 3, 64,197,205,165, 75, 64,114,221,254,253,248,235,128,226,250,122,200, 72, 23,144, + 93,210,208, 0,239, 19,224, 25,249, 65, 6,192,230, 63,218, 56, 50,228,208, 99,248, 88, 16, 86, 32,192,194,242,227,215, 79, 96, + 8,223,184,119, 23,104,227,181, 91,183,127,253,250,205,196,192, 8, 12,127,160, 99,128, 45,142,239, 95,191,237, 94,181, 50, 8, +233, 48, 87, 52, 0, 47,253, 99,130,125,145,197, 79,158,187,164,170, 40,207, 78,216,225,176,177, 11,118, 85, 96,209, 15,236, 7, + 0,145,103, 96,242,111, 22, 85, 26,150, 16,239,158,179,201,169,189,202,230, 96,119,138,252,123,102,199,223, 79,160, 73,133, 87, +217, 86,242, 51,143,255,253,135,189, 41,163,174,170,206,197,197, 61,105,206, 84, 71,123,123,115, 75,139, 93,219,118,222,184,115, + 11,216, 49,231, 96,103,183, 54,182,222,186,105,235,155, 87,111, 2, 3, 3,137, 47,250,129,205,246,123,247, 64, 81,118,234,212, +169,140,140, 12, 60,189,219, 7, 15, 30, 40, 43, 43, 67, 24, 23, 47, 94,148,151,151, 87, 84, 84,124,255,254,253,153, 51,103,148, +148,148,128,141, 12,160, 8, 80,106,180, 2,192, 3, 0, 2, 8,203, 28, 64, 26,227,197,255, 7,151, 49, 50,179, 48,228,206,205, +127, 32, 57,169,111, 33,176,176,156, 94,123, 51,181, 77,157,121,207,172, 52, 89,205, 89,170, 89,192, 54, 55, 19, 19,202,224,134, + 10,159,204,149, 75,235,192, 76, 96,193,248, 21,124,212,251,111,134,223, 63, 89,254, 1,155, 14,160, 50,125,253,134, 93, 64,210, +218, 19, 75, 25,177,227,242,127, 15, 67, 29,120, 23, 22, 88,202, 49, 48,176, 50,176,114,252, 97,252,251, 15,124,210, 83,120, 52, +232, 76,249,135,199,102, 97,234, 5,166,203, 63,255,152,152,254,252, 97,250,245,243, 27,184, 27,248,157,153,153,251,207,247, 79, +223,129,133, 48, 35,176,103,240,237, 47,195,183, 95,127, 48,253,249,231,215,191, 31,172,204,255,190,253,249,243,239,227,231, 47, +191,153, 25, 89,127,254,249,253,235,255, 47, 32,193,192,246,143,137,145,129,145,253,223,199,239,127, 95,188,254,246,245, 39,250, +196, 53, 19, 35,180,195, 2, 44,151, 32,103, 81,253,254,241,253,227,187,119, 76,192, 80, 99,249,207,240,159,133,153,145,129,248, +150,255,205,135, 55,213,229,213,241,140,252, 32, 15,136,115,114,114,194,107, 2, 96, 62,129,148,254,192,106,128,159,159,255,227, +199,143, 31,128, 53, 16, 17, 99, 38,144,230, 63,176,155, 12,225,230,228,228, 76,158, 60,153,188, 78, 0,220, 4,200, 64, 16,254, +209,127, 70, 94, 94,160,131,203,202,202,128,141,232,223,239,223, 3,221, 92,145,147, 67,176, 31,128, 60,214,143,107, 62, 0, 83, + 87, 39,161,105,246,179, 96, 0, 97, 99,158,136,245,254,221, 59, 30, 94,222, 55,239,223,239, 63,121,146,133,137,249,231,239,223, +223,190,127, 7, 54, 48, 33, 85, 17, 48,145,252,250,249, 19,127, 80, 99, 14,251, 0, 69, 32,157, 0, 85, 5,133, 71,247,238,144, + 20,194,192, 58,224,235,235,147,219,215,207, 37,163, 31, 64,112,228, 7, 14, 46,172,154,109, 16, 95,200,174,168, 7,202, 32,111, +158,223,122, 7, 90,105,202,110,233,243,232,239, 31,174, 41, 39,177,106,249,244,233, 19, 59, 39,135,138,162,226,253, 39,143,223, +190,126, 27, 30, 19,189,109,239,238,137, 29,189,235,183,109, 82, 85, 84,141, 11,142, 61,126,238,232,250,181,107, 3,113, 15,197, +192, 75,127, 96,209,239,234,234, 10,169,161,159, 61,123, 6, 44,253,241,187,246,237,219,183,182,182,182,192, 60, 14, 44,229,143, + 30, 61,170,165,165, 5, 76, 81,178,178,178,192,206, 49, 19, 24, 0, 59, 16,240, 40, 30, 5, 88, 1, 64, 0,177, 96, 41,253,247, + 45, 96, 96,103,103, 16,146,251, 38,107, 62,169,101, 6,195,223,175, 12, 47, 62,213, 44, 63,152,225,159,193,176,103,225,163, 23, +175, 25, 84, 25,254,253,253,131, 86, 1,220,249,244, 73, 77,128,239,207, 79,134, 59, 7,150,168, 56,184,131,199, 72, 24,126,255, +250,205,202,192,244,229, 7,104, 17,133,135,131, 17,167,176, 52, 86, 71,120,232, 50,110,187,248,159, 21,216,220,151,115,255,245, +232, 48,164, 19,192,202,198,254,155,225, 7, 15, 39,232,238,192, 77,219,150,127,127,251,216, 66, 89, 0,203,192,211,191,127,108, +191,190,255,102, 96, 3, 86, 2, 12, 63, 64, 89, 20,216, 43,252, 9, 44,218, 89, 88, 25,126, 48,252,255, 7, 26, 26, 2,138, 96, +230,128,111, 63,254, 49, 51, 51,254,254,243,251,199,207,127,159, 62,255, 0,185,246,223,255, 95, 63,255, 1,107, 31,102,160,110, + 14, 6,198,239,127,255,129,150, 16,125,255,252, 29, 95, 8,130,186, 2,255, 24,254, 51, 50, 48, 49, 1, 75, 7,230,127,255, 25, +129, 12, 80, 45,248,143, 9, 88, 49, 49,254, 99,198,223,252, 39, 53,194,184, 96,203, 16,145, 75,127, 96,123, 7,216, 5, 6,118, +131,224, 45,101, 98,154,255, 10, 34, 34, 16, 46,144, 65, 97, 39,128,200,209,255,255,159, 63,215,214,214,254,124,251, 22,114,253, +163, 10,184, 6, 98,253,249,211,215,215,247,233,171, 87,210, 84, 93, 97, 9, 31,225,129, 79, 0,160, 1, 99, 99, 99,120, 15,224, +234, 83,140,246,193,207, 95, 31,126,189,251,241,227,135, 0, 63, 63, 7, 48, 41,254,253, 3, 12, 88, 96, 89,243, 11,216, 17,248, +253,251,223,159,191,248,195,249,246,131, 7,240, 25, 96,228,177, 32,228,153, 97, 82, 1,183,168, 57,176, 29, 69,134, 70,226,231, + 0,236,119,191,126,165,176, 6,216, 9, 96, 84,212,147,159,127,254,205,143,127,220, 44,140,191,142,108,184,121,239, 62,174, 4, +242,253,207,175,179,199, 79, 77,232,233,183,114,176,169,105,106,216,185,125,231,210, 69,139, 45,237,108,100, 21,228, 88,184, 88, +247, 30,222,187,108,225,226,117, 27,214,110,221,186,213,219,219, 27, 83, 59,228,158, 28,120,209, 15, 1,192,118, 12, 49,254, 2, +166,121, 96,137, 15, 74,192, 10, 10,192,216, 4,118,215,128,217, 31,216,234,103,103,103, 7, 54,134,128,130,188,188,188, 64, 53, + 35,185,124, 7,182,108,182, 44,105, 70, 27,246, 65, 6, 0, 1,132, 50,176, 7, 26,249, 57,188,148,129,147,227,193,167, 95, 12, +223, 63,178,255,251,166,167,163,196,240,246, 27,195,175, 63, 14,250,106,160,133,153,191,127, 48, 51,130,135,104,254,253,197, 48, +234,195,173, 15,143, 88,216, 25, 60,252, 10,151, 77, 2, 54, 82,126, 49,124,251,249,247, 59,195,134,253, 23,246,156, 6,221, 23, + 47, 35,167, 8, 90, 99,143, 3,120,233, 51,254,254,193,176,105,235, 14, 19,183, 92, 80,243,159,129,149,153,147, 33,204, 39,212, +203,206, 31, 40,251,228,225,221,255,191,255, 98,111,221, 0,155, 99,160,201,234,191, 63,127,129,166,127,127,254,248,254,237,219, +183, 47, 95,190,124,254,244, 17, 24,247,159, 62,127,249,241,229,203,247,239, 88,138,240,207, 95, 24,191,255,248, 11, 68, 95,191, +253,254,252,229,231,251,207, 63, 63,124,250,245,241,243,239, 15, 31, 64,228,187,183,127,222,189,255,243,238,227,159, 55,239,126, +189,124,131,101, 4,137, 9, 88, 28, 0,179,214, 95, 70, 70, 38, 96,153,255, 31,228,142,255,204,127,255, 65,195,243, 31, 56,187, + 16, 51,255,171,105,169,121,116,219,209,157,251,118, 66,234, 3, 96,111, 0,143, 98, 96, 18,103,129,133, 97, 23,120, 21,102, 69, + 69, 5,228,148,121,228,101,145,196, 52,255,197,197, 81,102, 69,178,179,179,183, 30, 58,244,140,136,197, 60, 88, 1,176,249,143, +191, 10, 1, 54,243, 33,140,149, 43, 87,222,121, 1, 90,202,181,229,192, 1,184,224,205,155, 55, 69, 69, 69,105,148, 7, 32,165, + 60,242, 21,137, 16, 54,158,241, 31, 80, 69,203,199,251,239,239,223, 79,239,222,191,121,243,230,237,135,247, 95,191,125, 3,162, +207, 95,190,124,253,248,233,243,135, 15,192, 84,246,235,199, 15, 96, 53,128, 75, 59,114, 41, 15, 47,253, 33,108,228, 21, 65,248, +193,151,215, 39,247,172, 70,100,221,111,239, 46,208,186,188,120, 30,174, 0, 44,247,129,165,255,207,131,107, 30, 38, 26, 2, 75, +255,195,174,162,127, 62,190, 54,217,241,138, 5, 71,244, 2, 91, 18,169,249,153,119,110,222, 60,126,224, 48, 63, 47,127,100,120, +164,128,176,208,185, 83,103,120,216, 56,184,185,185, 37, 21,164,150,175, 88, 94, 81, 93,245,133,184, 50, 29, 2,140,140,136, 58, +205, 31, 88,190, 3, 11,122, 96, 75, 31,216,234, 55, 51, 51,211,214,214, 22, 17, 17,225,224,224, 0, 22,253,250,250,250, 2, 2, + 2,144, 85,161, 35,188,141,143,220,187,197,236,233, 2, 4, 16,162, 7,144,118,107,218,255,215, 15,126,176,114,236,121,197, 5, +140,107,133, 15,207,153,215,181,108, 79,111,238,214, 82,145, 20,228,200,213,224,100,152,122,254,255,239, 95,143,153,193,227, 6, + 88,202, 25, 30, 96,138, 5, 82, 23, 47,109,214, 55,240,173,171, 89,180,113, 93,223,174,253,215, 29, 45,181, 89, 88,216,119, 31, + 62,247,159,153,229,215,223,191,248,221,234, 97,168,177,227,236, 13,134,222,142, 16, 95, 47, 31, 31,223,157,251,214, 3, 27,232, +222,238,145, 76,127,127,179, 50, 99, 47, 78,129, 69,255, 95, 80, 73,251,151, 5,216,210,255,207, 2,108, 2, 0, 27,194,160, 37, + 1,192,134, 56, 35,168,127, 0,233, 37, 96,233, 63,126,231,101, 98,126,207,198,206, 4,106, 53,255,253, 15,108,237,255,251, 15, +236, 61, 0, 59, 1, 12, 76, 28,255, 25,153,129,173,121,198,191, 76,140, 63,255,254,255,240,245, 63,159, 56,214, 1, 25,196, 89, +228,144,240, 96, 97,254,207, 4,170, 16,152,225,133, 33,168,110,192,221,252, 7,150,254,208, 86,234,130, 61, 64, 4,100, 0, 43, + 3, 6, 47,124, 65,244, 15, 60, 20,187,102,205, 26, 72,222, 83, 84, 84,132,120, 16,216, 44, 5,122,156, 96, 5, 0, 44,253, 33, +205,127, 69,234, 21,184,172,224,129, 35,111,123,156, 19,155, 86,186,186,189,189,189,192,102, 62,176,160, 7,246, 6, 2,192, 39, +227,171,171,171,195, 5, 31, 62,124, 40,194,206, 46, 1,235,145, 80,119, 14, 0, 8, 32, 87,178, 32, 95,123, 75,240,210,218,247, +111, 62, 50, 50,252, 1,181, 40, 94,126, 99,227,224, 0,109, 42, 4,247, 0,190,127,249,242,243,235, 87,208,132,211,135, 15, 30, +184,239,158,133,148,242,144, 81, 32,115, 35,189,147,231, 46,193,165,208,166, 4,112, 54,111, 95,159, 60,121, 96,189,179, 87, 4, +180, 50,248,120,251,230,165,163,100, 52,252,137, 31,255, 1,245,213,222,125,125,148, 98,250,255,254, 37,177,217,231,190,254,249, +255, 41, 90,145,127,217,253, 79,137,194,192,210,159, 9,119, 5,159,157,147, 83,219,209, 34, 38, 44,242,251,223,223,219,143,239, + 69, 71, 70, 45, 90,178,100,227,134, 77, 81,209, 81, 63,127,252, 60,124,230,216,247,239, 95,210, 18, 18,246, 30, 63,142,185,142, + 3, 24, 35,119,238,220,113, 3,119, 16,145,251, 1,111,223,190, 45, 45, 45,133, 79, 12, 96, 5,194,194,194,207,158, 61, 19, 20, + 20,156, 49, 99,134,169,169,169,161,161, 33, 27, 27, 27, 48,239,159, 56,113,194,194,194, 2,168, 0, 40, 43,140, 99,238,112,196, +214, 1,104, 0, 32,128, 16, 21,192, 44,181, 44,135,175, 51,111, 61,121,255,220, 23,220,232, 56, 89,241,127,203,116,169,151,247, +251,237,131, 24, 62,188, 99,104, 91,240,255,233,141,191,156,220, 31,222,129,186,239,140, 24, 91,171, 14, 30,216,104,239,224, 12, +100,124,253,247,251,206,135, 71,192, 18, 89,133, 79,209,209, 81, 79, 92, 68,226,237,199, 79,160, 14,194,175, 63,207, 63,124,213, +196,230, 8, 25, 57,203, 39,143,142,131,211, 44,139, 7,104, 37, 40,203,142,203,191,119,110, 89,243,242,205, 51, 97, 1, 80, 23, + 79,128,141, 85, 82, 0,251, 18,210, 95, 12, 44,108,160,150, 24, 51,176,209,205,244, 23,216, 71,249,243,151,149, 5, 82,250, 51, +128, 23,137,130,182, 8, 96, 3, 1, 17, 21, 27, 22,151,112,177,253,103, 97,133,245, 36,126, 51,252,249,207,240,227, 23,195,223, +159,192,134, 61, 35, 35, 27, 35,208,220,175, 63, 25,146, 19,186,208,182, 86,195,103,128,255, 49, 1,235, 13,208,248, 15,164, 13, + 14,236, 1, 48, 49,131,170, 35,160,236,127,102, 96,183, 0, 95, 39, 0, 94,250,163,177, 65,117, 0,174,225,166,191,127,129, 69, + 15,176,248,134, 84, 0,107,192, 0,200, 85, 86, 86, 6,218, 62,113,226, 68, 96,135,224,221, 59,124,187,129, 74,192, 96,199,142, + 29, 95, 95,162,156, 88, 0,172, 15,238,223,191,207,128,119, 83, 24,230,206, 47, 96,209, 15,172, 78,128, 65,231, 99,111, 47,141, +123,254, 0, 88,178, 91,233,233,189,125,240, 0, 88,202,223,130,173, 5, 82,149,148, 44, 42, 42, 58,122,244,168,154,154,154,142, +180, 52,158,105, 15,228,113,127,226,231, 0,144, 39, 3,202,203, 65,139, 62,239,221,131,182,253,225,219, 2,240, 44, 4,226,145, + 22,251,254,252, 5, 48,101,125, 5, 54, 50,223,188, 6, 38,174,255,255,255,253,248,241,227, 63, 24,220,191,118,253,247,175,159, +120,150, 0,161,244,110, 29,237,129, 8,190, 36,148,152, 33,160, 47,111, 78, 1, 75,127,144, 51,184,185, 55, 34,117, 2, 76,108, + 3,105, 90, 82,152,108,127,117,198,147,193,192,216,229, 85,182,149,196,180, 99,192,250, 64,144,141,241,237,187,247, 44,140,140, + 44,120,199, 8,227,226,226,224,236,205,155, 55,123,121,123,110,217,180,101,213,170, 85, 13,213,181,187, 14,236,101,102, 97,150, +150,145, 6, 6, 36, 3, 27,150,133,124, 42, 42, 42,152,213,192,238,221,187, 25, 8,109, 1, 3,182,244,239,221,187,167,165,165, + 85, 80, 80,176, 98,197, 10,126,126,254, 27, 55,110, 32,143, 13, 0,101, 21,200, 29,112, 27, 33, 0, 32,128, 80,230, 0, 14, 24, +166, 51,192, 86, 54,111,121, 37,224, 35,202,248,255,204,182,255,199, 55,129,234,126, 14,142, 31, 92,188,187, 5, 28, 94, 88,186, +128,199, 34,208, 55, 4,222,188,245,235,200,137, 54, 80,153,200,204, 1, 25,174,184,243,233,121, 93, 78,210,183,111, 63, 63,125, + 7,205, 1,252, 98, 98,119,242, 8,193,234,136,218,234,132, 29, 91,193,219,106,254, 66, 6, 91,254,120,232, 50, 70,100,245,113, +113,177,243,129,231, 0, 88,255,253,144, 22,197, 94,190,176,252,255,243,139, 17, 84, 7, 0,139,138,191,192, 60, 10,204,169,127, +192,115,182,140, 76,192,238,192, 31, 72, 69,133,163, 14,248,240, 93,224,251,207,183,108, 44, 32, 69, 64, 21,127,128,213,199,239, +255,191,255,252,255,242,253, 31,168,249,207,192,248,251, 31,116, 48, 7,189, 32, 6,141,238,255, 5,194,255,192, 98, 1, 60,254, +195,200,128,110, 5, 68, 91, 94,161, 35,174,115, 57,174, 31,191, 78,106,108, 1,211,244,247,239,223,117,117,117,149,148,148, 30, + 60,120,176, 10,188, 75, 22, 82, 25, 64, 64, 71, 71, 7,193, 58, 0, 8,176, 78,175, 5,199,199, 51, 16,177, 41, 12,178, 53, 23, + 25,248, 58, 56, 16,156, 61,150,128, 53,196,144,123, 3,192,134,191,137,186, 58,219,215,175,248,189, 76, 73,250, 70, 46,229,145, +119, 81, 48, 16,177, 79,152, 83, 82,226,219,237, 59,127,255,252,249,244,254, 3,184,119, 5,138,226,247, 47, 95,125,122,255, 30, +232, 42, 60,205,127,180,201,128, 37,107, 55, 35, 47,253, 68,158, 30,192, 14,190, 93, 60,177, 31,178,158,130, 97,227,106,208, 2, + 80, 35,251, 8, 33, 49, 3, 90,150, 3,255, 81,234, 0,134,217, 6, 25,117, 47,254,253,211, 95,112,234,148,135,184,246,150,151, +192,210,159,151,149,216,131, 35,129,145,187,239,192, 62, 39, 87,231, 77,107, 55, 52,119,118,148,127,252,248,255,223,191,149, 43, +215,138,136,136, 60,250,132, 83, 23, 90, 53,192, 64,104, 11, 24, 16, 88, 90, 90, 2,219,248,231,206,157, 51, 50, 50,114,118,118, +222,191,127,191,156,156, 28,176,133,100,111,111, 15,140, 32,160, 56, 43, 43,235, 8, 95, 2, 4,217, 7, 0,239, 1,160,113,129, + 0, 32,128,112,238, 4, 6,246, 3,230, 94,222,163,243,247,170, 4,235,199, 31,255, 89,110,255, 23, 96,126,253,233,133, 5,116, + 27, 33, 19,182, 1, 25, 81, 33, 67,175,132,184,191,255,225, 77,245,255, 95,190,126, 98,102,225,103, 96,226, 42,235, 33,176, 83, +201,195, 91,103,195,212, 10, 6,166,111,240,130,148,135,135,255,239,239,247, 12,255,191, 62, 60, 54,203, 68, 79, 14,231,224, 50, +176,145, 13,206,154,127, 24,152,217,254,131,171, 1,112,233, 15,106, 46, 51, 64, 9, 92, 32, 33,173,102,214,228,134, 63,191,223, +177,128, 23, 57,131,250,248,127,254,255,248,205,240,233, 51,176, 51,240,255,207,127, 38, 22, 86,198,214, 38, 44,139, 91, 82, 82, + 64,195,199, 11, 23,220, 97,252, 13,106,254,131,186, 25, 32, 10,220, 74,250,207,204, 8,154,139, 98, 41, 46,113,195, 99,117, 74, +115,202,131,187, 15,200,136, 81, 96,250,126, 15, 94, 63, 99,108,108,108,102,102,246,250,245,235,187,119,239,130, 22, 38,254,251, +183,118,237, 90,130,117, 64, 78,124, 60,167,152,152, 15,182,225,154, 28,112, 5,192,137,187, 40,135,100, 72, 52,189,210,226,226, + 36,185, 31,216, 27,176, 6,247, 6,196, 56, 57,117,172,172,104,154,250,209,202,119, 96,136,161,205, 6, 19,172, 3,132, 85, 85, + 62,191,127,207,194,206,246,243,231,143,191,191,255, 0, 3,153, 87, 80,240,227,187,119,192,210, 31,127,243, 31,190, 17, 12, 50, + 1,112,242,220, 37, 96, 5, 0, 31,253,199,181, 47, 76, 77,242,253,155,183,111, 86,173, 94, 14, 23, 9,139, 78,126,247,139,180, +117,159,152, 99, 62, 24, 34,140, 4,251, 1, 12,219,161, 7, 57,168,108,132,238,189,255,248,251, 47,241,110,112,114,112,186, 40, +120,209,205,219, 35, 53, 54, 89, 79, 95,119,211,198,205,199, 47,156, 77, 75, 75,123, 68,232,144, 50,120, 53,208, 13, 6, 4,119, + 56, 2,107, 11, 96,143, 97,203,150, 45,192, 38, 17,176,223, 0, 89, 11,119,245,234, 85, 96,219, 31, 88,250,195,235,146, 17, 14, +208, 54, 3, 35, 3,128, 0,194,119, 20,196, 63, 93,151, 75, 12, 46,151, 72,177, 73, 71,199,122,210,164, 69,121,249,145,210,242, +192, 84,251,147,149,157,227,201,243, 79,246,190,113,196,232, 53, 52, 84, 74, 72, 8, 91, 48,111, 29,195,191,135,192,150,253,159, + 31,223,165, 37,249,229,248,254, 16,208,246,247, 31, 11,211,191,223,140, 44,172,255,255, 64,171, 1, 32,241,255, 47,145,203, 90, +210,114, 65, 67, 10,245,149,153,172, 44,140,144,115,131,254,254,253,251,225, 51,176, 38, 96, 96,102,249, 55,109, 42,190,244, 23, +159, 0,218, 28, 48,111,238, 77, 6,200,137, 52, 76,192,238, 2,104,204,167,168,196,135,160,189, 31,191,124,196,122,212, 15, 65, + 0, 44,131,128,157, 0,160, 35, 63,125,250,196,204,204, 12,100, 72, 72, 72,252,254,253, 27, 57,171, 0,235, 0, 92,103, 66, 64, +154,234,130,100, 45,247, 20,130, 4, 41,137, 37, 62, 38, 16, 39,113, 88,150,236, 57, 0,180,146, 29,235, 90, 32,130,219,193, 20, +204, 76,129,228,141,131, 7,127,124,251,254,239,239, 95, 77, 99, 99, 93, 43, 59, 30,105,188, 1,248,159,241,225,253,187,160, 25, + 23, 6,134,164, 32,232,148, 14, 80, 4,153,141,117,139,200,173,231,192, 36, 33, 24, 30,157,242,240,241,139, 19,135,182, 0, 69, + 86, 45,157,107,110,231,195, 43,110, 67, 76, 64,133,129,246, 97, 16, 62,233,225, 47, 35,246, 77, 8,143, 2, 37,182, 63,251, 65, +173, 66, 71, 31, 12,206,156, 57,179,247,196, 65, 97, 17, 97,146, 14, 41,129, 84, 3,196,168,228,229,229, 13, 14, 14, 62,126,252, + 56,176, 25,116,234,212,169,209,179,128, 48, 71,255,209, 74,127,180,249, 0,128, 0,162,254,165,240,202, 26,166, 91,119,222, 9, +240,230, 18,147,150,125,247,249,143,189,119, 44,241,122, 45, 77, 53, 44, 77,171,210,211,235, 24, 24, 94, 10,242,178,200, 9,253, + 35, 60,106,153, 88, 66,185,155, 27,219,167, 3,201,252,130,156, 95,223,127,255, 3, 47,181,236,159,218, 79,164,222,164,100,208, + 73, 65,243,230,220,248,247,159,185,178,194,159, 14,145, 10, 58,242,232,231,207, 95,191,126, 65,138, 69, 72,129, 56, 92,207, 7, + 37,120,194, 4,241,128,152, 83, 63,113, 1, 13,123,123,226, 21, 63,191,119,211, 92, 85,134,108,187,222,254, 82,225, 17, 87,113, + 9,181, 33, 85, 35,174, 83,222,144, 0,211, 31, 70,246,239, 76,216,231,255,239,126,254,163,198,139,167, 64, 32,103,161,176,137, +137, 9, 29, 18,137, 37, 24,140, 22,247,184,234, 0, 60,178, 0, 1, 52,122, 41,252,144, 4,163,183,186,143,130, 81, 48, 10, 40, + 7, 0, 1, 52,122, 35,216,144, 4,163,165,255, 40, 24, 5,163,128,114, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, + 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64, 52, +185, 20,126, 84,239,168,222,193,169, 23,114, 26,196,104, 88,141,234, 29, 81,122,241, 0,128, 0, 98, 65,203, 30,196,232,193,154, +133, 40,209, 59, 10, 72, 5,184, 10,178, 81, 64,106, 40, 17, 25,146,143, 30, 61,122,250,244, 41, 59, 59,187,136,136,136,156,156, + 28,221,188, 0, 63,243,117, 48,231,160, 87,175, 94, 61,125,250, 20,191, 26,105,105,105, 49,108,187, 79, 40,209, 59, 10, 40, 7, + 0, 1,132,190,236,151,224,206,123, 60, 27,172,208,244, 98, 30, 77, 76,211, 51,135,233, 95,184,224, 87, 80, 80, 80,160,169,169, +137, 95,187, 52,234, 25, 56,200, 57, 33, 52, 52,212,197,197, 5,143, 94,170,212, 1,238,238,238, 64,114,231,206,157,116,208,251, +245,235,215,181,107,215, 66, 46,133, 15, 14, 14, 54,196,125,159, 34,166,103, 9, 94, 10, 63, 99,198, 12,172,173, 13,252,161, 68, + 76, 24, 2, 75,168,159, 63,127, 2,173,224,224,224,248,241,227, 7,176, 38, 56,125,250,180,190,190,190,138,138, 10, 46, 45,214, +214,214, 4,253,245,252,249,115,200,181, 39,248, 1,176,244,135, 28,247, 77, 76, 88, 17,179, 23, 36, 44, 44, 12,127,186,130, 0, +121,121,121, 6,240,121,203, 64,191, 67,226, 14, 79,154, 4,166,219,162,162, 34, 60,150,190,127,255,222,220,220, 28,107, 80, 3, +245,106,105,105,225,209,251,242,229,203,218,218,218,209,230, 14, 37, 0,207,165,240, 0, 1,196, 50,108, 60, 73,255, 70,241,198, + 25, 30,184,164, 2, 50,119, 16,212,190,127,255,126,120,246,248,246,237, 27, 23, 23,215,235,215,175, 9,214, 46,123,246,236, 65, +102, 35,103, 72, 32,119,245,234,213,196, 7,194,229,203,151, 33,133, 56,154, 57, 36,129,140,140,140,236,236,108, 98,174,126,133, +220, 4, 25, 23, 23, 7,244,111,111,111,175,130,130,130,160, 32,225,189,208,192,146,119,251,246,237, 16,182,135,135,199,142, 29, + 59,176,178,241,244, 56,225, 9, 3,200, 48, 54, 54,158, 53,107, 22,164,160, 36, 38,193,124,252,248,145, 23, 12,128,165, 63, 39, + 39, 39,176, 50,248,240,225, 3, 63, 63,255,169, 83,167, 24,192, 27, 86,113,105,212,209,209, 1, 22,151,240,130, 27,185, 21, 15, + 44,208,129,228,137, 19, 39,162,162,162,136, 9, 97, 34, 75,127, 8,152, 48, 97, 2,229, 9,155,155,155,251,218,181,107,172,172, +172,191,126,253, 2, 6,242,237,219,183, 43, 43, 43, 9,234,122,137,116,188,160,173,173,237,225,195,135,225,220, 55,111,222, 16, +169, 17, 19, 60,128, 29,162, 55, 10, 40, 47,253, 25, 48, 46,133, 7, 8,192,222, 25,219, 48, 8, 3, 81, 52,146,171,204, 16, 15, +225, 34, 61,131,120, 10,247, 46,211, 51,144,229, 13, 34,121, 28,183,121,242, 33, 11,129, 2, 7,105, 40,242, 43, 64, 50, 58,225, +227,223, 63, 23,247, 47, 90, 0, 74, 41, 74,133,120,157,131,145,199,243, 53,137,154,119, 84, 46, 17,234, 23,121, 53,142,163, 70, +199, 45,124,225, 33,238,148, 18, 44,185,152,116,166, 65, 55,133, 23,111,200,163, 64,251,231,156,187, 41,252,238,151, 71,251,203, +204, 72, 49,133,167, 6,104, 90,129,223, 77,225, 9, 12,210,159,155,194,147, 39,176,243,110,192,236, 14,188,127,107,102, 9,104, +127,154,140,123, 51,133,175,181, 26, 99,120,213, 70, 1, 16,150,239, 26, 95,110, 79,128,133, 68,171,111, 2, 64, 8, 65, 46,122, + 70,173,159,124, 3,194, 31,178,142, 49, 82, 3, 72,140, 97, 24,148,236, 63, 7,236,239,189,159,215, 0,105, 35, 54, 18,233,244, +230, 58,231,104,163, 41, 87, 50,203, 86, 96,173, 37,193,248, 41,200,207, 63,251, 79,172,210,124,225,215,166,240, 31, 1,216, 59, +155, 19, 6, 97, 56,138, 11,210, 13,114,235, 16, 30, 29,160,189,101,129,220, 29, 35,251,184, 71,134,201, 49,217, 64,232,207,252, +105, 16, 81, 19,219, 82, 40,244, 29,130, 40,228,160,201,251,240,144,247, 73, 1, 96,155, 21,239, 84,130,205,134,181, 60,171, 1, + 44,187,223,250, 57,158,217,255, 20,157, 9,133,193,218,114,120,250,242, 52,208,122, 96,255,155,185, 20,229, 46,165,240,140, 53, + 46,126,133, 91, 2, 83, 49, 3, 99,113, 6, 40, 21,215,255, 90, 20,120, 7,155,165,240,197,208,195,215, 65, 0,134, 97, 32, 7, +132, 16, 46,207, 86,120, 46, 80,130, 24,227,113,114,130,253,179, 42,139, 0, 72, 14, 72, 77,100,181,121, 11,222,207,181,207, 95, + 88,216,216,109,231,156,214, 26, 37, 80, 74,113, 13,251, 35, 6,172,210,182,173,233, 55,154,217,223, 90, 43,155,113,149, 3,246, + 48,142,227, 65, 8,240,222, 27, 99,246,158, 78,211,116, 77,224,109, 75, 56,238,186,174,239,123, 49, 28,127,251,191,100,255,102, +171, 20,254, 33, 0,123,215,110,195, 48, 8, 68,163,140,132,216,129, 79,155, 53,178, 6, 27,100,141,136, 58, 29,107, 32,209,177, +131, 27, 40,242,146, 83, 40,130, 13, 1, 81,230, 10,203,182,140,125, 6,241,222,221, 67,226, 86, 18, 64, 45, 92,252,184, 50,188, +138, 3,180,214,163,121, 64,215,195,238,171, 46,215,199,253, 38, 38,126, 16,240,135,121, 85,123, 27, 99, 28,165,132,137,126, 46, + 69,225,129,218,136,149, 48, 3, 39, 8,128,140, 26,130, 3,142,250,138,212,255,211,167, 40,124,217, 59,158,138,194,211,205,198, + 64, 75, 41,203,122,146, 82,170,228, 4, 13,229,167,142, 66,234,162,240, 69, 11,218,181, 16,194,249,189,151, 56, 78,240, 69,239, + 61,109,190, 68, 69,225, 95,181,166,183,205, 90,219,128,242,130,254,200, 54,190,216,104, 72,213,193,195,228,240,104, 42, 48, 97, + 41, 37,198,152,115,142,115,142, 81, 35,145, 13,151, 66,136,156,115,183, 57, 16, 31, 71, 99,204,145, 22,180,220, 16,118, 32,161, + 4,167,162, 91,224, 57,198,136,208, 31,124, 0,183,255,208,223,181,167, 0,162,102, 5, 64,245, 73, 96, 50,234, 0, 96,115,146, +164,126, 0, 36,107, 45, 93,186, 20, 77,124,219,182,109, 64, 65, 34, 13, 57,113, 95,203, 66,241, 26,241, 35, 63,240, 6, 38,188, +169, 8, 76,190,144,194,136,212,210, 31, 94,135,145,212, 60,132, 52,255,209, 46,133, 39,175, 19, 0, 55, 1,207,165,240,240, 38, + 63,176, 76, 1, 54,102, 85, 85, 85,129,141,104,118,118,118,126,126,254,150,150, 22,130,253, 0,228,177,126, 92,243, 1,100, 84, +237,192,130, 24,174, 6,243, 68, 44, 96, 3,159,151,151, 23, 88,234, 29, 59,118, 12,216,248, 5,150, 44,223,145, 46,133, 7,221, + 59, 77,232, 82,120,204, 97, 31,120, 91, 30, 24,221,175, 72,188,125, 19, 24,191,144, 21, 65,100,244, 3, 8,142,252,192, 1, 48, + 34, 74, 75, 75, 33, 57, 14,104,221,237,219,183, 25, 64,199,244, 26, 2,235, 63, 98,214,225, 80, 82,214, 67, 42, 15, 50, 12, 4, +198, 35, 48,118, 44, 45, 45,225, 7,207, 1, 93, 11,236,187,140, 22,238, 12, 72,119, 2, 35, 15, 1, 33,167,118,128, 0, 26,236, +147,192,244,169, 3,128,234, 33,253, 86,120, 71,152,200,210, 31,216,252, 39,219,107,144,230, 63, 90,195,255,197,139, 23,180, 46, +253,225,205,127, 29, 29, 29, 8, 23,200,160,176, 19,128, 31,192, 71,255,185,185,185,107,107,107,129,165, 63, 68,220,192, 0,116, +201, 9,176,220,247,245,245, 61,114,228, 8,144,164,162,165,240, 48,129, 79, 0,160, 1, 96,179, 17,222, 3,192, 92, 55, 13, 44, + 83,128,117,192,143, 31, 63,128,181, 20,176,174,130, 92,183, 9,191, 20, 30,200,192, 95,250, 67, 42,117,204,177, 32,228,153, 97, + 82, 1,217, 26,137,159, 3, 0,214,199,222,222,222,192, 28,196,197,197,229,224,224, 0, 12, 1, 96,148, 1,107,232, 5, 11, 22, + 48, 49,209,118,211, 40,176,172,135, 15, 31, 65, 50, 32,241,213, 9,176, 65,243,232,209,163,240,240,112, 6,240,165,211,160,171, +199, 70, 1, 90, 63, 24,199,189,240, 0, 1,200, 59,131, 28,132, 65, 32,138,238, 61,141,186, 55,158,171, 27,238,194,198,112,136, + 90, 57, 66, 87,156,130, 21, 97,107,244,153, 73, 8,193, 90, 1, 99, 98,226, 95,145,118, 51,105, 50,111,102, 24,202,252,250,159, +192, 29,157, 0, 84,159,188, 39, 88,164,186,181,158,254,162,253,110,123,158, 46,167,105, 35,241,128,106,160,201, 84, 48, 52,142, +163,236,227,227,126,117,137,225, 45,125,156, 14,250, 75,250,255, 60, 20, 30, 27,228, 85,135,222, 14,133, 7, 34,178,192, 63,231, +249, 49,220,220, 24,147, 30,126,117, 40,124, 58,243, 83, 68,205,245,102, 59,233, 63,148,199, 66,239,189,244,234, 81,140, 49,132, + 0, 95,168, 6,168, 0,174,175,199, 13,229,176, 46,250,246,197,185,254,245, 40,146,155, 93,115,108,244, 67,105,173,225, 62,244, +119,206, 89,107,161,191, 82,138,216, 60, 12, 67, 77, 0, 56, 44,169, 41, 6,224,134,173,244,151, 77, 72,161, 63, 98,113,108,185, +187,251, 79, 68, 5,144, 58, 1,185,238, 2,104,144, 78, 2, 83, 82,250, 3,211, 16, 25,221,100,200, 88, 16,176, 43, 64,124,233, + 15, 44,238,129,165, 63,116,148, 99,221,250,181,224, 91,252,128,149, 1,131,147, 35, 3, 3,225,101,160,144, 85,137,144,177, 32, + 96, 19, 21,114, 9, 42,176, 8, 38, 34,249,130,138, 90,248,189,240,164,150,254,144,230, 63,214,198, 62,121,157, 0, 72,181,145, +147,147,131, 51,160,130,131,145, 47,133,143,137,137, 97,192,184, 20, 62, 54, 22,231,189, 17, 20,206, 1, 48,144,117, 41,188,176, +176,240,219,183,111,129,237,253,215,175, 95, 3,123, 0,240, 75,225,129,253, 54, 96,124, 1, 75,127, 96, 53,128, 54,184,143, 12, + 32,165, 60,100, 20, 8,237, 38, 50, 60,186,208, 74,127,200, 38, 0,100, 46, 25, 13,127,226,199,127,128,224,246,237,219,192,232, + 0,122,208,210,210, 18, 72, 2, 3, 13, 88,158,110,218,180,137,153,153,153,152, 10,128,146, 86, 60,178, 9, 36,233, 50, 6, 3, + 32,227,220,185,115, 64, 55,219,216,216, 0,147, 22,176,151,137,188, 96,122,196, 2,200, 42, 32,180, 73, 96,228, 85, 64, 0, 1, +216,187,130, 20,134, 65, 32,248, 1,159, 32,248, 12,207,130, 63,242,149,130, 79,240,228, 55,188,116,154,129,101, 91, 75,220,228, + 80,122,232,158, 36, 36, 16, 54, 58, 51,113, 71,246,119,139,192,223, 68,127,205, 1,151,180,255,199,241,147, 3,108, 19,151, 3, + 8, 46,125,100,172,214,186,125,118,237, 11, 79, 71,208,246,253,165, 41,252,170,161,104,164, 59,241,228,173, 39,191, 72, 39, 64, + 70,160,191,108, 40,173,129,239, 24, 66, 96,255,119, 16, 0,189, 64,250,162,110, 41,254,206,117,175,231, 0,236, 53, 0, 61, 9, +145,147,156, 51, 16, 65,239,152,157,231,202,123,223,123,103,231,181, 57, 39, 25, 72,154,194,179, 38,108, 52,243,228, 35, 68,191, + 91,118,114, 4,238,113,179, 94, 68,183,237,164,198,160,227,179,148, 2,249,159, 82, 2, 31, 56,231,198, 24, 70, 2, 16, 4,167, +144,186, 87, 18,184,170,253,185,142,144,177,214, 26, 6,128,254, 24, 35,242,134, 95,153,127, 29,120, 27, 15, 1,196,130,153,223, +200, 54, 11, 45,117, 34,183, 95,144,155, 69,180, 43,253,129,201,142,194,165,114, 36,105,127,252, 4,231,120, 61, 39, 39, 23, 65, +237, 88, 7,166,137, 4,192, 2, 5, 88,226,239,221,187, 23,126, 47, 60,124, 49, 40, 49,117, 24,214, 75,225, 33, 59,110, 8,110, + 10,195,172,212,115,115,115,241,148,254, 16, 32, 36, 36, 4, 25,226, 7,182,166,145, 27,254, 53, 53, 53,248,147, 28,133,251, 0, +144, 67, 3,109,171, 4,193,250, 30,216, 21,219,182,109,219,159, 63,127, 62,124,128, 92, 10, 15,114, 9,176, 67, 0,228, 2,217, +196, 55,228,129,246, 34, 47,253, 68,158, 30,192, 95,250, 51,144, 59,199, 67,121, 29, 80, 81, 81,113,240,224, 65, 96, 52,181,183, +183, 3, 91, 12,192, 14, 16,100, 75, 4,193, 33, 62, 50, 90,241,200,122, 73, 5,192,154,233,233,211,167,200,251, 0, 46, 94,188, + 8,236,186, 1, 91, 21, 68,174, 91, 29, 9, 0,109, 18, 24, 25, 0, 4, 16, 11,254, 66, 28, 87,223,150,214,128,140,210,159,206, +249,164,165,165, 5,255,254, 70,130,149, 37, 37, 67,186,144, 66, 19,178, 12, 31,200,128,236, 5,131,223, 11,143,167, 92,131, 92, +236, 14, 44,188,144,231, 0, 32,205,219,178,178, 50,252,165, 45, 86,189,164, 14, 25, 17,217,240,167, 86,151, 20, 57, 28, 48, 47, +133,199, 95, 7, 0,131,197,219,219, 27,216,146,101, 99, 99,251,249,243, 39,176, 14, 0,134,176,128,128, 0,176,192,194,115, 80, + 7,114, 62,130, 79,255, 2,237, 5,170,135,231, 29, 92,185, 12,146, 36,208,182, 13,147, 58,247,139, 57,230, 67,210, 40, 16,164, + 14,128,111,254,202,202,202,130, 48,128, 61, 33, 60, 90,158, 61,123,134,188,219,107,197,138, 21, 4, 79,248,193,165,151, 36,112, + 1, 12,208, 4,159,128,193,104,185,207,128,116, 39, 48,114,209,143,188, 10, 8, 32,128, 88,168, 88,190, 99,234,165, 79,109, 65, +255,210, 31, 8, 68,193,128,108,237, 74, 96, 64, 45,199,192,199,127,144,203, 62,172,151,125,146,125,228, 3,133,122,177,246, 6, +136, 4,100,207, 1,160, 37, 9,172, 93, 46,130,201, 6,216,173,188,123,247,238,254,253,251,191,127,255,254,247,239, 95, 3, 3, +131,176,176, 48,130,113,119,226,196, 9,120, 55, 2, 46,130,204,198,149, 42,224,141, 3, 72,205, 1,204, 65, 4, 43, 27, 56, 8, +163,236,254,100,178,115,144,180,180,116, 96, 96, 32,126, 53,205,205,205, 84,215, 59, 10, 72,170, 3, 48, 75,127, 32, 0, 8, 32, + 22,106,149,161,163,167, 53, 13, 56, 64,139, 2,226,143,132, 29, 66,158, 26, 16,163,148,193,128,120,245,192,254, 13,145,231,252, +224,105, 28,144, 81,221, 82,171,134, 38, 21,136,137,137,145, 29,182,148,232, 29, 5,196,215, 1,184,164, 0, 2,104,244, 82,248, + 81, 48, 10, 70,193, 40, 24,161, 0, 32,128, 70,111, 4, 27, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, + 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, + 10, 0, 2,136,134,151,194,143, 94,192, 61,170,119,136,234,221,236, 55,133,120,189,190,155,114,168,165,119,163, 47, 9,122,253, + 55,163,232,245,177, 1, 93, 47,202,200,200,248,251,247,239,251,247,239,255,250,245,139,133,133,229,201,147, 39,145,252, 10, 59, +207,156,249,174, 39,107, 97, 97,193,204,204, 12, 89, 68,187,229,200, 83,106,133, 21,196, 94, 56,128,236, 80,185,122,245,170,148, +148,212,187,119,239,128, 36, 39, 39, 39, 3,108, 67, 31,154,189, 88,245, 62,190,178, 36,221,246,209,178, 51,106, 44, 98,110, 60, +188,124,184,244,142,166,103,226,245,226, 1, 0, 1, 68,194, 81, 16,248, 55, 37, 82,241, 2,110,137, 19,215,238,188,122,206,201, +198,161,206,197,127,199, 78,135,110,149,225,144,184,128,123,176,129,155, 55,111,246,247,247,247, 86,129,216, 27, 14,131,206, 0, +192,163,248,193,147,199, 79,159, 60,185,121,227,198,251,247,239,229,229,229,121,120,121, 61, 92,221,240,155, 15, 57, 34, 9, 2, +112, 93, 94, 6, 20, 39, 62,166, 32,187,160,177,222, 33,140, 15,132,190, 3, 83,255, 65, 7, 49,173, 22, 34, 65,163,113, 63,131, + 82, 60, 56,121, 45, 96, 56, 91, 68,114,248,134,188, 65,216,187, 70, 4,143, 66, 96,233,249,245,235,215, 93,187,118, 1,147,113, + 40,171,176,132,172,232,143,175,223, 57,191,253,177, 46, 73,181,243, 13,223, 50,119,198,230,189,123,221,220,220,232,144, 36,254, +254,253, 11,116,131,190,190,190,154,154,218,185,115,231,126,252,248,161,170,170,138,121, 56, 60, 86,240,231,207,159,139,103,206, +203, 36, 27,150,153,105,159,216,213,179,246,178,131,170,142, 19,145,122, 71, 1, 25, 0, 32,128,136,170, 0,136, 57,210,135, 42, + 23,112,171,158,187, 43,248,246, 11, 35,195,255, 95,127,153,127,191,251,242,228,205,199, 7, 83,206,242, 56,154,139,104,107,224, +209,117,118,127,186, 6,116,149, 54,243,250, 93,255, 14,159,254,159, 22,193, 0, 20, 41,106, 37,173, 40, 39,233, 2,110, 92, 53, + 7,173,175,236, 96,128, 28, 99, 89,207,200,216,132, 69, 10,148, 79,234, 25,195,174,135,210,103, 73, 56,172,244,255, 15, 46,253, +237,142, 28, 57,130,167, 2,208,211,223,165,165,101,178,122, 53,223,201,227,160,109, 80,183,110,220, 4,146, 41,137,235, 62,126, +201,249,252, 1, 95, 53,239,234,234, 10,172, 6,128,165,252,190,125,251,176,158,148, 71,252,166,127,204,148,156,145,158, 62,131, +184,202, 3,249, 26,122, 18,128, 82, 60,226, 80, 54, 50, 42, 0,152,239,240,156, 60, 10, 1,119,239,222, 61,176,106, 85,147, 75, +152, 65,116, 22,155,184, 32, 3, 11, 19, 3, 3, 19,195,191,255, 12,255, 88,255,253,252,239, 21,159,246,104, 82,199,177, 99,199, +172,172,172,104, 93,152, 50, 49, 49, 25, 24, 24, 28, 56,112, 0, 88, 7,152,153,153,189,120,241,226,226,197,139,122,122,122,196, + 28, 51, 3,244,172,179,147,107,123,223,166,242,132,203, 22, 30,153, 22,230,123, 74, 38, 63, 81, 51,141,195,170, 23, 18,155,248, +171, 7,160, 44,201,149,253, 48, 2,104, 23, 2, 35,250, 94,176,213,255, 0, 1,196, 66,100,134, 49,136,211,205,180,206, 33,190, + 14, 32,227, 2,110,153,187, 47,141, 56, 5,217, 36,249,255, 50,252,231,252,192,245,226,245,235, 23,159, 63, 42,178,243,220,216, +121, 4, 24,189,162,184,235, 0, 96, 89,127,227, 46,211,255,255, 28,127, 25,217, 3, 92,127, 7,186,125,103, 96,248, 7,107, 55, +145,152, 91, 73, 44,187,225, 71, 54, 66, 14,162,218,122,131,245,199,239,223,233,137, 38, 4,171, 1,130,117, 42,190,253,159,245, +160,204, 0,185, 5, 9,171, 20, 49,224,246, 94,190,158, 85,145, 16,118,113,232,114, 53,151, 79,100,148,254,125,125,125,192,220, + 94,220, 6,189,248, 9, 79, 14,119,112,248,168,166, 6,108,122,111,182,181,157, 4, 23,140,138, 98, 0,223,225, 54,101,249, 42, +124,117, 0,164,244,135, 28,236, 21, 30, 30, 14, 57,245,136, 96,129,136,181,237, 15, 57, 48, 3,238,206,140, 12, 98, 75,127, 50, +129,113, 31, 3,236,162,118, 80, 5, 96,212,203,112,174,152, 70, 86, 1,107,199,233,129,105,138, 78,174, 12,204, 63, 25, 89,153, + 24, 89,152, 24,153, 89,255,255,103,252,247,245,207,255,191,127,129, 77,170,212,248,172,172,186,252,187,226,226, 36,109,106, 35, + 3, 0,243,130,164,164, 36, 48,156, 15, 30, 60,120,227,198, 13, 96,253,109,105,105,121,242,228, 73,109,109,109,130,122,143,236, + 93, 30,100,240,237,236,103,230,168,250, 47, 54,134, 19,115, 10,194,123,202, 63,148,247, 44, 85, 50,140,194, 83,184,195,139, 23, + 96, 20,163,137, 80,114, 30,229, 72, 0, 0, 1,196, 66, 76, 33,181,108,199, 82,101, 21,229,244,166, 84, 98,234, 0,242, 46,224, + 86,184,241, 76,157,141,155,237,255, 31,206,158,210, 63,223,126,113, 20,183,242,179,113,252, 96,253,254,245,199,119, 78, 6,198, +231, 7, 79,176,201, 72,242,243,243, 99,213,123,227, 46,195,172, 21,192, 18,255, 27, 24, 49,216,154, 50, 5,186, 49,194,234, 0, + 6, 96,111, 96,214, 10,162,194,130,212, 11,184, 33,165, 63,164,232, 7,249,253,200,239,239,191, 64, 23,252, 58,151,239,238,236, +116, 37,104,206,221,142,187,172,140,183,161,209,192,248,148, 81, 68, 3,198,126, 37,154,136,111,115, 60,176,237,143,124,153, 9, +138, 84,250,106,176, 20,190,230,255,155,203,146, 53, 83,252,255, 51,252,111, 47,216, 96,238,160,182,108,218,225,222,213, 81, 12, +171,255,215, 23, 77,147, 82, 39,182, 41,253,229, 97,186, 52, 7,195,183,183, 87,129,141, 47, 94, 49, 61, 72,233, 63,125,250,116, +172,138,121, 5,174,168,169, 1, 99,228, 24,176,159,112,242, 36, 3,248,206, 62, 16,128,239,240,143, 12,155, 50, 99, 78, 53,211, + 63, 89,172,218, 33,165, 63,176,237, 15, 44, 83,240,220, 59, 70,176, 41, 3, 41,253,145,234,131,244, 25, 51,176, 39, 75,166,176, +247,240,230, 3, 35, 24,255, 11, 69,149,101,132,140,202,128, 40,111,212, 62, 15, 83,248,123,200,128, 13, 16,252,251,151, 80, 80, + 80, 0, 17, 7, 50,128, 53, 1,147,106, 50,212, 96,176, 26, 52,189, 44,225,232,246, 34,223,195, 8,146,197,109,239,143, 31, 63, + 36,228, 21, 24,254,253, 98, 98,103, 96,100, 97,254,243,249,227,143,123,247, 95, 63,121, 42, 99,229,192,200, 38,192,248,251, 23, + 3, 51, 83,103,102,137,235,172,134,162,162, 34,178,203, 11, 92, 71,140,192, 75,100, 96,122,248,254,253,187,144,144, 16,176,125, + 0, 12,237,251,247,239, 47, 88,176, 64, 83, 83,243,195,135, 15, 4, 59, 88, 64,189,242, 76, 39, 37,229, 60, 62, 28,188,252,241, + 61,251,226, 45,127,182,157, 88,146, 23,202,201,242, 13, 24,107, 81,216,251,187,163, 0, 47,192,140, 44,180, 62, 1, 64, 0,177, +224, 47,250,129, 65,236, 88,101, 63,235,224,204, 52,134,244, 11,139, 46, 51, 88, 19,182, 18, 82,238,127,251,182, 20, 24,167, 63, +126,204, 19, 18,218, 67,204, 5,220, 98,207,223,137,137,115,112,212,103,253,125,243,238,207,179, 55, 44,108,172, 92,140,204,220, + 64,196,204, 34,196,202,241,254,243,135,231,251,142,241, 7,122, 98,213,139, 86,190, 31, 62,253, 15, 92, 1, 48,244, 85, 51,254, +103,100, 96,252, 79,108, 87,128,212, 11,184,145, 75,127, 6, 22,230,123,207, 65,185,247,209,203, 31,114,226, 28,170, 9,155, 59, + 59,125,241, 27, 2, 44,253,129,229, 62, 51,227,155,191,255, 69,216,197, 24,185, 35,158,253,251,247,238,199,143,213,127,207,148, + 81,210, 83, 33, 88,123, 85, 79,241,179, 20,170,153,178, 33,153,135, 73, 14,200,205,202, 85,215, 55, 83, 90, 58,245, 96, 99, 95, +246,204,153,196,118,150,129, 69, 80,122,225, 21, 72,190,181,177,177, 1, 86, 0,184, 74,127, 80,141,232,240,150,129,225, 18, 3, +195,149, 15, 47,121, 84,229, 24,102,207,254,178,127, 63,131,170, 42,208,169,160,104, 2, 10,130,186,152,186,215, 47, 93,148,197, + 90,250, 3,219,182,255,192,128, 1,124,159, 12,169, 5, 22,156,141, 92,250, 51,128,166, 1,112,198, 14,176, 91, 0, 41,195,177, +214,178,255, 96,229, 14,176,177, 3, 12,135,205,135, 80, 38,220,166,207,152, 9,233, 95, 40, 40, 40, 0,179,207,196,137, 19, 33, +226, 64, 6,176, 2,216,185,115, 39,252,220, 74, 6, 12,189,144,238, 8, 80, 87,106,106, 42,150,241,113, 88,167,103,214,236,217, + 64,123,183, 28,126,138, 86, 26,178,240,242, 50,176, 50,255,253,246,225,250,182,189, 75, 87,173,153,246, 12,100,209,169, 70, 62, + 85, 59,175,159,143, 30, 95,189,120,246,242,253, 91, 31, 95,188,184,114, 5, 24,113, 18,100,148, 38,152,199,174, 97,150,224,207, +158, 61,171,173,173,237,233,233,249,245,235, 23, 51, 51, 51, 47, 47,239,215,175, 95, 79,157, 58,133, 63, 89, 66,244,126,120,114, +180,113,254,163,185, 5, 82,239,190,178,177,177, 48,201, 8,114,188,120,243, 43,189,235,143,190,137,177, 28,238, 94, 29,164, 26, +128, 71, 52, 38, 99, 20,160,149,254,200,181, 2, 64, 0, 49,225,202, 51,144,115,207, 17,189,117,143,104, 98, 44,128,220, 0,243, +237,219, 50, 72,233,207,113,250,193,183,157, 42, 12,132,110,134, 97, 57,112,150,255,221,231,127,108, 44,191,206, 94,253,121,253, +222,143, 93,135, 25,190,255,100,251,255,159,139,129,153,133,129,241,231,191, 63,239,126,254,152,182,123, 11, 46,237,125,213,160, +102, 62, 98,136, 60, 2,214,190, 98,248,127,243,206,255,162, 86, 18,154, 9,144, 11,184, 33,129,128,255,180, 78,160, 44,242,165, + 34,145, 19,158,236, 61,251, 30, 88,250, 67,234,128,219, 79,190, 51,184,172,194,111, 2,176,244, 7, 85, 3,159, 47,115,115,223, + 97,231,248, 12, 44,253,127,255, 62,203,204,172,244,235,235, 91,218,165,128,187,231,191, 0, 67, 6, 94,250, 63,191,249,223,200, +151, 57,183,197,213,198, 21,216, 61,255, 15,150, 37, 12,150, 45, 91, 86,220,198,200, 35,170, 11, 12, 89,143,192,204, 35, 71,142, +224, 81,252,143,233,177,152, 24,180,244,255,252, 22,116, 74,182,190, 62,168,244,143,139,131,150,254,159,223,114, 2,145, 16,215, +115,172,218, 67, 66, 66, 28, 29, 29,157,156,156,194,195,195,153, 81, 1, 92, 4,191,107,209, 82, 50,177, 53, 28, 82,217, 4, 1, +152, 92, 70,108, 77, 11,184, 70, 55, 55, 55,180,182, 54,176, 19, 0, 57,182, 15,230, 50,116,189, 27,102,206, 4,150,206, 16,195, +225,222,132, 15,142,195,185, 88,237, 5,230, 23, 38, 46,246,223, 47, 30,206,172,169, 89,240,245,195,123,123, 11,136,248,220, 37, + 11, 26, 74, 82,212,138, 34,155, 46,239, 91,245,254,190,171,159, 31,145, 29, 92, 96,113, 15,204, 5,231,207,159, 71,170, 50,103, + 96, 29,229,131, 4,200,229,203,151, 15, 30, 60, 24, 25, 25, 9,236,165,125,249,242, 5,114,128, 54,176, 95,194,195,195, 19, 22, + 22,102,109,109,141,171,232, 7,233, 61,190,246,214,206,162,162,202,222,205,245, 82,215,159,178,124,252,194,252,143,145,225,237, +151, 95,255,133,149, 11,171, 90,125, 2, 98,112, 86,213,192,106, 28,156, 97,103,130, 1, 86,198, 40,192, 85,250, 3, 1, 64, 0, +177, 96, 45,250,201,232, 24,162,137, 0, 75,127,180,110, 1,158, 11,184, 89,222,126,120,247,159,149,237,237, 59,142, 13,251, 24, + 89,152, 24,126,252,250,255,249, 43,227,159, 63,172, 12, 12,127,255,255,251,241,247,207,231, 63,191, 24,254,225, 28,243,133, 76, +246,246, 85, 99, 73, 93,224,201, 97,146,189, 67,204, 5,220, 40,205,127, 6,134,229, 57,146,112,182, 73,197, 61,214,255,111,126, + 51,138, 16,188,194,155,227,203,126,161,166, 37,175,139, 51,222,188,227,148,250,125,245,239, 95, 80,133,241,240,130, 4,237, 18, + 65,215,140,226, 20,183,153,240,210, 31, 34,104, 33, 88, 99,165, 29, 98, 41,116, 21, 40, 75, 48,207, 44, 93,186,244,208,161, 67, +111,223, 58, 11, 11,239,229, 17,209, 1,166, 22, 38, 38, 38, 60,243,108,143, 30, 1, 43,203, 43,144,113, 35,160,135,223,125,101, + 48, 51, 3, 79, 66,220,102,152, 58,149,225,243, 39,134,175, 95, 24,190,124,101,224, 22,196, 55, 9,129, 57,226,127,247,238, 93, + 32,217,214,214, 6, 36,213,212,212,200, 27,205,128, 71, 55, 30,101,249,249,249,240, 86, 60,114, 81,142,223,112, 69, 69, 69,248, +232, 63, 28, 64, 58, 1, 64, 41, 68, 39, 0, 21, 36, 75,171,221,186,122,237,169,160, 32, 48, 72,243,242,242, 38, 77,154, 68,188, +189,182, 63, 5,254,255,251,146,210, 86,173, 27, 18, 50,179,173, 13,126,127,203,204,219, 87,160, 61,227,195,135,119,239,222, 13, +180, 26,156,193,191, 17, 44,253, 33, 93, 58, 96,224, 0, 91,217, 6, 6, 6,192,154, 0,168, 49, 51, 51,243,241,103, 44, 85,236, +147, 39, 79,252,253,253,129, 94,219,182,109, 27,228,202, 76, 6,240,146, 30, 6,240, 61, 66,120,230,105,129,226,247,110, 94,104, + 40, 75, 18, 86, 93,125,126,117,252,165,199,140,143, 94,178, 48,252,103,250,249,235,247,187,255,194,217,201, 89,228, 45, 1,162, +228, 94,147, 17, 5, 0, 2, 8,203, 16, 16,176, 26, 71,230,126,120,250,158,152, 18, 19,222, 3, 0, 15, 1,129, 34, 12,216,252, +103,191,242,244,175, 0,168,209,135,255, 2,238,107, 79, 30,125, 99,231, 84,250,243, 71,134,147,135,139,149,141,241,247,111, 96, + 55, 27,216,225,253,252,247,215,183,191,127,126,254, 7,230,254,255,255, 9,197, 40,176, 26,128,212, 1,224, 41, 1,104,185,223, + 87,205,220, 91,205, 88,220,250,135,212,112, 33,166,149, 84,190, 26, 20, 50,157,161,130,144, 66, 31, 58,176,243,255, 13,176,222, + 98,249,255,126, 81,138, 96, 36,222, 59,233, 88, 95,158,254,203, 0, 26,253,232, 97,225,143,124,249,240, 76,151, 12,183,132,230, +199,167, 79, 95, 60,120, 70,211, 40,215, 55, 83,250, 10,142,210,111,156,215,184,190,107,173,107,252, 13, 17,183,118,209, 62,190, +138,112,219, 63,208,238,208,134, 13, 46, 2,199,247,244, 87, 51, 20,182,254,183,179,179,195,191,244, 83, 65, 70, 22,121,210,113, +203, 22,208,220,239,178,101,192, 78,192,255, 9, 19, 24,155,154,190,128, 42, 6, 6, 6, 85,117,193,226, 66,124, 86, 67, 26,191, +192, 14,193,202,149, 43,225,237, 98, 15, 15, 15,204, 82,146,248,106,158,160, 26, 96,137, 9, 44,178, 49, 43,128,190,190, 62,228, +245,169,152,192,197,197, 5,126, 21, 59, 50, 0, 10,246,247,247,227,234, 16, 31,186,246,168,170,169, 36,185,190,172,242,215, 47, +160,165,152, 94, 3,218,187,103,207, 30,172,101,162,157,150,220,188,185, 83,141,163,162, 26, 27, 27,177,214, 19, 64, 65,160,246, +217,179,103, 19, 19, 56,192,210, 31, 50,197, 10,172, 38,103,192, 0, 80, 4, 88, 19, 60,198,182,198,252,247,239,223, 91,182,108, +113,118,118,190,125,251,246,215,175, 95,129, 92, 96, 13,244,235,215, 47,200,181, 57,248, 75,240,159, 63,127,158, 93, 27,101, 23, +212,180,243,224,221,251,207,153, 63,125,101, 2,118,252,159,126,229,204,171,168, 38,168, 23, 50,181,131,127, 44,104, 20,224,106, +254, 3, 1, 64, 0, 49,161,101, 9, 32,112, 0,131,139, 48,112,239,244,195,143,223, 63, 10,155, 17,181,246, 25, 82,202,115,113, + 69, 3, 75,127,214,135,111,129,165, 54, 91,242, 91, 6, 66, 23,112,179,178, 49,255,253,207,240,228,235,135, 71, 31,223,189,254, +244,254,227,143, 31,239,127,125,127,253,243,251,243, 31,223,158,254,248,242,238,247,207,247,255,126,255, 66, 29,192, 69,105,251, +152, 98,159, 18, 72, 9,231,249, 15,236, 25, 51,176, 17,227,114, 50, 46,224,126,244,242,199,222,179,239,225, 69, 63,164,244,103, +255,247, 16,136, 26,220, 89, 30, 1,155,190,120,193,218,251,255, 68,123,161, 13,231,251, 95,255, 62,185,251,244,230,209,171, 47, + 30,124,160,117, 82, 88, 54, 13, 84,193,127,122,245, 31, 88,250, 59, 36,179, 4,213,179, 66, 80,239,170, 40, 70, 6, 70,252,153, +205,223,230, 96,124,145,139,224,137,189,192, 92,183,241,168, 3, 3,248,184,124,130, 54,170,105,168, 35, 85, 33, 12, 83,166, 48, +220,185, 3,234, 7, 52, 54,254,135, 3, 65, 65, 65,156,131, 72,224,168,255, 11, 6,192, 38, 63,176,237,127, 11, 12,128, 69, 97, + 73, 73, 9,193,112,166, 4, 64,154,234,104,229, 41,176, 79, 0,244, 62,174, 86, 60,188, 5,138,214,252,135, 0,172,130,112,112, +152,253, 3, 35, 19,207,156,170, 86,158, 45,123,128, 89, 6,126,166,116,186,170, 78,190,177, 21, 23, 23, 23,176,186,173,173,173, + 5,122, 28,243, 22,173,185, 79,111, 61,215,214,146,150,150, 6, 6, 23,102,141, 5,233,127, 16,223, 55,130, 47,176, 1, 54,249, + 25, 96,155, 39,176, 94, 36, 7,241,172,172,172, 44, 48, 34,128,157, 12, 21, 21, 21, 22, 22, 22, 72, 13,109, 97, 97, 65, 76, 83, + 93, 89,195,112,214, 46,129, 75,219,234,109, 45, 53,185, 57,152,184,185,254,114,178,255,244,244, 39,234,110, 3, 96,121, 5,113, + 39,158,177,160, 81,128, 7, 0, 4, 16, 19,214, 48, 5,130,124, 48, 0,114,155, 51,154,127,191,250,195,201,201, 65,100,104, 66, +234,124, 46,247, 59,255,153,153,106,215,125, 99, 32,226, 2,110, 77, 43,171, 63, 60, 92,239,255,255,189,246,245,253,149,143,111, +175,126,122,115,245,211,187,107, 95,223,221,249,246,254,237,207, 31, 95,254,252,121,246,237, 43,158, 27,248, 2,221, 24,129, 45, +125, 32,250,207,192,252,159,145, 41, 45,130, 49, 53,130, 45, 57, 92, 84, 89, 89,252, 31, 3, 43, 3, 3, 35, 49,165, 63,169, 23, +112, 3, 21,131, 6,250, 25, 24,206,116,128,250, 10, 59, 75, 65, 43,148,128, 13,127,230,255, 95,127, 50,201, 3,217,239,222,189, + 35,230, 6, 87, 96,224, 0,243,243,178, 47, 95,191,255, 98,138, 95, 49,231, 21, 7, 39,144, 65,187,248, 46, 9, 91,126,252, 93, +235,178,197,208,166, 62,176,249,111, 33, 88, 3, 97,183,102,111,153,129,123, 18, 24, 88, 40,244,215, 48, 36, 20, 57, 11,156,216, +227,216,101,207,228,205,112,224,192, 1, 34,147,132,188,188, 60,156,237,228,196, 32, 32, 0,236, 96, 49,152,235,243,114,176, 49, + 51, 51, 65, 99,199,196,212, 20,103, 26,101, 98,130,140,248, 3,139,126, 53, 36,208, 4, 6,207,158, 61, 35, 88,196, 32, 15,226, +195, 65, 70, 6, 81, 45, 68, 96, 75, 31,237, 70, 45, 96, 33,142,191,249,143, 60,247, 0,111,192, 66,216,255,112,183, 99,128,224, + 23, 35,227,191,111, 63, 89, 37,228,211, 91, 90, 18,184, 5, 4, 14, 28,135, 14, 13,197, 36, 52,244,204,185,221,183,188, 78,215, + 41, 76, 80,113,247,166, 77,152, 13,148,128,140,116,109, 29, 29,200, 4,245, 95, 24,128, 15,160, 33,115,177, 14,248, 0, 11,119, +200, 28, 47,100,208, 31, 94,214, 3,155,252,144,198, 53,176, 38, 0,178,113,249,148,149,149, 53, 32, 32,224,227,199,143,192,154, +137,147,147, 83, 84, 84, 84, 64, 64, 0,255, 45,146,112,189,236,236,236,193, 25,147, 22,156, 54,121,240,248,147, 56, 63,179,165, + 58,163,158,226,127,110, 62,190,209,210,153,214,205,127, 32, 0, 8, 32, 22,252, 29,100,120,163, 88,198, 94,138,200,182, 3,252, + 2,110,182,228,213, 12,196, 93,192,253, 69, 95,229,219,173, 91,223,254,252,252,244,245,219,221,223,191, 89,255,129,134,111, 62, +254,254,241, 15,156,123,182,189,188,255,245,207,111,188, 99, 50,140, 69,173,136,196, 13, 30, 8,250,247,151,225,231,245, 59,159, +231,173,252, 68,100,233,207, 64,226, 5,220, 32,247,116,134,177, 58, 79, 3, 50,223,190,133, 78,219,178,253,123,254,139, 73, 50, + 91,247,214,243,231,160, 98, 2,127,249,152,177,110, 22,188,106, 92, 13,187,175,118,197,229, 99, 52,221,195,165,234,252,137, 97, +213,255,163,123,174, 2,217, 86,218,160, 93,181,101, 5,245,199,174,106,247,172,138,170,154,234,141,223,193,192,182,191,144, 16, +100, 84,235, 0,184,134,115,249,255,127, 53,184, 96,253,191,122, 53,190, 11,114, 67,130,130,119,239,220,197, 0, 94,248,239,232, +200,248,230, 49,255,215,247, 28,223, 63,177,173, 88,200,152,159,255,255,225,171,207,230,150, 22,122,218, 58,248,231, 0, 32,131, +254,192,116,197, 0,190, 68, 16, 34,254, 10, 12,136, 25,231, 1,198, 44,176, 34, 65, 46,127,129, 77, 70, 98,118,129, 65, 6,205, +225, 51, 1,144,222, 0,254,230, 63, 3,210,170, 7,228,245, 60,248,151, 66, 64,234,170, 63,159, 63,179,138, 8, 49,115,241,104, + 7,135, 52,185,185, 86, 65,150,114, 26, 26,253,253,254,131, 85, 88, 92,215,194, 65, 65, 70,113,210,245,227, 58, 58, 58,207, 79, +163,220, 72,154, 1, 74,186,160, 74, 46, 11, 88,118,131, 87,139,254, 65, 42,241,129,141,114,160, 8,124,129,169, 55,106, 89, 0, + 44,217,129,126,132,140,243, 0, 67, 12, 50,212,131, 44,139,167,244,135, 56, 27, 88,220, 3,219,251, 55,110,220, 56,119,238, 28, + 48,178,184,185,185,191,125,251, 70,228, 96,189,184,184,184,191,191,255,137, 35,167, 38,172,222,205,199,200,166, 46,254,243,206, + 27,110, 27,245,223,240, 26, 2,215,128, 62, 80, 28,158, 97, 71,135,128,200, 3, 0, 1,196, 66,204, 56, 41, 48, 40,159, 28,124, +198, 16, 69, 84,233, 15, 47,209,208,204,193, 95, 7, 72,137,137, 95,254,241,224, 35,211,191, 23, 63,190, 48,252,254,253, 23, 24, +235, 12, 12,215,191,124,120,250,237, 19,228, 2,110,188, 21,192,127, 96,171,127,214, 10,104, 83,235,198, 93, 6, 13,229, 63,204, + 12, 95, 73, 42,253, 25, 72,191,128, 27,188,102, 52, 11,216, 7, 0, 54,246,129,253,223, 78, 87,134,242,221,118, 5, 58,199, 32, +141, 68,130,205,127,228,142, 17, 50, 27, 82,198,225,111, 52, 49,212, 51,154,204,186,135, 57, 87, 1,221, 9,188, 7,223,229, 80, +109,217, 91,170,167,250, 30, 95,245,223, 82,232,170,181,139,246,145,221, 87, 79,188,111, 97,100, 96,108,205,222, 12, 44, 90,241, +216, 11, 44,253,129, 89, 46, 48, 48,112,246,236, 79,144, 44,201, 8, 91,143, 18, 26,138,136,238,205,135, 45, 49,245,102,231,229, + 78,157, 52, 25,216,252,255,245, 66,246,241, 7,246,127,160,190, 19,131,228, 87,241,210,180,207,187, 79,168,107, 89,226,171,243, + 32, 69, 63,228,150,215, 23, 47, 94, 64,250, 4, 47, 95,190,100, 32,101,174, 15, 50,153,137, 54,122, 62, 3, 36,152,142,103, 61, + 40, 60, 70,224, 51, 1,192,222, 0, 49,205,127,228, 66,138,120,197,192, 38,243,139,135, 15, 20,149, 85,255,253,249,201,248,231, + 47, 11, 47, 31,175,145, 9,143,161,233,191,175,127,254,126,251,249,255,207, 95,134,191,255,202,167,247,132, 71,133, 99, 54,174, +255,172, 16,196, 99, 50,154,172,255,102,116, 5,192, 34, 30, 50,226,207,128,116, 15, 48,114, 29,128,223,131,234,234,234,147, 39, + 79,126,253,250,181,171,171,235,153, 51,103,128,165, 63, 80, 11,193, 59, 83, 33,122, 45,204,205, 51,146, 51,238, 63,185, 31,155, +156,113,114,247,194,231,159,223,153,216,187,138,203,168,161, 39,108,108, 25, 1, 94, 64, 97,238,255, 26,221, 8, 70, 12, 0, 8, + 32, 22, 34, 51, 15,145,109,127,228, 18,141,164, 11,184,127,218, 27,171, 49, 24, 63,157,185,128,129,147,227,253,255, 63,191,254, +252,249,247,255,159, 48, 63,255,147,175, 31, 9,222,137,138,182,208, 19, 54, 7,240,151,164,210,159,129,244, 83, 28, 32,251, 6, + 76, 76, 64,251,126,133,132,132,158, 63,127, 94,160,243, 28, 94,250, 19, 52, 10,235, 21,181, 68, 1,240,118, 95,228,221,118,104, + 82,248,129,176,222,211, 25, 51,103,220,218,195,215,187, 58,242,248, 42, 96,123,144,177, 36,108, 57,168,103,128,183,244,135, 68, + 28,184,160,255, 4,206,123, 12,104, 37,219,130,222,189, 64,146, 91, 14,152, 15,177, 76, 18, 2, 27,248, 64, 19, 68,196,118,253, +253,124,134,145,153,225,219, 15, 78,198,207,127, 88,152, 88,196,149, 53,221,228,188, 88,254,227,116, 54,176, 64, 81, 81, 81,161, + 60,125, 66,134,137,129,117, 0,124,121, 12,188, 31, 64,252, 76, 0,164, 24, 34,216,252, 39, 27, 56, 57, 57,101,175,154,213,244, +249,131,129,189, 13,147,184, 32,200,186,223,255, 65,199, 57, 48,176, 50, 50,179, 48,178, 49,207,158,209,199,231,108,162,172,172, + 76,245, 61, 80,144,161,158,233,211,167, 3, 73,125,125,125,146,244, 2,107,232,189,123,247, 50, 51, 51,219,218,218, 2,131, 23, +109,232, 31,216, 33, 0, 22,244,104,193, 14, 7,192, 30,195,162, 5, 11,217,152,217, 67, 34, 67,128,106,108,188, 82, 80,234,173, + 63,127, 32,122, 71, 87,245,208, 98,252, 7, 8, 0, 2,136,133, 90,214, 80,229, 2,110,199,244,132,123,119,239,157,219,190,243, +235,207, 95,192, 14,172,178,153,145,135, 92, 36,193,146,148,236,169, 30, 72, 9, 78,222, 5,220,112, 19, 32,107, 70,225,237,125, + 32,131, 24,247, 64,236, 37,207,217, 97,215, 67,193,190,198,226,206, 48, 66,189, 7, 56, 80,115,249, 52,211, 5,238, 78, 98,207, +129, 0,151,242,140,241, 69,208,243,185, 32,185, 18, 40, 8, 44,247,185,229, 66, 9,106,127,249,220,237, 37,131,219, 63,166,199, +252,124, 31, 25,132, 24, 64,199, 63,252, 98, 96, 33, 49,105, 81, 2, 32,117, 0, 25, 26,225, 51, 1, 36, 53,255,241,180, 94,177, + 2, 96,201, 46,145,151, 55, 97,215,174,123,205, 27, 66, 89,133, 5,192, 7,186,125,255,246, 39,191,164,146,153, 75,104,219,194, +153, 23, 69, 24,221, 72, 57,204,231,239,223, 63,196,204,129, 17, 57,212,131,203,119,183,110,221, 2,146, 26, 26, 26,111,223,190, +101, 97, 97, 1,150,218,194,194,194, 12,176,243,233,216,216,216, 32,157, 54,172,122, 79,157, 58,245,239, 15,163,149,181, 62,176, +135, 7, 84,249,235,215, 47, 25, 25, 25,136,212,199,143, 31,129, 29, 29,160, 33,236,236,236,120,218,157,144,186, 1,153, 49, 58, + 4, 68, 60, 0, 8, 32, 22, 26,153, 75,126,161,172,172,164,148,147, 73, 55,255,147,125, 1, 55,102, 53, 64,134,189,228, 89,135, +199,181,180, 62, 3, 14,220,192,103, 0, 31,198,131, 44, 24, 74,146, 33, 76,255,100, 63,127,144, 29,168, 20, 79,222,209, 96,192, + 86, 63,193, 17,124,172,128, 36, 93,192, 82,143,139,139, 43, 48, 48, 16,114,164,243, 35,216,145,206, 71,247,238,134, 28,233,236, +108,225,140, 75,239,236,247,237,169,130,149, 40, 66,120, 79, 15,197, 85, 7,144,225, 71, 83, 83, 83,200,146,255,127,255,254, 1, + 75,112, 32,227,245,235,215, 64,146,135, 7,180,202, 25, 34,194,202,202,138,213,191, 62, 62, 62, 16, 5, 64,189, 63,126,128,247, + 81,130,151,117, 65, 86,133, 65, 68,128, 21, 3,214, 30,192,232, 34, 31, 98, 0,254, 91,223, 1, 2,104,244, 82,248, 81, 48, 10, + 70,193, 40, 24,161, 0, 32,128, 70,111, 4, 27, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, + 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,136,101, 52, 8,134, 10, 48,196,113,185, 15, 30,112,126, +116,130,103, 20,140,130, 81,128, 27, 0, 4, 16, 13, 47,133,167,131, 94, 54,182, 93,156,236, 47, 88,217, 62,252,251, 7, 90,146, +200,204,204,196,196,200, 12, 34, 65,235,134,153,254, 51,178,128, 40,134, 63,155,183,178,254,255,255, 95, 79, 47, 97, 48,184,153, + 18,189, 50,164, 44,123,120,130,186, 12,110,244, 18,237, 81,189,163,122, 71,166, 94, 60, 0, 32,128,134,118, 15,224,208,145, 59, +102, 38,191, 5, 5, 24,222,189,103, 60,127,145,131,133,137,197,203,253,239,238,253,162,192, 98,159,145,137,137,131,151,193,201, +236, 3, 3, 3,139,141,229,255, 83,103, 8,248,116,255, 49,208,161,246,172,255,127,155,219, 58,125,124,249,232,242,237,135,127, +191,253,160,207,205,186, 35, 13, 92,191,121,238,215,143,111,188,188, 82,180,190, 60,153,138, 64, 81, 81, 17,114,148, 63,228, 68, +101,146,244, 34,159,132, 72,222, 90,210, 81, 48, 10,104, 4, 0, 2, 8,189, 88, 92,184,104, 46,126, 13,241,113,201,184,164, 40, 209, 75, 54, 56,117,134,213,195,245,239,197, 75,156,108,172, 44, 44,204, 44,172,172,255,217,153,127, 51,176,240,178, 48,124, 55, 211,254,195,193,198,254,159,129, 65, 82,156,193,207,235,223,205,123,248, 74,255, 59,215,111,169,104, 41, 75, 73, 11, 60,121,120, 131,149, 83, 68, 75, 67,109,251,198,141,123,246,236,161,117, 29, 64,231, 11,229, 7, 22, 92,186,184, 71, 65,230,167,174,242,255, -127,255,254,126,252,248,228,198,149, 51, 95,126, 74,154, 24,219, 18,169,253,227,235, 57,204,204,208, 61,107,119, 38, 84, 24, 52, -253, 34,222,106,228, 82,123,237,218,181, 37, 37,164,237, 53, 1,150,254, 5, 5, 5,192, 14, 37,158,195,156,241, 0, 50, 47,148, - 31, 25, 0,255, 81,193, 12,224,128,155,133,237, 20,107,248,165,240, 48, 85,255, 97,251, 19, 17,161, 61,194, 47,133,135, 0,228, -107, 32,209,214,253, 3, 4, 16,253,122, 0, 76, 12,212,223,204,237,229,246,251, 63, 3, 51, 11, 51,171,149, 57,163,152, 40, 19, - 11, 11, 19, 59, 43,179,134, 26,211,195,199,127,204,140,153,132,133, 56,182,239, 3,157, 41,200,252,255,251,255,255,255, 36,164, -113,150,254,151,206,156, 81,144,146,185,116,252,196,201, 95,191,223,191,121,207,198,206,171,105,104,173,111,237,182,127, 51,104, -135, 48,141,234, 0,180, 11,229, 33,103, 49,166,164,164, 12,254,106,224,194,249, 61,236, 44,239, 88,152,126,253,248,241,247,227, - 87, 78, 27, 59,194, 39,247, 94,187,113,142,151,227,173,147, 53,187,130,188, 50, 31, 31,255,239, 63,127, 94,191,126, 35,254,232, -241,237,187,247,142, 29,125,103,101,237, 79,140,189,192,210,255,239,157, 86,178,157, 77,246,217, 27,144,219, 93,224,103, 1,225, -185,209,101,176, 1, 96, 11, 6, 88,219,161, 28,127, 68,195,210,240, 63, 35, 3, 35, 25, 85,220,255, 71,235, 24, 79,166,192, 10, -113, 6,216,101,107, 8,147, 82,102,124, 53, 11,159,140,181, 90,221,190,125, 59,132,237,225,225,177, 99,199, 14,172,236,209,210, - 31,147, 11,175, 6, 0, 2, 8,123, 5,112,244,200, 73,107, 27,115,234,186,227, 31,161, 19,249,137,188,161, 9,165, 82, 97, 97, -126,255,142, 69, 66,140, 85, 66,140,237,203, 23, 86, 14, 86,150,191, 44,236, 70,186,140, 6,122,204, 76,140,172,160, 77,228,172, -108,172, 76, 63, 25, 57,216,254,124,195, 89,250, 31,217,183, 87, 81, 82,244,202,197, 43,213,205, 13,112,241,214,198, 54, 38,102, - 70, 35, 99,163,237, 59,246, 18,172, 0,254,253,251, 7, 44,196,239,220,185,195,201,201,169,171,171, 75,240,236, 26, 6,140, 11, -229,225,183,173,206,153, 51,103,160,234,128,243,231,207, 27, 26, 26,226, 87,115,229,218,185,255, 63, 31,200, 75,254,224,231, 99, -103, 98,226,250,254,253,207,219,119,223, 15,238,153,192,193,103,100,110,102,135, 71, 35, 7,243,107, 53,197,255,218,218,154,207, - 95,188, 63,123,254,220,151, 47, 95,249,249,121,149,148,228,153,152, 89,255,254,125,116,254,194, 17, 67, 3,155, 65,155,133,128, -205,127,248,237, 46,192,126, 0,176, 14, 32,242, 90, 21,140,134, 44,189,123, 0,144,164,187,102,205, 26,242,238,213, 34, 30,192, - 27,227, 51,103,206, 32,213, 30, 38,249, 96,136,222, 83,237, 60,104,141, 68, 9, 1, 38,105, 33,166,193, 19,158, 67, 23,192, 75, -124,180,250, 0, 32,128,112,246, 0,128,117, 0,144, 36,181, 26, 56,146,119, 27,171,184,205, 36, 85,226,115, 8,164, 7, 71, 76, - 53,176,231,128, 24, 43, 11,171,172,212,151,207,159, 89,207, 94,145, 5, 93, 3,201, 8, 58, 12, 78, 91,245,155,186, 42,232,170, - 0, 54, 86,118, 54,102, 70, 99,189, 95, 66,130,255, 14,157,198,110,136,166,162,248,195,187,175,144, 75,127, 32,168,174,175,106, -107,238,146,180,212, 19, 20,224,197,239,134,239,223,191, 3, 75,132,135, 15, 31, 66,184,192,166,135,151,151,151,191, 63,129, 38, - 45,218,141,146,200,160,183,183,183,184,184,152,206,219,220,129,165, 63,252, 74, 13, 60,224,231,215,167,138,210,223, 69,132,185, -101,164, 37,184,184,185, 30, 62,124,250,247,239, 63,105, 41,222,171,215,143, 95,224,228, 54,208,197,126,241,195,229,203, 71,244, -212,126,201,201, 41, 94,187,254,240,236,217,235,175,223,124, 6,198,179,160, 32,231,183,111, 95, 12, 13,181, 63,124,248,248,244, -236,249,139,151, 57,245,117,141, 7, 97,206, 65,187,220,145,224,181,142,200, 35, 27,104, 71, 25, 3,217,240,225, 14, 50,198,145, -154,155,155,125,125,125, 73, 61,173, 1, 88, 7, 0,237, 93,181,106, 21,174,227,216, 24,192,103, 41,163,245, 12, 32, 87, 66, 2, -197,209,218, 4,192,130, 30,243,236, 0,248,241, 74, 64,255,166,167,103,144,212,201, 64,214,107, 86,249,229,116, 59, 15,188,232, - 31, 45,181,169,213,252, 71,142, 50,180,232, 3, 8, 32, 2,161, 12,172, 6, 32, 53, 1,145, 0,107, 65, 79,100,233, 15, 1, 7, - 15, 30,124, 10, 6,196,156,229,196,252,255, 59, 11,227, 15, 54, 86,214,243, 87, 68,153, 89, 88,120,217,190,241,113,124,231,229, -255,251,244, 41, 47, 59, 27, 7, 59, 59,123,168,223, 31, 63, 79, 38,105, 41,118, 46, 78,236,119, 83,124,251,240,248,197,187, 47, -197,117,117,152, 82, 31, 62,190,123,255,250, 5,193,171,196, 86,175, 94, 13, 47,253, 33, 96,219,182,109,215,175, 95,199,223,252, - 71, 62,255, 25,210,252,255, 8, 3, 64,118,125,125, 61,217, 71,197,145, 93,250, 19, 84, 6,108,254,115,176, 60,231,228,100,229, - 96,103, 83, 84, 84, 48, 49, 51, 19, 20, 20,100, 97, 97,102, 99, 99, 22, 18,228,120,250,248, 1, 46,141, 44,255,159,242,242,112, -126,251,254,231,202,149,219,207, 94,124,124,244,228,211,173,123,191,158,191,248,252,250,245,135,219,183,238,169, 40, 43, 75, 75, -241,189,125,253,104,112,102, 33,200,232, 63,178, 8,176, 55,128,114,183, 59,158,182, 45,120, 57, 26,214, 11,229,201,235, 64, 0, - 11,101,120,103,145, 72,176,119,239, 94, 96, 18, 37,120, 53, 35,242,229,239,200, 23, 2, 35, 91,135,203,106,136,177,144,187,195, -200,235, 21,173, 42,228, 70,110,245, 67, 74,127, 96,219, 95, 10,212,252,199, 23, 92, 30, 30, 30,158,158,158,144,113, 30, 8, 3, -194,246,128,129,209, 58, 0, 63, 0, 8, 32,162,230, 0,200,235, 13,144, 13,110,223, 6,117, 35,128,117,128,180,180, 52,254, 54, - 41, 11, 11, 11, 43, 51, 43, 43, 43,163,157, 53,195,183,175, 63,239,223,101, 3,118, 8, 88,254,178, 88,152,255, 7,214, 10,204, -204, 76, 12,255, 25,223,189,103, 56,125,142, 5,116, 19, 8,182,202,238,220,249,187, 95,190, 96,153, 75,236,168,175,103,103,231, -248,254,253,227,223,127,127,240,187,246,220,185,115,152,130,103,207,158,213,212,212, 36,178,249,143,220,166,219,188,121, 51, 92, - 13,141, 58, 1,104, 67, 61,240,210,159, 96, 6,126,255,238,149, 8, 47,227,159,191,255,126,253,254,243,250,205, 59, 86, 54,142, -159, 63,127,255,254,243,247,207,159,127,127,254,254,255,240,254, 13, 46,141,108,172, 95, 57, 56,101,222,190,253,248,233,243,183, -119,239,191,243, 9,235, 91,233,233,157, 58,186, 67,234,215,159,143,159, 62,170,171, 43,179,179,177,124,253,252,110,112, 54,255, -129, 37, 20,218,101,138,192, 30, 0,145, 51, 1,192,154, 3,243, 14, 72,248,177,210,184, 0,252,114,133,140, 12, 33,103,103,196, -233,111,192, 28, 1, 36, 55,109,218,244,230,205, 27, 34,231,165,246,236,217, 3, 41,253, 33,234,215,174, 93,139,171, 20, 70,238, -255, 97, 94, 8, 12, 17,135, 92, 11,140,213, 4,200, 49,162, 64, 18,210,111,192,234, 65, 92,233, 25,232,188, 16,203, 61, 43, 25, - 24,194,251,191,154, 86,126,193,170,215, 44, 28,187, 7,145,199,250,113,205, 7,140,150,242,200, 35, 63,104, 61, 0,128, 0,162, -126, 63, 11,173,189, 79, 82,243, 31,210,254,133, 87, 3,192,204,131,191, 31,192,204,204, 98, 97,246,143,153,137,229,244, 25,142, -155,183, 57,188,221, 25,124, 60, 25,124, 61, 24, 37,197,217, 56,216,216,129,136,147,131, 93, 90, 18,200,224, 0,178,177,154, 80, - 91, 93,211,217,222,132,153,109,148, 21,229,249, 5,184, 57,254,253,250,242,237, 55, 45,226,227, 8, 24,192, 11,125, 56, 0,114, -223,190,125, 11,236,233,211,174,177,143,220,172,131,112, 33, 61,113,130, 99, 11,127,255, 50,124,253,246,251,235,215, 95,159, 62, -253,124,249,242,253,179,103,111, 62,127,254,249,229,203,111, 96, 13,250,245,235,239,143, 31, 62,226, 28, 56,250,249,231,199,143, -191,191,127,255,226,229,101,147,149,230,227,226, 6, 53,247,148,148, 21,100,164,248,248,249, 56,254,255,255,251,251,207,191,159, - 63,191, 14,206,230,127, 81, 81, 17,214,146,157, 96, 39, 0,243, 46, 73, 8, 0, 10,238, 33,238,212,110,240,136, 10, 2, 64, 10, - 95, 96, 53, 0, 44,211,137,233, 31, 3,219,254,107,214,172,129,151,254, 64, 50, 36, 36, 4, 87,241, 13, 52, 28,243, 74, 72, 72, -155, 0, 46, 14,116, 15,161,195,180,255,163, 13,228, 34, 15,127,225,210, 35, 34, 34,194, 8,107,231,147,170,119, 20,144, 84,250, - 51, 96,204, 1, 0, 4, 16, 81, 61, 0,186,181,253, 97, 5,205, 95,200,165,210,132, 29,102,246, 79, 76,148,253,211, 39, 22,118, -150, 63,236,108,204, 7, 78,178,121, 59,178, 2,219,254,159, 62,177, 30, 61,195,205,199, 1,186, 74,194,195,229,151,191,247,127, - 38,166,255, 11,214, 18,101, 59, 48,115, 50,115,113,188, 99, 21,225,250,253,228,206,211,255, 78, 14,118,248,213, 3, 91,211,199, -142, 29, 67, 19, 36,120, 13, 50,228, 82,239, 5, 11, 22, 36, 36, 36, 64, 68,224,247, 74, 2, 69,240, 95,115, 72, 9,128,180,253, - 33,205, 52,248, 10, 57,204,161, 94,172, 64, 80, 72,244,217,253, 43,192,112,254,245,251,223,143,159, 79, 30, 63,121,251,238,253, -167,119,239,190,189,125,247, 29,136, 4,132, 20,112,105,124,249,230,255,139,151,111, 52, 53,149, 63,188,127,207,202,194,244,233, -243,147,175, 31,254,105,169,124, 21, 23, 21,229,226,226, 98,103,231,124,254,226, 51, 35,179,224,224,204, 60, 88,175,113,135,204, - 4,224,215, 8,233, 31,192,239,146,132,215, 28, 12,164, 92, 41, 19, 22, 22, 6,111, 17, 67,110,173, 0,198, 90,112,112, 48,176, -250,193,191,217, 7,173,237, 15, 1,200,253, 9,100,128,235, 74, 72,136, 56, 48,181, 64,238, 94,135,136, 63,198,102, 47, 80, 77, - 86, 86, 38,228,118, 29,112,181,241, 31, 82,164, 3,117, 65,220,143,167,230, 0,234,157,234, 40, 24, 62,225, 27,218, 88, 16, 80, - 4,162, 55,201,145,117,180, 16,167, 4,164,149,119,192,217,179, 58, 43,128,117, 0,188, 31, 0, 16, 64, 44,180, 40,250,129,173, -126,200,108, 48, 73,205,127,164,118, 61, 51,242, 24, 31,158,123,196, 68, 68,152,153, 24,153, 69, 69,152, 85,149,255, 63,123,198, -194,196,204,200,202,194,194,202,194,122,233, 50,183, 16, 55, 43,208, 28,107,243,191,156,156,236,255,254,253,103,248,255,151,200, -210,159, 71, 92,246,229,151,255, 95,239, 28, 96, 97,100, 46,173,175, 38, 38,139, 62, 6, 3,100, 55,227, 25,255, 97, 0,175,247, -135, 20,247,144,210, 31,216,222, 7,214, 4, 16,169, 79,159, 62, 1, 75,255, 45, 91,182, 16,115,161, 60,121, 0,114,241, 19, 48, - 72, 33, 83,148,196,180,253, 33, 64, 95,215,248,250,149,179,255,159,126,250,246,253,247,123,246, 31,255, 25,222,255,248,241, 7, -216, 27,120,245,230,219,179,231, 95,108, 29,229,113,105,252,254, 75,228,222,253,215, 74,138,114,138,138, 50,111,223,190, 17, 20, -248,171,170,202, 47, 38,170,196,193,201,249,225,195,151,179,231,110, 60,121,250, 73, 66, 70,123,240,100,152,255,224,219, 46, 33, - 5, 47,188,252,197,186,150, 31,203,104, 5,210, 10, 70, 96, 39, 0,126,151, 36, 4,244,245,245,237,218,181, 11,151, 94, 72,140, -164,167, 11,194,172,251,143, 92,100, 67, 42, 0, 96, 43, 30,207,248, 15,210,240,209, 94,146,110, 55,194,117, 37, 36, 68, 28, 82, -124,227, 42,196, 33, 75,140,166, 77,155, 14,153,225, 48, 48,208,135, 15,220,195, 90,244, 56,111, 26,128,232,101, 10,123, 15,209, - 27,234,164, 0, 15,152,176,254,107, 12, 12, 12,248, 91,255,192,188, 6, 95,224,228,233,233, 9,143,157,209,145, 31, 34, 1, 64, - 0,177, 12,146, 86, 63, 4, 68, 68, 68,144,164, 30,216,192,103,102, 6, 33, 77, 53, 38, 67,221,191,236,108, 28,160, 10,128,149, -213,202,156,129,157,157,129,149,153, 93, 68,132,131,153,249,235,223,191,255,254,253, 35,106, 36,231,219,187, 23, 28, 50, 26,247, -247, 44, 17,101, 97,138,173,174, 34, 70, 11, 39, 39,103, 85, 85, 21, 73,203, 64, 33,183,207,231,228,228, 64,184,144,246, 62,176, -232,255,246,237, 91, 82, 82, 18,144, 61,109,218, 52,218,173, 2,130, 92,254, 7,191, 67,149,164, 85, 37, 50,242,234,103, 78,236, - 20, 19, 1, 54,220, 89,192, 99, 59,127, 63,125,254,245,238,253,119, 89, 69,109, 27, 43,123, 92,186,188,188,130,119,109,159,127, -226,212, 85, 91,107,125,121,121,249,223,191,126, 24, 26,232,113,243,243, 63,188,247,232,233,179, 15, 71,143, 95,127,255,153, 63, -208,210,126,240,228,138,204, 12,200, 0, 11, 99, 38,176, 64, 4, 23,232,255,144,202,125, 38, 38, 70, 60, 23,172,131, 46,103,255, - 15, 47, 0, 25,129, 41, 15,222, 9, 0, 50,128,165,149,135,135, 59,172,146, 97,240,142,174,197, 28,235,192, 85,106, 3,101,241, -151,254,200, 0,168, 18, 87,123, 31, 79,170,192,188, 18, 18, 46,142,231,178, 48,120,205, 1, 44,127,193,205,127, 70,228,250, 3, -191,189,200,122, 87, 21,242,128,194,133, 67, 28, 34,181,170,240, 17,164, 50,216,121,241, 55,174, 0, 65, 30,247, 31,157, 3, 32, - 3, 0, 4, 16,246, 10,192,202,218,140,194,113, 55,242,218,254,240,104, 35, 18,188,123,207, 40, 41,206, 4, 57,248, 97,215, 94, -208, 64, 63, 59, 59, 7, 59, 27,187,175, 39, 35,144,226,228, 96,124,247,150,249,212, 89,222,191,255,254,202,202, 16, 30, 98, 6, - 54,255, 63,124,251,254,254,204, 54, 85, 89,214, 43, 79, 73, 24,146, 6,214, 67,102, 96, 64,188, 22,240,133,242,157,144,209, 30, - 96,111,192,220,220, 28,216, 90,244,247,247, 7,178, 99, 99, 99,105,215,252,135, 15, 4, 65, 90,115,196,140,252,160, 68, 43,184, -148,191,117,227,218,179,123, 15,129,229,224,223,191,255, 57, 56,133,212, 52,117, 2, 3, 8, 92, 10, 38, 38,173,119,226,212, 14, - 96,143, 65, 87, 71, 73, 90, 74,228,209,227,151,239, 47,223,189,121,235,209,222,125,151, 30, 62,253,159,146,154, 75,164, 3,238, -111,249, 76,182,175, 31, 60,120, 64,164,202,127, 43, 5,137,151,245,221,132, 87,239,221,249,240, 78, 0,104,212,232,222, 2,100, - 5,104,122,177,118, 8,144,203, 74,146,252, 75,106, 22,198,117, 37, 36, 49, 87, 69,194, 11,122, 52,101,196, 52, 47,254, 61, 92, -187,102, 66, 28,168,251,226, 36, 7, 47,253, 65, 92, 47, 83,240,104,233, 5, 92, 21,192,232, 62, 0, 34,193,172,206, 10,228, 81, - 32,100, 0, 16, 64, 44, 84, 73, 58, 84, 1,100,180,121,207,156, 99,231, 96, 99,243,245, 2,214, 0,140,102, 38,127, 46, 95,225, -100, 2, 95, 33,253,225, 3,147,148, 4, 51, 19, 35,219,197,203,108, 28,236, 12,191,126,255,122,248,136,147, 96,233,127,247,214, -121,115,103, 31, 22, 17,243,187,183, 78,177,188, 88, 83, 86, 90,217,213,221, 78, 35,207, 34, 95, 40,175,163,163,243,254,253,123, - 32, 27, 72,230,229,229,209,103, 23, 24,169, 69, 63,114, 29, 0, 68, 23, 46,159,125,249,226, 37, 55, 55, 55,158,134, 63, 74, 65, -160,103, 12, 68, 75,151,204,188,118,243,164,164, 56, 15, 7, 7,235,151, 47,191,158, 62,255,196,200, 34,155,146, 26, 71,164,213, - 60, 66, 69,100,251, 23,178,156,127, 0,192,185, 98, 6,229, 68,196, 66,210,179, 36,120,129,140,108,152,145, 33, 4,171, 54,200, - 41, 28,113,149,215, 4,203,113,242,238,146,132,123, 51,212,146, 29,228,224,239,207, 65,104, 20, 80, 15,248,196,212, 66,102,125, -129,117, 0,178, 32,156, 13, 16, 64,232, 21, 0, 37,199,245,208,226,168, 31,194,169,135,129,241,253,123, 70, 46, 9, 70, 97, 33, - 70, 19,163,223, 28,108,204,236,108,191,133,133, 56,192,121,128,209,194,228,239,169,115,172,160, 46, 2,222,188, 4, 44,253,181, -213,249,138,243,155,190,179,201,172,219,243, 84, 89, 13,212,150,231, 57,189,165,184,164,178,183,135,134,117, 0,228, 66,121, 96, -147, 31,222, 45, 24, 42,215,156,130,246,124,233,146,172, 43, 58, 38,253,200,177,131,175,223,190,254,254,226, 27, 7,135,176,140, -162, 30,145,245, 7, 3,101, 23,192, 82, 37, 84,255,255,255,199, 64,222,113, 38,247, 22, 64,151, 3,221, 91, 72,235,120, 33,105, -216,103,144, 0, 55,159,112,130,109,121, 92,157,235,209, 57, 0,226,235, 0,204,210, 31, 8, 0, 2,104,200,223, 7,240,159, 1, -180,194,135,145, 9, 24,243,255,133, 4,254, 31, 60,194,194, 1,218,254,203,226,231, 5, 76, 12,255, 4,133,255,252,249,203,248, -239,223, 95,112,238,197, 9,244, 20,190,120, 7,135,126, 97, 81, 21,227,225,142, 10, 20, 90,182,254, 50,164, 14,248,253,119, 29, -173,221, 79,198,133,242, 67, 26, 16, 95,226, 15,100,151,249,125, 71,154, 96, 5,138,208,106, 33,242,245, 2, 91,253,103,139, 24, - 70, 1, 14, 16,146, 61,101, 0,235,245, 17, 82, 7,224,146, 2, 8,160,209, 75,225,135, 12, 24,189, 16,102, 20,140,130, 81, 64, - 93, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 39, 46,141,130, 81, 48, 10, 70,193, 8, 5, 0, 1, - 52, 90, 1,140,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52, 90, 1,140,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52,240,151,194, -219,155, 73,227, 82,249,245,221, 11, 8,131, 91, 72, 2,194, 56,120,234, 41,178,130,159,162,226,184,244,238,238,135,238,179,117, - 45,132,174, 49, 96,127,253,146, 72,123, 49, 1,241,246, 98, 2, 52,123, 77, 12,165,112,169,124,115,255, 42,132, 33,162, 8, 61, - 23,225,204,249,103,212,242,175,199,110,236, 7,208,243, 75, 73,197,194,142, 2,158, 34, 14, 53,127,135,107, 26,181,226, 23, 89, -239,205,155, 55,145,207, 71, 43, 44, 44, 84, 87, 87,167, 81,186, 26,213, 75, 21,189,151, 47, 95,134, 48,116,117,117, 73,213,139, -121,197,211,104, 56, 15,136, 94, 60, 0, 32,128,176, 47, 3,253,243,231,207,143, 31, 63, 24,153, 65,151,106,253,253,243,155,141, -149,133,157,157,157,212,186, 5,104, 8, 3,248,196,102,146,116, 1, 11,125, 96,113, 15, 41,250, 37,100, 21,128,228, 11,220, 7, -205, 99, 22,130,192,226, 15, 82, 20, 78,221,116, 10, 72,102,251,153, 49, 12,110, 0, 44,244,129,197, 61,164,232,215, 54,177, 6, -146, 87,207, 28,165,181,127, 55,127,249,178,243,235, 87,119,110,110, 32,201,240,242,229,169,242, 50,160,160, 89,103, 23, 77,125, -122,224,192,129, 21, 43, 86, 0,211, 21, 92,132,131,131, 35, 34, 34,194,193,193, 97,180, 33, 54,168, 0,176,208, 7, 22,247,144, -162,159,212, 52, 9, 57,185, 11, 82,244,147,148, 38,145,207, 55, 37,111,125, 39, 25, 87, 10,142, 2,128, 0,194, 82, 58,127,250, -252, 69, 82,205,212, 94, 87,131,139,157,245,255,255,255,127,255,254,191,114,251,225,253, 75,135, 57,217, 89,137, 60,164, 19, 8, -120, 56, 30,104,171,222,187,114, 75,233,235, 79, 5,226,139,126, 32,201,201, 47, 12,100, 64,138,126,172,189, 1, 60,237, 95,179, -232, 10, 32, 3,146,236, 48,101,177,174,119, 66, 54,150,141,141,141, 1,188,191, 28,116,121, 0,248, 80, 82,136,123,152,152, 89, -241, 55,186,129, 64, 82, 12,212,118,254,245,233,195, 79,112,181,247,229,207, 95,136,123,248,197,100,240,183,247,249,165,148,129, - 12, 72, 54,195,214, 27, 16,164,174,127,129, 32,231, 37,168,103, 0, 41,253, 33, 69, 63,168,109,190,107, 55,178,172, 15,222,152, -250,200,253,230, 45,207,235, 15,111,239,136, 9,104,202,188, 81, 33, 38,114,129,109,255,149, 43, 87, 34,151,254, 64, 0,228,114, -114,114, 74, 74, 74,162,245, 3,134, 55,216,179,103, 15, 73,183, 76,227, 57, 12,145, 22, 69, 63, 36, 77, 2, 25,152,105, 18,214, - 27, 16,196, 83,254, 2,211, 36,144,129,153, 38, 33,178,184,210, 36, 80,246,208,241, 83,204,204, 44,127,255,254,249,248,249, 75, - 84,176,127, 79, 79, 15,121,165, 63,157, 67,108,144,131, 45,216,214,142, 35,199, 2, 64, 0,161, 87, 0, 95,191,255,114,246,139, -146, 21,227,231,226, 0, 93,162,242,247, 31, 3, 11, 51,163, 16,191,134,182,170,220,158,157, 91,255,254,254, 74, 76, 29,240,235, -215, 47, 77,237,251,250, 26,247,153,153,254, 30, 56, 35,205,198, 74,248, 52, 87, 96, 65, 12, 44,106,249,249, 64,247, 47, 66, 72, - 52, 89, 96,149,128,171, 43, 0, 44,239,128,201, 46, 62, 60, 8,200,134,144,104,178,192,228, 72,176, 25, 2,244,151,140,140, 12, -144, 4, 58,254,235,215,175,192,210, 31,114, 98, 51, 81,181, 29, 11,243,188, 9,235,217,249, 25, 94, 62, 96, 56,253,229,233,235, - 23,119, 22,247, 87, 18,108,248, 3,179,153,140, 20,104,104, 11, 66, 98, 29, 11, 34,207,191,120,206, 1, 0,150,239,192,162,191, - 57, 39, 27,200,110,134, 21,253, 75,110,221, 66,148,254,132, 14, 17,120,240,255, 48,131,217,211, 8,185,152,159,255, 84,216,255, -253,191,254,102,239,249,221, 55, 85,254,101,225,247,111,127,127,255,247,239,223,145,143,191,134,176,129,130,192,126, 0,169,167, -220, 92,191,126,125,226,196,137,180,188,223,156,134,165,255,170, 85,171,222,191,119, 93,189, 58,148, 24,245,144,211,249,233, 83, -162, 1,203,119, 96,154,188,117,254, 24,176,232, 71, 78,147,251,182,174, 19, 23, 23,135,143, 5,225, 42,127,241,164, 73, 80,233, - 12, 63, 94, 21, 3, 0,227,241,197,171, 55,231,175, 92,131, 53, 11,126,118, 77,158,149,158, 16, 57, 90,136,211, 1, 0, 4, 16, -202, 36,240,231,207,159,109,220, 2, 53,228,132,217, 89,153,128,165,255,139, 23, 47, 46, 95, 60,255,235, 15,144,249, 95,152,159, -203,205,211,231,251,207, 63,196, 24,202,206,250, 74, 89,238, 5, 3, 51,163,150,234, 99,118,150,151, 36,149,254, 40, 45,205, 79, -159,129,133, 62, 80, 10,179, 67,128,181, 52, 68, 6, 11, 87,174, 3, 22,250, 64, 41,204,198, 8, 26, 0, 54,252,129,229, 62, 31, - 31,223,189,123,247,128,133, 62,168,218, 35,186,244, 7, 54,252,129,165,127, 96,110,139,103,148,213,150, 43, 79, 95,124,103, 32, -181,244, 71, 6, 79,158,189, 0,246,181, 69, 5,249,192, 85, 51, 51, 25,254,245, 8,142, 7,181,208, 88, 88, 9,150,254, 64, 80, - 59,101, 42, 16, 65, 74,127, 96,111,160,212, 13,220,238, 23,101,195, 87, 30,241,111,115, 11,145, 74,148,207, 98,101,226,225,102, -224, 98, 98, 96,150, 22,183,182, 9,118,190, 39,213,143,127,240, 7,228,194,133, 11, 33,229, 62, 26, 9, 87, 64, 12,248,246,237, - 27, 65, 17, 26,129,180,180,180,208,208,213, 75,151, 46,165,188,244, 23, 18,218, 67,164,150,153, 96,192,200,200,136,124,101, 35, -237, 74,255,214,170,194,213,171, 87,207,153,220,131, 92,250, 3, 69,166, 76,153,130, 39, 77, 34,151,254,152,105,210,211, 26,124, -234, 20, 47, 55, 46,189,189,147,167, 67, 74,255, 87,111,222, 2, 17,176, 7,192,202,202, 50,125,193,114, 98, 46,189, 25, 5,196, - 0, 96,147, 31, 25, 33, 75, 1, 4, 16,162, 2, 0,150,122,194, 10,122, 10, 18, 2, 63,126,255, 5,214,214, 59,119,238, 88,180, -112,193,165,139, 23, 75,139, 10,152,153,153,128,125, 1, 62, 46,118, 5, 61, 27, 96,147, 13,191,101,191,127,255,214, 86,125,200, -199,243,109,222,194, 87, 76,140,255,205,116,111, 2, 69, 8, 58, 17,173,244,135, 20,253,223, 63,190,133, 87, 12, 64, 17, 92,122, -209, 82, 30, 36,217,157, 90,218, 1, 79,148, 64, 17, 60, 86, 43, 43, 43, 11, 11, 11,127,250,244, 9, 88, 19, 48, 49, 49, 1, 61, - 8, 44,253, 33, 29, 29,130,167,113,173,221,176,190, 96,194,174,245,147,107,128, 53, 1, 23,183,208,227,191, 79,129,165, 63, 15, - 56,159, 48,227,213,139, 86,250, 67,138,254,143,207,238,106,200,136,125,254,246,131,157,139,157,225,239, 95, 82,253, 91, 57,123, -203,213,115,199,117,148,180, 62,254,197, 89, 79, 67, 74,127, 96,171, 31, 88,244, 67, 68,128, 69, 63, 16,221, 75,111,220,117,237, -146,182,153, 18,195, 91,156,145,117,145,109,139,181,131,168, 40,183,230,247,255,159, 25,126,190, 98,251,249,238,231,223,207, 63, -254,125,255,199,198, 35,109,107,178,230, 66, 27, 46,141,144,161,127,200,181, 86,240,108, 15,103, 3,165,128, 10,136, 73,199,111, -222,188, 41, 42, 42, 2,182,253,111,220,184, 1,228, 30, 62,124,184,173,173,173,166,166,134, 62,185, 8, 88,112, 83,165,237, 15, - 44,253,171,170,136, 58,105, 28, 94,232, 35,223,203, 72, 59, 0, 76,147,144,171,131,207,158, 61, 11, 44,247,129,105, 18, 82,250, - 51,128,111,109, 36, 47, 77,118, 37,248, 92,185,251, 88, 66, 73,146,225, 43,129,122, 26, 88,244,255,254,253, 7, 92,128,252, 1, -162,199, 15, 31,144,228,120,228,238,194,104,215,129,120, 0, 16, 64,136, 33,160,159, 63,127, 26,106,104,112,113,178, 2,219,251, -127,255, 49, 28, 61,124,164,177,185,229,223,127,134,219,119,238, 92,186,120, 65, 71, 71,159,153,153, 81, 93, 73,230,222,185, 63, -156,120, 15,214,100, 99,121,165,166,240,140,129,133,241,241,243,223, 64, 82, 79,227,225,169,203,175,254, 51, 16,187,228, 6, 62, -206,131,214, 39, 0, 86, 6,224,181, 64, 79,241,232,133,143,243,160,181, 71,128, 9, 17,180, 54,230, 53,246,190,200,159, 63,127, -184,184,184,128, 69,191,160,160, 32,176, 57,249,245, 43,232, 32,104, 81, 81,209,183,111,223, 18, 60,163,234,199,123, 6, 51, 78, -206,210,201,135, 93,245, 25, 30,158,103, 56, 13, 22, 4,114, 39, 21, 58,254,253, 71,212, 21, 52,240,233, 53,103, 99, 13, 22, 94, -166,157, 7,174, 25,106,200,242,241,176, 31, 60,115, 71, 68, 81,251, 1,234, 42, 32, 92,254,221,116,237, 63,195,115, 6, 63,103, -198,217, 91,238, 9, 11, 42, 6, 89, 51,226,241, 47,100,204,103,231, 87,232,121,215,255, 27,250, 25,164, 63, 50,166,214,255,111, -108,102, 96,250,206,120,170,109,138,184, 56,214, 83,185,127,104, 60,148, 23,240,250,244,247,203,207,247,119, 22, 63, 90,118,196, -239,189, 86,138,163, 91, 46, 15,167,160, 58, 7,139, 32,139,223,199,211,235, 78,155,154,152,226,236,108, 50, 49,193,195, 19,153, - 77, 60, 16, 17, 17,201,207,207, 63,114,228,200,206,157, 59, 65, 85,215,206,157,154,154,154,129,129,129,244,201, 42, 1, 1,191, -168, 85,250,203,203,203, 19, 89,168,193,203,125, 72, 39,128,236, 51, 92,137, 4, 78,222, 65,192,126, 48,176, 2, 0,150,251,198, - 96, 6, 3,248,122, 59, 15,123, 19, 72,154,212,213,213,125,128,119,133, 9, 60, 77, 62,223,208,193,171,205,193,163, 90,176,170, - 35, 69, 95, 71, 66,221,167, 5,232, 29,172,171, 83,128,109, 59, 14, 14,208, 26, 19, 96,195,255,219,183, 31,100, 59,126,180,220, -199, 5,240, 28, 6, 7, 16, 64,136, 10,224,223,191,127, 92,236,108,191,254,252,103, 98,100, 0,162,250,166, 22, 96, 53,240,245, -235,151, 23, 47,158,139,139, 75,252,255,255,239,207, 31, 6, 14, 86, 22,102, 86,124, 67, 4,192,194, 84, 75,249,137,136,224, 39, -208,144, 31,248,162, 79, 70,198,255, 70,218,183, 79, 94, 18, 39,102, 57, 16,164,153,143, 57, 28,132,167,249,143,220,232,192, 44, -250, 9, 54,255, 33,237, 74, 49, 49, 49,200, 50, 39, 96,103, 5, 50,247,203,207,207,207,202,202,250,248,241, 99,252,211, 23,243, -247, 28, 76,241,177,119, 0,179,111,253, 1,141,255, 0, 25, 14,106, 12,124, 45,251, 11, 75,172, 8,186, 25,216,200, 2,146,114, - 98, 66,239,127,254,100,225, 99,254,241,250, 27,176,104,148,148,151,217,181,239, 52,145,254,141, 47,110,189,127,116, 47,203, 11, -134, 15,226, 12,192, 74,204, 66, 65,209,201, 30,223, 18, 85,228, 17,255, 37,225, 41,107,127,222,100, 80,249,193,112,146,133,129, -135,133,193,215, 88,198, 55, 30, 95, 87, 73, 90,232,215,175,119,172,127,126, 3, 75,255,227, 9,252,118,129,254, 26, 98,154, 87, -118, 29, 48, 12,253,202,250,235,235, 31,141,127,175, 95,226,155,168,135,148,248,144, 57, 0,100, 54, 73, 0, 88,226,115,115,115, - 95,191,126,157, 11, 12,162,163,163,105, 61,236, 3, 44,181,129, 69,127, 52, 24,208,179,244, 71, 27,243,129, 92,156, 66,135, 50, -206, 35, 56, 70, 73, 73, 9, 88, 1, 64, 74,127, 96,219, 95, 92, 82,146,164, 52,153,230,107,119,226,217, 43, 94,125,222,167, 59, -239, 50,112,176, 7,231,198, 9,201,248,224, 45, 52,254, 62,125,254, 18, 88,250, 67,122, 0, 64, 64,106,243, 31,115,176,104,180, - 50,192, 83, 25, 32,215, 1, 0, 1,132, 50, 7,240, 31,178, 6,230, 63, 3,176,232,103, 2,149,221, 12,235,214,174, 9, 12, 10, - 17, 17, 21,131,100,218,255,132, 14, 25,103,102,122,165,173, 2,189, 28, 81, 79,135, 11,220,116, 97, 48,210,186, 7, 20, 39,198, -113,200, 99, 62,104,226,240,173, 0,184, 0,242,152, 15,154, 56,124,105, 60, 86,240,233,211,167,207,159, 63, 3, 59, 64,192, 42, -240,245,235,215,144,241, 31, 96, 87,224,203,151, 47, 4,135,128,214, 79,174, 57,112,133,225,227, 3,134,223,223, 25, 38,149, 59, - 66,198,127,206,157,103,184,240,252, 40, 49,235,165, 62, 62,187, 43,196,207, 45, 44,196,173,174,166,121,239,254,235, 91, 79,223, -202, 9,243,255,124,249,234,207,239, 63,240,173, 0,120,252,107,229,224,111,227, 24,185,126,243,170,253,135, 86, 45,235, 43, 14, - 46,110,187,244,155,225,245,219, 87,120,252, 11, 31,241, 79,180, 50,143,214,146, 95,181,126,223,165, 75, 15,250, 46,159, 93,225, - 26,199, 48,247,216,211,167,175,225, 91, 1,176, 12, 17,252, 96,255,251,235,205,175, 95,160,203,223,197,165,101, 53, 52, 53, 63, -113,130,102, 74,190,255,251,198,244,243, 43,231, 87,230,151,207,177, 87, 0,144, 96,252, 1, 6,240, 97, 31,180, 21, 65, 68, 2, - 96,188, 44, 89,178, 4, 88, 13, 20, 20, 20, 0,107,110, 72, 87, 96,208, 14,251,144, 93,250, 35, 55,255, 33,115, 15,240, 78, 0, -173, 11, 8, 96,154, 68, 19,129,167, 73,248, 86, 0, 60,105,210,214, 84,221,197, 90,173,181,169,167,119,194,182,186, 37,251, 50, -156, 76, 94,108,220,246,241,253, 39, 92, 37, 50, 80, 60,212,207, 3, 50,236, 3,175, 0,128,160,173,190,146,248, 66,124,180,184, -199, 15,208, 70,255,145, 59, 4, 0, 1,196,132,220, 67,255,248,229, 27, 51, 19, 35,176, 66,254,247,255,255,159,127,160, 73,251, -139, 23,206, 59, 57,131,110,176,251,251,255, 63, 51, 19,243,231,111,191,254,252,250,137,179, 38,255,251, 87, 81,250,185,168,208, - 71, 72,101, 98,101,198, 3,185, 92, 21,216, 9, 48,212,188,243,231,239, 95, 98,154,255, 88,167,130,137,109, 14, 99,155,134, 34, -168, 87, 80, 80, 16, 88,238, 3,123, 0,192,106, 64, 84, 84, 20, 50, 33, 12, 44,158, 62,124,248, 64,176, 2, 72,107, 93, 1, 44, -247,249, 21, 24,128,213, 64, 94,231,126, 96,233, 31,148,223,254,228,223,139,165,125,101,192,144, 36,166,249,111,108,172, 38,170, -164, 32, 38, 42,194, 6, 12,121,198,255,175,191,126,127,255,249, 7,145,254,237,237,216, 16,160,169,200,199, 39,204, 37, 42,245, -251,221,251,243, 91,150,127,120,247,136,200, 52, 49,175, 35,135,161,208,133,229,207, 47,133,175, 12,175,152, 63, 77,122,126,154, -129,141,143,192,120,215,221, 79,111,152,190, 63, 98,251,102,162,226,168, 21,199,115, 79,240,128,168,232,121, 89,139,123, 31,153, - 62,255,252,255,253,219,146,127, 28, 60,188,120,218,254, 84, 1, 15, 31, 62, 4,146,192,198,184,136,136, 72, 96, 96, 32,164,149, - 74, 59,144,158, 46,136, 57,242, 67,252,108, 48,217,165, 63,114, 65, 15,175,132, 32, 55,182,211,212,191,192, 52,121,252,248,113, -200,184,191,177,177, 49, 3,248, 34,226,149,155,182, 17,159, 38, 55,174,111,112, 47,207,245,242,114, 22, 97,103,254,204,248,127, -231,173,199,199,175, 60, 37, 88,124,103, 38, 68,222,187,115, 7,216,240,135, 32, 96,233,143,181, 93, 63, 10,200, 43,250,113,141, -255, 0, 1, 64, 0, 33,134,101,128, 37,224,237,107,151, 20,164,132, 56, 89, 89,254,254,253, 7,190,162,153, 33, 45, 61, 27,216, - 37,248, 11,222, 13,240,237,199,143,235,183,238,177,177,225, 28, 20,249,243,251,157,161,214,125,120,166,207, 42,188,191,118,137, - 42,164,207, 96,162,115,247,196, 69, 77, 22,102, 81,130,205,127,180,162, 31, 40,200,128,180, 19, 24,127,243, 31, 45, 57, 2, 5, - 25,144,118,198,226, 2,127,255,254,149,144,144, 0,246, 0, 94,190,124, 9,100, 3, 75,150,183,111,223, 2, 73,200, 45,213,248, -245,190,126,113,167,166,101, 63,176, 7,208, 93,108,251,229,207,223,162,206,213, 19,203, 67,139,251,182,176,128,238,160, 33,220, -212,146, 20, 17, 96,101, 96,253,203,192,248,252,254,213,135,175, 62, 42,139, 10, 93,124,247,236,220,221,167,196, 52,255,131,147, -138, 88,133, 24,152,152, 25, 22,108,187,191,118, 90,105, 82,199,204, 34, 95,253,108,103,121,130,254, 5, 54,255,123,253,194, 24, - 62,112, 48, 48,178, 50,244,246,132,156, 62,188,203, 57,147,177, 61,151,241, 68, 25,158,230, 63, 16, 92,124, 33, 98,243,253,227, - 23, 78,230,111, 28, 28,202,193,172,192, 66,255, 35, 19,235, 31, 6,181,255,127,191,253,126,243,252,232,228,143,209, 81,202, 52, - 74,199,240,193,104, 77, 48,128, 8,218,130, 1, 77,243, 15,214, 5,251, 68,118, 11,200, 46,253, 25, 80, 71,255,209, 22,140,210, -116, 38,224,214,249, 99,240,160,206, 74, 10,219, 1, 27, 11,218,174,164, 68,112,239, 2, 48, 77,134,187,152,243,255, 19,252,198, -192,186,182, 63,119,218,150, 11,165, 30, 54, 9,125,203, 66,218, 22, 19,172,183,224,123,199,208,184,163, 43,250,105, 13, 0, 2, - 8,209, 3, 0,182,124, 63, 60,191,115,247,241, 91, 22, 86,102, 96, 31,224,247,159,191,231,206,157, 93,180,104,254,175,191,255, -127,255,253,199,198,194,244,234,253,151,167,215,143,115,226,152, 2, 6, 22,157,154,202, 15,161,205,127,112,191,127,237, 18, 53, -208, 0, 16,211,127, 32, 98, 98,250,103,161,127,253, 47,238, 78, 0, 90,243, 31,190, 10, 8, 88,244, 19, 44,253,209,154,255,240, - 21, 8,192,162,144, 96,105, 8,206,207,239,191,124,249,194,202,202, 10,105,254,255,251,247, 15, 66, 18, 83, 1, 44,238,175, 60, -247,244, 32,143, 4,104,226,151,151,133, 25, 88, 31,240,177,179,126,120,247, 4,216,252,103, 97, 98, 34,216,252,151, 21,226,189, -118,239,254,159, 95,191,216, 89,216,190,124,249,113,241,254, 51, 96,209, 79,176,244,135,248,215, 63,167,121,233,164,137,223,254, - 49,200, 42,203, 92,185,122, 2, 88,250, 19,233, 95, 32, 40, 82, 54,217,124,123, 31,195,199, 63, 12, 28, 34,187, 79, 93, 3,150, -254,192,162, 31,127,233, 15, 4,250,191,124,142,238, 62,197,240,235,243, 23,198,207,239,153,190,124,100,249,253,251,239, 39,246, - 31,223, 56,158,221, 95, 81,117, 91,193, 64, 13,207, 12, 48, 16,192, 83, 14, 7, 24,160, 9,226, 7,179,193, 96, 0,243, 9,164, -213, 15, 44,211, 25,192,179,193, 4, 39,132, 41, 41,253,129, 69,252,127,220, 75,230,105,183, 28, 8,152, 38,225,107,126,106,106, - 11,129,105, 82, 92, 92, 28,178, 46, 8, 34, 78, 48, 77,166, 56,232, 21,244, 76,252,252,242,149, 40,159,216,213,107,143,128,165, - 63,100, 25, 43,145,117, 30, 28, 32,143,234,140,246, 3, 40, 1, 91,150, 52,111,193,123,143, 8, 64, 0,161, 76,204,242,242,242, -158, 61,176,225,255,127, 63, 5, 41, 97, 94, 46,118, 45, 29, 3, 45,109,125, 22, 38,134, 47,223,255, 62,122,254,238,212,129,173, - 60,220, 92,184, 12,250,250,237,155,154,252,243, 31, 63, 57,254, 67,174,205,251,207,192,201,241, 3,152,140,223,125, 96, 7, 10, -240,114,255,209, 85,123,112,248,140, 33,208, 10,252,205,127,120,171, 31,200,101,253,255,155,225, 15,116,245,216, 95, 22, 46,130, -205,127,120,171, 31,194,253,248, 10,186,228, 0,207,118, 92,120, 29, 0, 36,129,253, 0, 32,249,238,221, 59, 62, 62, 62,200,248, - 15, 49,151,178,130, 87,253,183,103,134,218, 51, 76, 58, 60,173,218, 59,164,120,226,178,142,108, 96, 15,128,141,157,131, 96,243, -255,218,163, 87, 42,178, 34,123,247,156, 96, 0,111,191, 4,146,191,127, 66,251,218,172,184,181, 67,154,255, 45, 73,206,121,245, - 11,100,149, 24, 73,242, 47,164,249,239,182,126,222,174,232, 72, 70, 25, 11, 6,240,150, 96, 6,240,225, 16, 16, 5,190, 60, 60, -120,156,173,247,179,236,226,246, 45, 63,212,143, 41,168,234,124,226,100,184,207,240,240,243,131,215,175,219,254,126,121, 47, 83, - 24, 87,140, 63,160,166, 79,159, 14, 44,238,191,127,255, 14, 47,194,128, 92,160,224,144,200, 72,144, 86,255, 75,240, 54,105, 98, -102,131,129,237,101,242, 74,127, 6,216,229,239,120, 10, 62, 82,247, 18, 19, 9,128,105,178,181,161,102,221,230,237,238, 54, 70, -240, 52, 9, 68,198,247,238,121, 4,199, 60,122,251, 77, 78,152, 11,127,243,191, 96,214,230,170,100, 55, 41, 9, 7, 72, 45, 2, -113, 42,158,190, 20,145,221,130,209,126, 0, 21,235, 3, 52, 17,128, 0, 66, 95,153,195,199,203,115,238,192,134,251, 50,234, 74, -170,154,124,220,156,255,254, 51,124,255,249,235,222,189,123,175,239, 93,224,229,225,102,194,221,170,229,228,224, 88,181,195, 30, - 79, 27, 31,168,151,155,155, 64,115, 15,178, 6, 20,216,228,255,247,247, 55,168,244, 7,131,223,140,172,184, 14, 99, 64, 6,144, -245,103,192, 38, 48,188, 28, 36,178,244,135,215, 1,240,205, 95,192, 58, 0,103, 0,225,168, 3, 22,195, 54, 66,205,110,131,237, -137,253,253, 5,255, 53,228,192,230,255,169, 55, 31, 46,220, 6, 13,248,192,203,125,130,165, 63, 4, 0,155,255,107,141,184,115, - 2, 53,200,240, 47,176,249, 95,188,105, 21, 99,107,253,118,113,243, 9, 95,174,192,197, 13, 89, 88,101, 56, 8,159,248, 4,236, - 7,108,223,244,227,201,251,187,175,223, 62,127,121,139,135,249, 47,159,181,158,173, 99,156, 35, 77, 19,238,128,111,250, 37, 99, - 13,104,122,186, 32, 25,165, 63,195,128, 78,105, 2,211,164,165,165, 37, 90,154, 4,150,254, 12,160,169, 96, 46,252,122,129,205, -127,215, 61, 39,163,235, 23,217,217,217,137,163,246, 38,201,174,174, 32,117, 0,193, 0,193,172, 44, 71,235, 12, 60,229, 62,242, - 76, 0, 64, 0, 97, 41,223,128,237,223,159,239, 30,159, 59, 0, 90, 46, 2,185,112,153,157,157, 29,115,110, 22, 13,176,178,178, -242, 19,113,228, 3, 30, 0, 25,240, 97, 6, 54,249,255,124, 99, 70, 42,250,137, 57,177, 26, 50,224, 3, 44, 10,145, 75, 67, 98, -138,126,126, 81,169, 95,184,167,181,241,131,232,230,197,183,111, 92, 37,219,191,167,110, 61,134,100, 51,228,210,159, 96,209, 15, - 1,113, 70,220,228,249, 23, 20,167,253,101,144,162, 31, 94,250, 19, 89,244,195,129,167, 98, 8, 3,164,114, 35,110,141, 12,176, -248,134,108,250, 5,182,247,225,187,127,129, 12, 72,243, 31,200, 24,252,135, 58,144,177, 6,148, 22,141,116, 90, 3,172,105,146, - 96,209, 15, 1,174, 53,179,169, 88,244,147, 84, 29,142,150,245,184, 0,218,141,240, 12, 24,243,192, 0, 1,132,189,129,203,194, -194,130,107,172,134, 22, 0, 50,202, 15, 41,250, 25, 72, 44,250, 33,163,222,228, 21,133, 12,160,149, 75,255,136,233, 94, 96, 5, -175,222,125, 36,222, 34,100, 0, 25,229, 39,175,232,167,196,191,144, 81,254,205, 95,190,144, 93,244,143,130,225, 10, 32, 75, 60, - 31,189,253, 70, 70,209, 15, 41,127,225,163, 61, 67,183,254, 27,174,117, 0, 30, 89,128, 0, 26,189, 19,120, 20,140,130, 81, 48, - 10, 70, 40, 0, 8,160,209, 27,193, 70,193, 40, 24, 5,163, 96,132, 2,128, 0, 26,173, 0, 70,193, 40, 24, 5,163, 96,132, 2, -128, 0, 26,173, 0, 70,193, 40, 24, 5,163, 96,132, 2,128, 0, 26,173, 0, 70,193, 40, 24, 5,163, 96,132, 2,128, 0, 26,248, - 75,225, 71,154,222, 31, 47, 30, 19,175,151, 67, 66,118, 52,156, 71,245,142,234, 29,213, 75,163, 75,225, 1, 2,104, 80,247, 0, - 72,221, 5,126,239,222,189, 61, 48, 0,100,143, 86,239,120,192,199,143, 31, 31, 61,122,116,252,248,241,115,231,206, 1, 25,228, - 25, 66,197, 83,222, 70,193, 32, 7, 55,111,222, 36, 73,113, 70, 70, 6,217, 22,145,173,119, 20,144, 10, 0, 2,136,101,208,186, -140,212, 18, 28,168,190,163,163, 35, 44, 44, 12, 89,187,146,146, 18,241,218,129, 96,245,234,213,161,161,161, 74, 96,128, 95,125, - 90, 90, 26, 65, 51,129,142,193,186, 26,122,247,238,249,196,232,125,255,158,155, 70, 97,251,234,213,171,159, 63,127, 50, 50, 50, -114,112,112,252,248,241, 3, 88, 1,156, 62,125, 90, 95, 95, 95, 69, 69,133, 36,115,136, 57, 42, 3, 92,145,103, 18,163,108,230, -204,233,212,214,155,142, 67, 49,250,209, 99, 4,211, 21, 67, 61, 35, 99, 19, 70,229, 87,207, 24,118, 61,148,129, 93,131,160,243, -220,221, 65, 71,234,146,119,120, 53,228, 44,232,244,116, 65, 74, 86,214, 3, 75,213,254,254,126,130, 27,238, 82, 83,211,128,222, -194,140,213,146,146, 98, 98,180,195, 83,197,132, 9, 19,236,237,237,129,229,248,178,101,203, 62,125,250, 68,208, 82,148, 34,137, -133, 57,194,138, 45, 61, 35,189,107, 71,119,137,107, 9, 68,112,246,236, 89, 88,245,198,196,128,118, 41,115,115, 99,201, 41,144, -155,157, 18, 18, 18, 70,119, 36, 32, 3,200,190, 48,248,234,127,128, 0,194, 94, 1, 96, 30, 54, 66,163,227, 71,168, 88, 1,192, - 75,127,160, 59, 33,123, 82,128, 38, 16, 89, 1, 64, 50, 57,164, 56,131,156,123, 85, 94, 94, 78, 88,239,106, 33, 66, 6,227, 12, -177,175,190, 4,110, 81,103, 32,226,144, 52,242,238,193, 0,182,253,197,196,160, 23, 60,112,114,114, 2, 43,131, 15, 31, 62,240, -243,243,159, 58, 5,186, 60,153,152, 58, 0, 24,188,144, 80, 2,134, 88,112,112, 48, 48,192, 9,214, 4,155, 54,109,128, 48,252, -252, 2,112,177,113,233,253,126, 44, 7, 26, 36, 86, 83,224,108,100, 46,144,129, 75,239,142, 29, 40,151,155, 29, 58,116,168,173, -173, 13, 57,160,150, 44, 89,130, 63, 97,116,118,118,118,176,119,130, 11,226, 80,148, 44, 80,207, 72,106,146,166,127, 38, 66, 46, -253,129, 94, 6,198,248,210,165, 75,143, 28, 57,226, 21, 85,141, 75,241, 49,140, 43,180,215,175, 6,149,254,255,254,253,155, 53, -107, 22, 80, 59,159,156, 61,214, 66, 31,222, 29,188,113,227, 6,144, 27, 25, 25, 9,100, 71, 69, 69, 17, 83,109,244,236,134,222, - 66,252, 98,231,115,160,222,101,249, 92, 64, 35,203, 61,202, 24,192,177,183,124,225,178, 12,123,124,125, 2, 99, 99, 99,226,155, -122,163,165, 63, 50, 0, 8, 32, 38,172,197, 10, 48,123, 3, 35, 27, 45,195, 19, 57, 32, 67,201,216, 11,178, 94, 72, 99,156,120, -189, 64, 7,187,128, 1,164, 14, 32, 41, 65, 64, 74,127,160,117,160,235, 41,192,150, 18,233, 11,198,176,247, 16,132, 71, 4, 23, -224,217, 50, 29,130,240,136, 16, 44,253,255,131, 1,241,163, 49,239,223,191, 7,150,245,192, 10, 32, 41, 41, 41, 58, 58,154,141, -141, 13, 88, 7, 0,251, 1, 64,239, 51, 51, 51, 19, 60, 94,255,218,181,107, 64,123,215,172, 89, 3, 9, 46,160,165,107,215,174, - 5, 54,244,128,226,116, 78,202,104,149, 1,141,154, 32,192,210, 31,152, 36,194,111,132,129, 90,250,168,129, 95,241,179, 28,173, - 79,128, 11, 0,195,167,180,180, 84, 81, 81,145, 12, 55, 0,245, 2,219,254,194,194,123, 41,111,251,195, 75,127,146,180,195, 75, -255,226,226, 98, 60,218,145,147, 31,176,249,111,103,103, 7,100, 0,235, 0, 96, 63,128, 96,185,129,166, 55,220, 18,212, 42, 93, -150,207, 9,236, 7,148,185,151,226,215, 11,108,251, 3,237, 2,118,199, 93, 48, 0, 68,106,180,249,143,167,244, 7, 2,128, 0, - 98,194,214,229,132, 94, 12, 13,105, 71,195,155,123,196, 20,199,144, 60, 67, 73,126, 35,111, 0, 7,107,153, 78,170, 22,120,229, - 1,108,254, 19, 60,255,118, 96, 1,188,244, 7,146, 79,159, 66, 47,220,120,242,228, 9,254,204, 6,108,251,127,251,246,141,137, -137, 9,232, 71, 32,251,217,179,103,172,172,172, 44, 96, 0,100, 64,142,234, 68,219,208,143,150, 81, 39, 78,156, 8, 44,250, 67, - 66, 66,128, 5, 10,208, 16, 96,225, 8,100, 3,165, 38, 77,154, 52,204,114, 11,188,244, 7,178,129,101, 55,188,109, 1, 9,124, -120, 7,145,200,242, 5,168, 12, 24, 98,192, 68, 69,222,172, 73,101,101, 37, 80, 47,158,168,193, 83,250,247,245,245, 1,163, 12, - 88,145, 0,139,239,195,135, 15, 51,128, 79,100, 34,190,244,135,104, 7,166,153, 51,103,206, 64,180, 19,180, 17,168, 62, 34, 34, - 2,194, 5,214, 1, 14, 14, 14, 64,219, 55,110,220, 72,112, 32, 17,216,252,103, 96,100, 88,154, 7, 61,127, 2,216, 15,136,180, -102, 7,245, 3,240, 2, 60,165,196,104,183, 0,173,244, 79, 43, 71, 47, 21, 1, 2,136, 5,107, 98,133, 95, 12,125, 15,233, 98, -104,130,105,157, 90,165, 63, 85, 42, 0, 74, 0,176,242, 32,219, 35,116, 3,192,162, 4, 88,244,191,120, 1,189,133, 17,153,141, - 11,188,126,253, 26,152,147,129, 45,253, 59,119,238, 0,181, 3,243,234,175, 95,191,128,217, 15, 88, 1, 0,201,191,127,255, 2, -171,135,245,235,215,227,138,232,189,123, 65,237, 80, 96,137,143,172, 0,194,134, 20, 79,120, 82, 8,242, 8, 15, 46, 54,158,198, - 62,174,177, 32, 60,131, 63,104, 35, 63,144, 54, 41, 73,105,160,131,189,147, 17,181, 66,133,140,251,223, 35,102,120, 16,169, 9, - 15,169, 35, 33, 37, 29, 48, 12,137,111,147, 66,244,170,170,170, 50, 16, 61,221,130, 12, 50, 51, 51,225,131, 93, 64, 54,176,248, - 6, 26, 66,124,233,111,111, 13, 58,146, 17,216,246, 47, 41, 41, 1, 54,204, 33,218,125,253, 82,241, 95,236, 7,111,254,195, 1, -100, 44,104,219,182,109, 26, 26, 26,192, 38, 59,126,189,225,150, 40, 7,115,129,199,130, 24,150, 47, 59,127, 83,226, 38,126,189, -163,128,140,210, 31, 8, 0, 2, 8,251, 28, 0,176, 75, 5,105,248,195, 47,134, 38,169,244,199,218, 14,197, 51, 60,141, 75, 47, -178, 56,237, 14,252, 3,250, 20,126,236, 56,178, 27,200, 27,177,253,191, 74,144,108,151,124,241, 33, 60,225, 9,119, 36, 90,137, - 32, 35, 35,131,172, 0,107,112,189,123,247,142,151,151, 23, 72, 30, 59,118, 12, 88, 13, 0, 75,127, 96,147, 31,114,245, 13,176, -104,251,253,251,247,207,159, 63,241, 52, 81, 33,189, 34,204, 48, 1,138,172, 89,179, 6, 40,139, 39,184, 40,159, 3, 0,150,245, -200,197, 61,132, 77,100, 53, 0, 44,146, 72,174, 3,192, 67,252,144,148,143,152, 76, 2, 11, 18, 63,183,132, 92, 71, 50,192, 46, -118, 39,111, 80, 2,216, 9,128,204, 94, 16,175, 29, 24,149,240,241,119, 27, 27, 27, 96, 9, 78, 82,219, 31,168,253,207,159, 63, -200,218, 15, 30,253,219,211,153, 65,176,249, 15, 41,241, 49, 65,127,127,191,119,116, 13, 46,189, 72,163,255,168,253, 3, 34,244, -142, 2,178, 1, 64, 0,177,224, 73,181,144,230, 63,157,219,254,200, 35, 81,244, 89,202,137, 60,218,131,188, 62, 4,127,137,134, -179, 63, 11, 27,253, 39,163, 38,128,143,254,227,175, 9,162,163,163,185,185,185,121,120,120,128,165, 57, 63, 63,191,160,160, 32, -176,121, 21, 27, 27, 11,145,229,224,224,112,115,115, 3,250, 2,243,152, 63, 96,137, 15, 44,253,127,252,248, 1,212,197,206,206, - 14,204,222,255, 65,151,125,254, 5,138, 3, 75,127, 32,131,224, 0, 5,174, 97, 64, 96, 67,149, 14,131,102,184,102,131,137, 1, -144, 58,128,132,120,108,194,226,217,176,235,161,224,169, 41, 98, 13, 65,110,254,195,171,109, 34, 27, 22,200,205,127,172, 85, 62, -126,176,108,217, 50,136, 33,192, 58,128,140,161,127, 72,203, 15,216, 53, 44, 44, 44, 60,115,230, 12, 76, 59,129,228, 49,113,226, - 68,180, 75, 58, 87,172, 88,113,240,224, 65, 96,186,130,180, 72,240,172, 79,159, 48,113, 66,132, 5, 74,243, 63,122,210,183, 21, -199,126, 3,245, 26, 70, 25,102,216,103, 16,191,182,125, 20, 16,217,252, 7, 2,128, 0, 98,194,211, 46,134, 36, 2,248,100, 0, -254, 97,184,242,242,114,242,220,135, 75,175, 18,248, 62, 82,226, 91,241,104, 0,178, 34,136,212, 97, 83, 98, 22,119, 14, 6, 48, -107,214,172,190,190, 62, 56, 23, 82,250,251,129, 1,144, 1,204,114, 88,117, 1, 43, 12, 96, 41,255,254,253,251, 55,111,222, 0, -201,111, 96,240,229,203,151, 79,159, 62,125,252,248, 17,216, 27, 0,246, 0,240, 92,233, 3, 44,128,128, 45,125,130,149,232,160, - 2,135,144, 0, 92, 16,232,125, 56, 27,207,184, 54,242,184, 63,114, 91,158,164,102, 1,154, 98, 96,113, 12, 12, 67,178,103, 2, -128,122,137, 73,210,192, 18, 31,152, 6, 32, 19,191,192, 58, 0,226,119,226, 47, 93,168, 46,183, 7,106,255,183, 82, 0,168, 29, -216,244,134,104, 63,116,236, 31,172, 57,142,179,249, 15, 31,240, 1,141,219, 44, 95,154,153,153, 9, 52,167,160,160,128,160,213, -160,230, 63, 3,227, 82, 88,243, 63,106,226, 55,230,136,143,203,143,253, 2,234,237,220,209, 53, 90,136,211,168,244, 7, 2,128, - 0, 98,193, 85,190,192,135,254,225,147, 1,248, 11, 71, 72, 57, 14,105,203,147, 58, 92,131,166, 23,210, 39, 0, 10,146, 55,236, - 3, 95, 6, 74, 79, 0,105,248,147, 55,254, 3,105,248, 19, 51,254, 3,207,222, 16, 70, 99, 99,227,252,249,243, 97, 67, 40,126, - 16, 6,176,249,143,171, 2, 16, 22, 22,126,251,246, 45,176,189,255,250,245,107, 96, 15, 0,216,190,131,244, 0,190,126,253, 10, -172, 9,128,165, 63,176, 26, 40, 43,195, 57,231, 6,105,230, 99, 93, 34, 12,145,197,227,102,170,204, 1, 16, 41,142, 12, 32,195, - 38,232, 5, 92,117,117,107,107,171,136,136, 8, 77,147, 4,102,243, 31, 14, 8,206, 4, 96, 54,255, 73,106,251, 3,251,136, 49, - 49, 49,192,200, 5,122,191,170,170, 10,216,251, 33,254, 66,155,154, 10,251, 3, 7, 14, 48,174, 1,221,207,186,171,134,215,173, -229, 51, 80,123,107, 39,168, 21,143,191, 11, 2, 89,251, 15,110,245, 47, 59,120,240,240,127,198,255,133, 5,133,234,234,234,196, - 88, 10,212, 27, 97,197,138,104,245, 51,128,244,138,187, 73,144, 49,243, 49, 10,176,148,231,157, 21,152, 21, 3,100,132, 0, 32, -128, 88,240,180,253,129,165, 63,242,100, 0,193,174, 43,114, 57, 78, 94, 63, 0,162,151,194,145, 31,136,155,201, 44,199, 7,125, -130,131, 12, 82,193,175,234, 78, 76, 76, 68, 27,159, 1, 10, 66,242, 33, 38,144,145,145,185,115,231, 14,176,196, 7, 54,249,127, -255,254, 13, 25,250,255,241,227, 7,100, 45, 41,100, 78, 88, 89, 89, 25, 79,205, 10, 52, 28,210, 9,128,167, 4, 96, 80,163,137, - 96, 5,180,152, 3, 64, 30, 17,194, 21, 86, 88,197,129, 1, 8,172, 3,194,195,195, 87,174, 92, 73,252, 64, 37, 26,187,163,163, - 35,237,105,122, 24, 48,165, 97,219, 8,230,238,238,126,255,254,125,180, 93, 8, 16, 0, 20,103,192,187, 41, 44, 52,116,117,104, -168,179,171,235, 61,204,201,134,183,111,157, 25, 24,222,167,167,227,204,137,240,171, 16, 33,157,140, 93,187,118, 49,144,114,157, - 25, 19, 19, 35,168, 17, 3, 41,253, 47,253,153,191, 31,116, 17, 38,176,244, 39, 38,107, 64,146, 19,176,213, 15, 36, 11,139, 10, -213,213,212,137,180,180,180,172, 4,172,151, 1,216,234,135,232,149,112,147, 4,141, 54,141, 22,254,180, 7, 0, 1,196,130,171, - 59, 15,159,248,133, 47,243, 32,102, 76,156, 42, 99, 65,164,238, 0, 24,129, 0, 62,228, 2, 47,227, 32,187, 55,144, 5,177,142, -153, 2,235,134,109,219,182,253,249,243,231,195,135, 15,144, 57, 0, 6,240,234, 32, 32, 23,200, 38, 24,119,249,249,249, 19, 39, - 78,132, 84, 3,200,227,254, 64,113, 90,215,157,192,226,158,152, 66, 31,107,105,136, 89, 49, 0,155,216, 68,150,254,152,165, 48, -242,132, 48,193, 78, 0,166,224,131, 7, 15, 24,136, 88, 98, 0, 31,128, 69,117,185, 11, 49,254, 5,246,243,128, 69, 63,242,224, - 59, 49, 0,168,253,223, 74, 65, 96,185, 15,100, 47,216,255,107,197,177, 95, 64,237,135,143,147, 48, 90,117,232,208,161,130,130, - 2, 34, 91,253,112, 0, 73,132, 43,143,255, 6,234,149,112,151,132,213, 39, 68,233,133,108,247,133, 76,239,163, 69,211,232, 78, - 96, 6,108,215,129,161,237, 4, 6, 8, 32, 22,172,217, 3,178,169, 10,185,233, 71,112, 8, 8, 61,123,144, 91, 7, 80,110, 8, -252, 52, 8, 34, 1,176,178,193, 58,132, 77, 76, 37,132, 57,230, 67,252, 40, 16,230,152, 15,145,163, 64,240,153,106,228,188,141, - 85, 16,107, 51,205,219,219,123,233,210,165,108,108,108, 63,127,254, 4,214, 1,255,254,253, 19, 16, 16,120,255,254, 61, 49,155, -159,181,180,180,128,230,239,222,189, 27,178,236, 7,178, 39, 96,200,101,176,125,251,246, 1, 3, 97,203,150, 45,100,148,254,240, -178,242, 94,121, 57,158,174,106,105,105, 41, 3,142,229,115,101,101,101,248,231, 0,210,211, 5,113,233, 5,182,253,137, 41,199, - 9,246,129,240, 0,247,150,207,112, 54, 73,165,255,180,105,211,200,139,142,158,238, 94, 80,147,159, 2,128,181,178,132,223, 62, - 61, 10,240, 0,128, 0,194,185, 12,148,160, 8, 77, 1, 61,119, 0, 96,206,245, 17, 93,205,144, 89,240,129,244,114,146,233, 90, -200,232, 22,164,114, 66, 27,233, 66, 22,196,239,163,232,232,232,187,119,239,238,223,191,255,251,247,239,127,255,254,245,245,245, - 5, 22,229,196,135,185, 43, 24, 64,218,110, 68, 54,252,169, 53, 7,128,139,141,167, 52, 68, 91,151, 66,204,110, 38, 6,248, 81, - 63,247, 66,145,131, 5,152, 11,210,158,166, 51,194, 54,130, 65,164,176,246,180,240,132,191,179,179, 51,193, 4, 73,134, 20,220, -191,192, 24, 9, 12, 12,132,156, 62, 68, 42, 96, 10,127, 15,212,238,231,159, 6,105, 43, 64, 22,125, 34, 31,243, 64, 11, 96, 28, - 99, 68,182, 94, 96, 3, 31, 87, 61, 7,145, 26, 5,248, 1, 64, 0, 13,198,195,224,200,104,182,208,191, 17, 74,137,141,148,156, -242, 70, 45,159, 42,131, 1,154,224,175, 95,191,152,193,128,218, 17, 58,125,128,244, 98, 73, 72,144,227,195, 8,131,122,232,193, - 80,200,189, 67, 96,233, 15,169,104, 7,231, 22, 83, 10,247,202,128,181, 19, 30,122,167,250,114, 76,252,231,252,208,174,178, 28, - 29, 20, 2, 2,128, 0, 26,189, 20,126, 20,140,130, 81, 48, 10, 70, 40, 0, 8,160,209, 27,193, 70,193, 40, 24, 5,163, 96,132, - 2,128, 0, 26,173, 0, 70,193, 40, 24, 5,163, 96,132, 2,128, 0, 98, 25, 13,130, 81, 48, 10, 70, 1, 50, 96,196,100,253,135, - 19,163, 96, 88, 1,128, 0, 26,237, 1,140, 80,128,245,112,240, 81, 48, 10, 24,193,152, 17,116, 6, 52, 35, 6, 24,221,155, 53, -220, 0, 64, 0, 33, 38,129, 71, 47, 89, 30,213, 59,156,244,198,249,233, 34,154, 57, 76, 76,144,229,170,240, 21,141,255, 97, 0, +127,255,254,126,252,248,228,198,149, 51, 95,126, 74,154, 24,219, 14,126,151, 3, 75,255,130,130, 2, 96,135, 18,207, 97,206,120, + 0,153, 23,202,143, 12,128,255,168, 96, 6,112,192,205,194,118,138, 53,252, 82,120,152,170,255,176,253,137,136,208, 30,225,151, +194, 67, 0,242, 53,144,104,235,254, 1, 2,136,126, 61, 0, 38, 6,234,111,230,246,114,251,253,159,129,153,133,153,213,202,156, + 81, 76,148,137,133,133,137,157,149, 89, 67,141,233,225,227, 63,102,198, 76,194, 66, 28,219,247,129,206, 20,100,254,255,253,255, +255,127, 18,210, 56, 75,255, 75,103,206, 40, 72,201, 92, 58,126,226,228,175,223,239,223,188,103, 99,231,213, 52,180,214,183,118, +219,191, 25,180, 67,152, 70,117, 0,218,133,242,144,179, 24, 83, 82, 82, 6,127, 53,112,225,252, 30,118,150,119, 44, 76,191,126, +252,248,251,241, 43,167,141, 29,225,147,123,175,221, 56,199,203,241,214,201,154, 93, 65, 94,153,143,143,255,247,159, 63,175, 95, +191, 17,127,244,248,246,221,123,199,142,190,179,178,246, 31,228,205,127, 6,216,113,202,192, 10, 0,207,141, 46,131, 13, 0, 91, + 48,107,215,174, 69, 57,254,136,134,165, 33,236, 2, 86, 82,181, 61, 90,199,120, 50, 5, 86,136, 51,192, 46, 91, 67,152,148, 50, +227,171, 89,248,100,172,213,234,246,237,219, 33,108, 15, 15,143, 29, 59,118, 96,101,143,150,254,152, 92,120, 53, 0, 16, 64,216, + 43,128,163, 71, 78, 90,219,152, 83,215, 29,255, 8,221,204, 69,228, 13, 77, 40,149, 10, 11,243,251,119, 44, 18, 98,172, 18, 98, +108, 95,190,176,114,176,178,252,101, 97, 55,210,101, 52,208, 99,102, 98,100, 5,109, 34,103,101, 99,101,250,201,200,193,246,231, + 27,206,210,255,200,190,189,138,146,162, 87, 46, 94,169,110,110,128,139,183, 54,182, 49, 49, 51, 26, 25, 27,109,223,177,151, 96, + 5,240,239,223, 63, 96, 33,126,231,206, 29, 78, 78, 78, 93, 93, 93,130,103,215, 48, 96, 92, 40, 15,191,109,117,206,156, 57, 3, + 85, 7,156, 63,127,222,208,208, 16,191,154, 43,215,206,253,255,249, 64, 94,242, 7, 63, 31, 59, 19, 19,215,247,239,127,222,190, +251,126,112,207, 4, 14, 62, 35,115, 51, 59, 60, 26, 57,152, 95,171, 41,254,215,214,214,124,254,226,253,217,243,231,190,124,249, +202,207,207,171,164, 36,207,196,204,250,247,239,163,243, 23,142, 24, 26,216, 12,230,230, 63,252,118, 23, 96, 63, 0, 88, 7, 16, +121,173, 10, 70, 67,150,222, 61, 0, 72,210, 93,179,102, 13,121,247,106, 17, 15,224,141,241,153, 51,103,144,106, 15,147,124, 48, + 68,239,169,118, 30,180, 70,162,132, 0,147,180, 16,211,224, 9,207,161, 11,224, 37, 62, 90,125, 0, 16, 64, 56,123, 0,192, 58, + 0, 72,146, 90, 13, 28,201,187,141, 85,220,102,146, 42,241, 57, 4,210,131, 35,166, 26,216,115, 64,140,149,133, 85, 86,234,203, +231,207,172,103,175,200,130,174, 76,101,100,102, 99,253,163,173,250, 77, 93,149,153,145,129,137,141,149,157,141,153,209, 88,239, +151,144,224,191, 67,167,177, 27,162,169, 40,254,240,238, 43,228,210, 31, 8,170,235,171,218,154,187, 36, 45,245, 4, 5,120,241, +187,225,251,247,239,192, 18,225,225,195,135, 16, 46,176,233,225,229,229,229,239, 79,160, 73,139,118,163, 36, 50,232,237,237, 45, + 46, 46,166,243, 54,119, 96,233, 15,191, 82, 3, 15,248,249,245,169,162,244,119, 17, 97,110, 25,105, 9, 46,110,174,135, 15,159, +254,253,251, 79, 90,138,247,234,245,227, 23, 56,185, 13,116,177, 95,252,112,249,242, 17, 61,181, 95,114,114,138,215,174, 63, 60, +123,246,250,235, 55,159,129,241, 44, 40,200,249,237,219, 23, 67, 67,237, 15, 31, 62, 62, 61,123,254,226,101, 78,125, 93,227, 65, +219,252,135, 95,228, 66,240, 90, 71,228,145, 13,180,163,140,129,108,248,112, 7, 25,227, 72,205,205,205,190,190,190,164,158,214, + 0,172, 3,128,246,174, 90,181, 10,215,113,108, 12,224,179,148,209,122, 6,144, 43, 33,129,226,104,109, 2, 96, 65,143,121,118, + 0,252,120, 37,160,127,211,211, 51, 72,234,100, 32,235, 53,171,252,114,186,157, 7, 94,244,143,150,218,212,106,254, 35, 71, 25, + 90,244, 1, 4, 16,129, 80, 6, 86, 3,144,154,128, 72,128,181,160, 39,178,244,135,128,131, 7, 15, 62, 5, 3, 98,206,114, 98, +254,255,157,133,241, 7, 27, 43,235,249, 43,162,204, 44, 44,188,108,223,248, 56,190,243,242,255,125,250,148,151,157,141,131,157, +157, 61,212,239,143,159, 39,147,180, 20, 59, 23, 39,246,187, 41,190,125,120,252,226,221,151,226,186, 58, 76,169, 15, 31,223,189, +127,253,130,145, 80,199,101,245,234,213,240,210, 31, 2,182,109,219,118,253,250,117,252,205,127,228,243,159, 33,205,255,143, 48, + 0,100,215,215,215,147,125, 84, 28,217,165, 63, 65,101,192,230, 63, 7,203,115, 78, 78, 86, 14,118, 54, 69, 69, 5, 19, 51, 51, + 65, 65, 65, 22, 22,102, 54, 54,102, 33, 65,142,167,143, 31,224,210,200,242,255, 41, 47, 15,231,183,239,127,174, 92,185,253,236, +197,199, 71, 79, 62,221,186,247,235,249,139,207,175, 95,127,184,125,235,158,138,178,178,180, 20,223,219,215,143, 6,103, 22,130, +140,254, 35,139, 0,123, 3, 40,119,187,227,105,219,130,151,163, 97,189, 80,158,188, 14, 4,176, 80,134,119, 22,137, 4,123,247, +238, 5, 38, 81,130, 87, 51, 34, 95,254,142,124, 33, 48,178,117,184,172,134, 24, 11,185, 59,140,188, 94,209,170, 66,110,228, 86, + 63,164,244, 7,182,253,165, 64,205,127,124,193,229,225,225,225,233,233, 9, 25,231,129, 48, 32,108, 15, 24, 24,173, 3,240, 3, +128, 0, 34,106, 14,128,188,222, 0,217,224,246,109, 80, 55, 2, 88, 7, 72, 75, 75,227,111,147,178,176,176,176, 50,179,178,178, + 50,218, 89, 51,124,251,250,243,254, 93, 54, 96,135,128,229, 47,139,133,249,127, 96,173,192,204,204,196,240,159,241,221,123,134, +211,231, 88, 64, 55,129, 96,171,236,206,157,191,251,229,203, 47, 76,241,142,250,122,118,118,142,239,223, 63,254,253, 71,224, 62, +225,115,231,206, 97, 10,158, 61,123, 86, 83, 83,147,200,230, 63,114,155,110,243,230,205,112, 53, 52,234, 4,160, 13,245,192, 75, +127,130, 25,248,253,187, 87, 34,188,140,127,254,254,251,245,251,207,235, 55,239, 88,217, 56,126,254,252,253,251,207,223, 63,127, +254,253,249,251,255,195,251, 55,184, 52,178,177,126,229,224,148,121,251,246,227,167,207,223,222,189,255,206, 39,172,111,165,167, +119,234,232, 14,169, 95,127, 62,126,250,168,174,174,204,206,198,242,245,243,187,193,217,252, 7,150, 80,104,151, 41, 2,123, 0, + 68,206, 4, 0,107, 14,204, 59, 32,225,199, 74,227, 2,240,203, 21, 50, 50,132,156,157, 17,167,191, 1,115, 4,144,220,180,105, +211,155, 55,111,136,156,151,218,179,103, 15,164,244,135,168, 95,187,118, 45,174, 82, 24,185,255,135,121, 33, 48, 68, 28,114, 45, + 48, 86, 19, 32,199,136, 2, 73, 72,191, 1,171, 7,113,165,103,160,243, 66, 44,247,172,100, 96, 8,239,255,106, 90,249, 5,171, + 94,179,112,236, 30, 68, 30,235,199, 53, 31, 48, 90,202, 35,143,252,160,245, 0, 0, 2,136,250,253, 44,180,246, 62, 73,205,127, + 72,251, 23, 94, 13, 0, 51, 15,254,126, 0, 51, 51,139,133,217, 63,102, 38,150,211,103, 56,110,222,230,240,118,103,240,241,100, +240,245, 96,148, 20,103,227, 96, 99, 7, 34, 78, 14,118,105, 73, 32,131, 3,200,198,106, 66,109,117, 77,103,123, 19,102,182, 81, + 86,148,231, 23,224,230,248,247,235,203,183,223,180,136,143, 35, 96, 0, 47,244,225, 0,200,125,251,246, 45,176,167, 79,187,198, + 62,114,179, 14,194,133,244,196, 9,142, 45,252,253,203,240,245,219,239,175, 95,127,125,250,244,243,229,203,247,207,158,189,249, +252,249,231,151, 47,191,129, 53,232,215,175,191, 63,126,248,136,115,224,232,231,159, 31, 63,254,254,254,253,139,151,151, 77, 86, +154,143,139, 27,212,220, 83, 82, 86,144,145,226,227,231,227,248,255,255,239,239, 63,255,126,254,252, 58, 56,155,255, 69, 69, 69, + 88, 75,118,130,157, 0,204,187, 36, 33, 0, 40,184,135,184, 83,187,193, 35, 42, 8, 0, 41,124,129,213, 0,176, 76, 39,166,127, + 12,108,251,175, 89,179, 6, 94,250, 3,201,144,144, 16, 92,197, 55,208,112,204, 43, 33, 33,109, 2,184, 56,208, 61,132, 14,211, +254,143, 54,144,139, 60,252,133, 75,143,136,136, 8, 35,172,157, 79,170,222, 81, 64, 82,233,207,128, 49, 7, 0, 16, 64, 68,245, + 0,232,214,246,135, 21, 52,127, 33,151, 74, 19,118,152,217, 63, 49, 81,246, 79,159, 88,216, 89,254,176,179, 49, 31, 56,201,230, +237,200, 10,108,251,127,250,196,122,244, 12, 55, 31, 7,232, 42, 9, 15,151, 95,254,222,255,153,152,254, 47, 88, 75,148,237,192, +204,201,204,197,241,142, 85,132,235,247,147, 59, 79,255, 59, 57,216,225, 87, 15,108, 77, 31, 59,118, 12, 77,144,224, 53,200,144, + 75,189, 23, 44, 88,144,144,144, 0, 17,129,223, 43, 9, 20,193,127,205, 33, 37, 0,210,246,135, 52,211,224, 43,228, 48,135,122, +177, 2, 65, 33,209,103,247,175, 0,195,249,215,239,127, 63,126, 62,121,252,228,237,187,247,159,222,189,251,246,246,221,119, 32, + 18, 16, 82,192,165,241,229,155,255, 47, 94,190,209,212, 84,254,240,254, 61, 43, 11,211,167,207, 79,190,126,248,167,165,242, 85, + 92, 84,148,139,139,139,157,157,243,249,139,207,140,204,130,131, 51,243, 96,189,198, 29, 50, 19,128, 95, 35,164,127, 0,191, 75, + 18, 94,115, 48,144,114,165, 76, 88, 88, 24,188, 69, 12,185,181, 2, 24,107,193,193,193,192,234, 7,255,102, 31,180,182, 63, 4, + 32,247, 39,144, 1,174, 43, 33, 33,226,192,212, 2,185,123, 29, 34,254, 24,155,189, 64, 53, 89, 89,153,144,219,117,192,213,198, +127, 72,145, 14,212, 5,113, 63,158,154, 3,168,119,170,163, 96,248,132,111,104, 99, 65, 64, 17,136,222, 36, 71,214,209, 66,156, + 18,144, 86,222, 1,103,207,234,172, 0,214, 1,240,126, 0, 64, 0,177,208,162,232, 7,182,250, 33,179,193, 36, 53,255,145,218, +245,204,200, 99,124,120,238, 17, 19, 17, 97,102, 98,100, 22, 21, 97, 86, 85,254,255,236, 25, 11, 19, 51, 35, 43, 11, 11, 43, 11, +235,165,203,220, 66,220,172, 64,115,172,205,255,114,114,178,255,251,247,159,225,255, 95, 98,172, 6,102, 27, 30,113,217,151, 95, +254,127,189,115,128,133,145,185,180,190,154,152, 44,250, 24, 12,144,221,140,103,252,135, 1,188,222, 31, 82,220, 67, 74,127, 96, +123, 31, 88, 19, 64,164, 62,125,250, 4, 44,253,183,108,217, 66,204,133,242,228, 1,200,197, 79,192, 32,133, 76, 81, 18,211,246, +135, 0,125, 93,227,235, 87,206,254,127,250,233,219,247,223,239,217,127,252,103,120,255,227,199, 31, 96,111,224,213,155,111,207, +158,127,177,117,148,199,165,241,251, 47,145,123,247, 95, 43, 41,202, 41, 42,202,188,125,251, 70, 80,224,175,170, 42,191,152,168, + 18, 7, 39,231,135, 15, 95,206,158,187,241,228,233, 39, 9, 25,237,193,147, 97,254,131,111,187,132, 20,188,240,242, 23,235, 90, +126, 44,163, 21, 72, 43, 24,129,157, 0,248, 93,146, 16,208,215,215,183,107,215, 46, 92,122, 33, 49,146,158, 46, 8,179,238, 63, +114,145, 13,169, 0,128,173,120, 60,227, 63, 72,195, 71,123, 73,186,221, 8,215,149,144, 16,113, 72,241,141,171, 16,135, 44, 49, +154, 54,109, 58,100,134,195,192, 64, 31, 62,112, 15,107,209,227,188,105, 0,162,151, 41,236, 61, 68,111,168,147, 2, 60, 96,194, +250,175, 49, 48, 48,224,111,253, 3,243, 26,124,129,147,167,167, 39, 60,118, 70, 71,126,136, 4, 0, 1,196, 50, 72, 90,253, 16, + 16, 17, 17, 65,146,122, 96, 3,159,153, 25,132, 52,213,152, 12,117,255,178,179,113,128, 42, 0, 86, 86, 43,115, 6,118,118, 6, + 86,102,118, 17, 17, 14,102,230,175,127,255,254,251,247,143,168,145,156,111,239, 94,112,200,104,220,223,179, 68,148,133, 41,182, +186,138, 24, 45,156,156,156, 85, 85, 85, 36, 45, 3,133,220, 62,159,147,147, 3,225, 66,218,251,192,162,255,219,183,111, 73, 73, + 73, 64,246,180,105,211,104,183, 10, 8,114,249, 31,252, 14, 85,146, 86,149,200,200,171,159, 57,177, 83, 76, 4,216,112,103, 1, +143,237,252,253,244,249,215,187,247,223,101, 21,181,109,172,236,113,233,242,242, 10,222,181,125,254,137, 83, 87,109,173,245,229, +229,229,127,255,250, 97,104,160,199,205,207,255,240,222,163,167,207, 62, 28, 61,126,253,253,103,254, 64, 75,251,193,147, 43, 50, + 51, 32, 3, 44,140,153,192, 2, 17, 92,160,255, 67, 42,247,153,152, 24,241, 92,176, 14,186,156,253, 63,188, 0,100, 4,166, 60, +120, 39, 0,200, 0,150, 86, 30, 30,238,176, 74,134,193, 59,186, 22,115,172, 3, 87,169, 13,148,197, 95,250, 35, 3,160, 74, 92, +237,125, 60,169, 2,243, 74, 72,184, 56,158,203,194,224, 53, 7,176,252, 5, 55,255, 25,145,235, 15,252,246, 34,235, 93, 85,200, + 3, 10, 23, 14,113,136,212,170,194, 71,144,202, 96,231,197,223,184, 2, 4,121,220,127,116, 14,128, 12, 0, 16, 64,216, 43, 0, + 43,107, 51, 10,199,221,200,107,251,195,163,141, 72,240,238, 61,163,164, 56, 19,228,224,135, 93,123, 65, 3,253,236,236, 28,236, +108,236,190,158,140, 64,138,147,131,241,221, 91,230, 83,103,121,255,254,251, 43, 43, 67,120,136, 25,216,252,255,240,237,251,251, + 51,219, 84,101, 89,175, 60, 37, 97, 72, 26, 88, 15,153,129, 1,241, 90,192, 23,202,119, 66, 70,123,128,189, 1,115,115,115, 96, +107,209,223,223, 31,200,142,141,141,165, 93,243, 31, 62, 16, 4,105,205, 17, 51,242,131, 18,173,224, 82,254,214,141,107,207,238, + 61, 4,150,131,127,255,254,231,224, 20, 82,211,212, 9, 12, 32,112, 41,152,152,180,222,137, 83, 59,128, 61, 6, 93, 29, 37,105, + 41,145, 71,143, 95,190,191,124,247,230,173, 71,123,247, 93,122,248,244,127, 74,106,238,160,202, 21,255, 86, 10, 18, 47,235,187, + 9,175,222,187,243,225,157, 0,208,168,209,189, 5,200, 10,208,244, 98,237, 16, 32,151,149, 36,249,130,212, 44,140,235, 74, 72, + 98,174,138,132, 23,244,104,202,136,105, 94,252,123,184,118,205,132, 56, 80,247,197, 73, 14, 94,250,131,184, 94,166,224,209,210, + 11,184, 42,128,209,125, 0, 68,130, 89,157, 21,200,163, 64,200, 0, 32,128, 88,168,146,116,168, 2,200,104,243,158, 57,199,206, +193,198,230,235, 5,172, 1, 24,205, 76,254, 92,190,194,201, 4,190, 66,250,195, 7, 38, 41, 9,102, 38, 70,182,139,151,217, 56, +216, 25,126,253,254,245,240, 17, 39,193,210,255,238,173,243,230,206, 62, 44, 34,230,119,111,157, 98,121,177,166,172,180,178,171, +187,157, 70,158, 69,190, 80, 94, 71, 71,231,253,251,247, 64, 54,144,204,203,203,163,207, 46, 48, 82,139,126,228, 58, 0,136, 46, + 92, 62,251,242,197, 75,110,110,110, 60, 13,127,148,130, 64,207, 24,136,150, 46,153,121,237,230, 73, 73,113, 30, 14, 14,214, 47, + 95,126, 61,125,254,137,145, 69, 54, 37, 53,110, 56,103,190,115,197, 12,202,137,136,133,164,103,139,104, 87,130,131, 71,105,132, + 96,213, 6, 57,133, 35,174,242,154, 96, 57, 78,222, 93,146,112,111,134, 90,178,131, 28,252,253, 57, 8,141, 2,234, 1,159,152, + 90,200,172, 47,176, 14, 64, 22,132,179, 1, 2, 8,189, 2,160,228,184, 30, 90, 28,245, 67, 56,245, 48, 48,190,127,207,200, 37, +193, 40, 44,196,104, 98,244,155,131,141,153,157,237,183,176, 16, 7, 56, 15, 48, 90,152,252, 61,117,142, 21,212, 69,192,155,151, +128,165,191,182, 58, 95,113,126,211,119, 54,153,117,123,158, 42,171,129,218,242, 60,167,183, 20,151, 84,246,246,208,176, 14,128, + 92, 40, 15,108,242,195,187, 5, 67,229,154, 83,208,158, 47, 93,146,117, 69,199,164, 31, 57,118,240,245,219,215,223, 95,124,227, +224, 16,150, 81,212, 35,178,254, 24, 12,224,255,255,127, 12,228, 29,103,114,111, 1,116, 57,208,189,133,180,118, 36, 73,195, 62, +131, 4,184,249,132, 19,108,203,227,234, 92,143,206, 1, 16, 95, 7, 96,150,254, 64, 0, 16, 64, 67,254, 62,128,255, 12,160, 21, + 62,140, 76,192,152,255, 47, 36,240,255,224, 17, 22, 14,208,246, 95, 22, 63, 47, 96, 98,248, 39, 40,252,231,207, 95,198,127,255, +254,130,115, 47, 78,160,167,240,197, 59, 56,244, 11,139,170, 24, 15,119, 84,160,208,178,245,151, 33,117,192,239,191,235,104,237, +126, 50, 46,148, 31,210, 96, 72,148,248,179,222,119,164, 9, 86,160, 8,173, 22, 34, 95, 47,176,213, 79, 74,195,127,164,129,144, +236, 41,116, 27, 51, 24,177,117, 0, 46, 41,128, 0, 26,189, 20,126,200,128,209, 11, 97, 70,193, 40, 24, 5,212, 5, 0, 1, 52, +122, 35,216,144, 1,163,165,249, 40, 24, 5,163,128,186, 0, 32,128, 70, 79, 92, 26, 5,163, 96, 20,140,130, 17, 10, 0, 2,104, +180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,180, 2, 24, 5,163, 96, 20,140,130, 17, 10, 0, 2,104,224, 47,133,183, + 55,147,198,165,242,235,187, 23, 16, 6,183,144, 4,132,113,240,212, 83,100, 5, 63, 69,197,113,233,221,221, 15,221,103,235, 90, + 8, 93, 99,192,254,250, 37,145,246, 98, 2,226,237,197, 4,104,246,154, 24, 74,225, 82,249,230,254, 85, 8, 67, 68, 17,122, 46, +194,153,243,207,168,229, 95,143,221,216, 15,160,231,151,146,138,133, 29, 5, 60, 69, 28,106,254, 14,215, 52,106,197, 47,178,222, +155, 55,111, 34,159,143, 86, 88, 88,168,174,174, 78,163,116, 53,170,151, 42,122, 47, 95,190, 12, 97,232,234,234,146,170, 23,243, +138,167,209,112, 30, 16,189,120, 0, 64, 0, 97,159, 4,254,243,231,207,143, 31, 63, 24,153, 65,151,106,253,253,243,155,141,149, +133,157,157,157,212,186, 5,104, 8, 3,248,196,102,146,116, 1, 11,125, 96,113, 15, 41,250, 37,100, 21,128,228, 11,220, 7,205, + 99, 22,130,192,226, 15, 82, 20, 78,221,116, 10, 72,102,251,153, 49, 12,110, 0, 44,244,129,197, 61,164,232,215, 54,177, 6,146, + 87,207, 28,165,181,127, 55,127,249,178,243,235, 87,119,110,110, 32,201,240,242,229,169,242, 50,160,160, 89,103, 23, 77,125,122, +224,192,129, 21, 43, 86, 0,211, 21, 92,132,131,131, 35, 34, 34,194,193,193, 97,180, 33, 54,168, 0,176,208, 7, 22,247,144,162, +159,212, 52, 9, 57,185, 11, 82,244,147,148, 38,145,207, 55, 37,111,125, 39, 25, 87, 10,142, 2,128, 0,194, 82, 58,127,250,252, + 69, 82,205,212, 94, 87,131,139,157,245,255,255,255,127,255,254,191,114,251,225,253, 75,135, 57,217, 89,137, 60,164, 19, 8,120, + 56, 30,104,171,222,187,114, 75,233,235, 79, 5,226,139,126, 32,201,201, 47, 12,100, 64,138,126,172,189, 1, 60,237, 95,179,232, + 10, 32, 3,146,236, 48,101,177, 46,120, 69, 54,150,141,141,141, 1,188,191, 28,116,121, 0,248, 80, 82,136,123,152,152, 89,241, + 55,186,129, 64, 82, 12,212,118,254,245,233,195, 79,112,181,247,229,207, 95,136,123,248,197,100,240,183,247,249,165,148,129, 12, + 72, 54,195,214, 27, 16,164,174,127,129, 32,231, 37,168,103, 0, 41,253, 33, 69, 63,168,109,190,107, 55,178,172, 15,222,152,250, +200,253,230, 45,207,235, 15,111,239,136, 9,104,202,188, 81, 33, 38,114,129,109,255,149, 43, 87, 34,151,254, 64, 0,228,114,114, +114, 74, 74, 74,162,245, 3,134, 55,216,179,103, 15, 73,183, 76,227, 57, 12,145, 22, 69, 63, 36, 77, 2, 25,152,105, 18,214, 27, + 16,196, 83,254, 2,211, 36,144,129,153, 38, 33,178,184,210, 36, 80,246,208,241, 83,204,204, 44,127,255,254,249,248,249, 75, 84, +176,127, 79, 79, 15,121,165, 63,157, 67,108,144,131, 45,216,214,142, 35,199, 2, 64, 0,161, 87, 0, 95,191,255,114,246,139,146, + 21,227,231,226, 0, 93,162,242,247, 31, 3, 11, 51,163, 16,191,134,182,170,220,158,157, 91,255,254,254, 74, 76, 29,240,235,215, + 47, 77,237,251,250, 26,247,153,153,254, 30, 56, 35,205,198, 74,248, 52, 87, 96, 65, 12, 44,106,249,249, 64,247, 47, 66, 72, 52, + 89, 96,149,128,171, 43, 0, 44,239,128,201, 46, 62, 60, 8,200,134,144,104,178,192,228, 72,176, 25, 2,244,151,140,140, 12,144, + 4, 58,254,235,215,175,192,210, 31,114, 98, 51, 81,181, 29, 11,243,188, 9,235,217,249, 25, 94, 62, 96, 56,253,229,233,235, 23, +119, 22,247, 87, 18,108,248, 3,179,153,140, 20,104,104, 11, 66, 98, 29, 11, 34,207,191,120,206, 1, 0,150,239,192,162,191, 57, + 39, 27,200,110,134, 21,253, 75,110,221, 66,148,254,132, 14, 17,120,240,255, 48,131,217,211, 8,185,152,159,255, 84,216,255,253, +191,254,102,239,249,221, 55, 85,254,101,225,247,111,127,127,255,247,239,223,145,143,191,134,176,129,130,192,126, 0,169,167,220, + 92,191,126,125,226,196,137,180,188,223,156,134,165,255,170, 85,171,222,191,119, 93,189, 58,148, 24,245,144,211,249,233, 83,162, + 1,203,119, 96,154,188,117,254, 24,176,232, 71, 78,147,251,182,174, 19, 23, 23,135,143, 5,225, 42,127,241,164, 73, 80,233, 12, + 63, 94, 21, 3, 0,227,241,197,171, 55,231,175, 92,131, 53, 11,126,118, 77,158,149,158, 16, 57, 90,136,211, 1, 0, 4, 16,202, + 36,240,231,207,159,109,220, 2, 53,228,132,217, 89,153,128,165,255,139, 23, 47, 46, 95, 60,255,235, 15,144,249, 95,152,159,203, +205,211,231,251,207, 63,196, 24,202,206,250, 74, 89,238, 5, 3, 51,163,150,234, 99,118,150,151, 36,149,254, 40, 45,205, 79,159, +129,133, 62, 80, 10,179, 67,128,181, 52, 68, 6, 11, 87,174, 3, 22,250, 64, 41,204,198, 8, 26, 0, 54,252,129,229, 62, 31, 31, +223,189,123,247,128,133, 62,168,218, 35,186,244, 7, 54,252,129,165,127, 96,110,139,103,148,213,150, 43, 79, 95,124,103, 32,181, +244, 71, 6, 79,158,189, 0,246,181, 69, 5,249,192, 85, 51, 51, 25,254,245, 8,142, 7,181,208, 88, 88, 9,150,254, 64, 80, 59, +101, 42, 16, 65, 74,127, 96,111,160,212, 13,220,238, 23,101,195, 87, 30,241,111,115, 11,145, 74,148,207, 98,101,226,225,102,224, + 98, 98, 96,150, 22,183,182, 9,118,190, 39,213,143,127,240, 7,228,194,133, 11, 33,229, 62, 26, 9, 87, 64, 12,248,246,237, 27, + 65, 17, 26,129,180,180,180,208,208,213, 75,151, 46,165,188,244, 23, 18,218, 67,164,150,153, 96,192,200,200,136,124,101, 35,237, + 74,255,214,170,194,213,171, 87,207,153,220,131, 92,250, 3, 69,166, 76,153,130, 39, 77, 34,151,254,152,105,210,211, 26,124,234, + 20, 47, 55, 46,189,189,147,167, 67, 74,255, 87,111,222, 2, 17,176, 7,192,202,202, 50,125,193,114, 98, 46,189, 25, 5,196, 0, + 96,147, 31, 25, 33, 75, 1, 4, 16,162, 2, 0,150,122,194, 10,122, 10, 18, 2, 63,126,255, 5,214,214, 59,119,238, 88,180,112, +193,165,139, 23, 75,139, 10,152,153,153,128,125, 1, 62, 46,118, 5, 61, 27, 96,147, 13,191,101,191,127,255,214, 86,125,200,199, +243,109,222,194, 87, 76,140,255,205,116,111, 2, 69, 8, 58, 17,173,244,135, 20,253,223, 63,190,133, 87, 12, 64, 17, 92,122,209, + 82, 30, 36,217,157, 90,218, 1, 79,148, 64, 17, 60, 86, 43, 43, 43, 11, 11, 11,127,250,244, 9, 88, 19, 48, 49, 49, 1, 61, 8, + 44,253, 33, 29, 29,130,167,113,173,221,176,190, 96,194,174,245,147,107,128, 53, 1, 23,183,208,227,191, 79,129,165, 63, 15, 56, +159, 48,227,213,139, 86,250, 67,138,254,143,207,238,106,200,136,125,254,246,131,157,139,157,225,239, 95, 82,253, 91, 57,123,203, +213,115,199,117,148,180, 62,254,197, 89, 79, 67, 74,127, 96,171, 31, 88,244, 67, 68,128, 69, 63, 16,221, 75,111,220,117,237,146, +182,153, 18,195, 91,156,145,117,145,109,139,181,131,168, 40,183,230,247,255,159, 25,126,190, 98,251,249,238,231,223,207, 63,254, +125,255,199,198, 35,109,107,178,230, 66, 27, 46,141,144,161,127,200,181, 86,240,108, 15,103, 3,165,128, 10,136, 73,199,111,222, +188, 41, 42, 42, 2,182,253,111,220,184, 1,228, 30, 62,124,184,173,173,173,166,166,134, 62,185, 8, 88,112, 83,165,237, 15, 44, +253,171,170,136, 58,105, 28, 94,232, 35,223,203, 72, 59, 0, 76,147,144,171,131,207,158, 61, 11, 44,247,129,105, 18, 82,250, 51, +128,111,109, 36, 47, 77,118, 37,248, 92,185,251, 88, 66, 73,146,225, 43,129,122, 26, 88,244,255,254,253, 7, 92,128,252, 1,162, +199, 15, 31,144,228,120,228,238,194,104,215,129,120, 0, 16, 64,136, 33,160,159, 63,127, 26,106,104,112,113,178, 2,219,251,127, +255, 49, 28, 61,124,164,177,185,229,223,127,134,219,119,238, 92,186,120, 65, 71, 71,159,153,153, 81, 93, 73,230,222,185, 63,156, +120, 15,214,100, 99,121,165,166,240,140,129,133,241,241,243,223, 64, 82, 79,227,225,169,203,175,254, 51, 16,187,228, 6, 62,206, +131,214, 39, 0, 86, 6,224,181, 64, 79,241,232,133,143,243,160,181, 71,128, 9, 17,180, 54,230, 53,246,190,200,159, 63,127,184, +184,184,128, 69,191,160,160, 32,176, 57,249,245, 43,232, 32,104, 81, 81,209,183,111,223, 18, 60,163,234,199,123, 6, 51, 78,206, +210,201,135, 93,245, 25, 30,158,103, 56, 13, 22, 4,114, 39, 21, 58,254,253, 71,212, 21, 52,240,233, 53,103, 99, 13, 22, 94,166, +157, 7,174, 25,106,200,242,241,176, 31, 60,115, 71, 68, 81,251, 1,234, 42, 32, 92,254,221,116,237, 63,195,115, 6, 63,103,198, +217, 91,238, 9, 11, 42, 6, 89, 51,226,241, 47,100,204,103,231, 87,232,121,215,255, 27,250, 25,164, 63, 50,166,214,255,111,108, +102, 96,250,206,120,170,109,138,184, 56,214, 83,185,127,104, 60,148, 23,240,250,244,247,203,207,247,119, 22, 63, 90,118,196,239, +189, 86,138,163, 91, 46, 15,167,160, 58, 7,139, 32,139,223,199,211,235, 78,155,154,152,226,236,108, 50, 49,193,195, 19,153, 77, + 60, 16, 17, 17,201,207,207, 63,114,228,200,206,157, 59, 65, 85,215,206,157,154,154,154,129,129,129,244,201, 42, 1, 1,191,168, + 85,250,203,203,203, 19, 89,168,193,203,125, 72, 39,128,236, 51, 92,137, 4, 78,222, 65,192,126, 48,176, 2, 0,150,251,198, 96, + 6, 3,248,122, 59, 15,123, 19, 72,154,212,213,213,125,128,119,133, 9, 60, 77, 62,223,208,193,171,205,193,163, 90,176,170, 35, + 69, 95, 71, 66,221,167, 5,232, 29,172,171, 83,128,109, 59, 14, 14,208, 26, 19, 96,195,255,219,183, 31,100, 59,126,180,220,199, + 5,240, 28, 6, 7, 16, 64,136, 10,224,223,191,127, 92,236,108,191,254,252,103, 98,100, 0,162,250,166, 22, 96, 53,240,245,235, +151, 23, 47,158,139,139, 75,252,255,255,239,207, 31, 6, 14, 86, 22,102, 86,124, 67, 4,192,194, 84, 75,249,137,136,224, 39,208, +144, 31,248,162, 79, 70,198,255, 70,218,183, 79, 94, 18, 39,102, 57, 16,164,153,143, 57, 28,132,167,249,143,220,232,192, 44,250, + 9, 54,255, 33,237, 74, 49, 49, 49,200, 50, 39, 96,103, 5, 50,247,203,207,207,207,202,202,250,248,241, 99,252,211, 23,243,247, + 28, 76,241,177,119, 0,179,111,253, 1,141,255, 0, 25, 14,106, 12,124, 45,251, 11, 75,172, 8,186, 25,216,200, 2,146,114, 98, + 66,239,127,254,100,225, 99,254,241,250, 27,176,104,148,148,151,217,181,239, 52,145,254,141, 47,110,189,127,116, 47,203, 11,134, + 15,226, 12,192, 74,204, 66, 65,209,201, 30,223, 18, 85,228, 17,255, 37,225, 41,107,127,222,100, 80,249,193,112,146,133,129,135, +133,193,215, 88,198, 55, 30, 95, 87, 73, 90,232,215,175,119,172,127,126, 3, 75,255,227, 9,252,118,129,254, 26, 98,154, 87,118, + 29, 48, 12,253,202,250,235,235, 31,141,127,175, 95,226,155,168,135,148,248,144, 57, 0,100, 54, 73, 0, 88,226,115,115,115, 95, +191,126,157, 11, 12,162,163,163,105, 61,236, 3, 44,181,129, 69,127, 52, 24,208,179,244, 71, 27,243,129, 92,156, 66,135, 50,206, + 35, 56, 70, 73, 73, 9, 88, 1, 64, 74,127, 96,219, 95, 92, 82,146,164, 52,153,230,107,119,226,217, 43, 94,125,222,167, 59,239, + 50,112,176, 7,231,198, 9,201,248,224, 45, 52,254, 62,125,254, 18, 88,250, 67,122, 0, 64, 64,106,243, 31,115,176,104,180, 50, +192, 83, 25, 32,215, 1, 0, 1,132, 50, 7,240, 31,178, 6,230, 63, 3,176,232,103, 2,149,221, 12,235,214,174, 9, 12, 10, 17, + 17, 21,131,100,218,255,132, 14, 25,103,102,122,165,173, 2,189, 28, 81, 79,135, 11,220,116, 97, 48,210,186, 7, 20, 39,198,113, +200, 99, 62,104,226,240,173, 0,184, 0,242,152, 15,154, 56,124,105, 60, 86,240,233,211,167,207,159, 63, 3, 59, 64,192, 42,240, +245,235,215,144,241, 31, 96, 87,224,203,151, 47, 4,135,128,214, 79,174, 57,112,133,225,227, 3,134,223,223, 25, 38,149, 59, 66, +198,127,206,157,103,184,240,252, 40, 49,235,165, 62, 62,187, 43,196,207, 45, 44,196,173,174,166,121,239,254,235, 91, 79,223,202, + 9,243,255,124,249,234,207,239, 63,240,173, 0,120,252,107,229,224,111,227, 24,185,126,243,170,253,135, 86, 45,235, 43, 14, 46, +110,187,244,155,225,245,219, 87,120,252, 11, 31,241, 79,180, 50,143,214,146, 95,181,126,223,165, 75, 15,250, 46,159, 93,225, 26, +199, 48,247,216,211,167,175,225, 91, 1,176, 12, 17,252, 96,255,251,235,205,175, 95,160,203,223,197,165,101, 53, 52, 53, 63,113, +130,102, 74,190,255,251,198,244,243, 43,231, 87,230,151,207,177, 87, 0,144, 96,252, 1, 6,240, 97, 31,180, 21, 65, 68, 2, 96, +188, 44, 89,178, 4, 88, 13, 20, 20, 20, 0,107,110, 72, 87, 96,208, 14,251,144, 93,250, 35, 55,255, 33,115, 15,240, 78, 0,173, + 11, 8, 96,154, 68, 19,129,167, 73,248, 86, 0, 60,105,210,214, 84,221,197, 90,173,181,169,167,119,194,182,186, 37,251, 50,156, + 76, 94,108,220,246,241,253, 39, 92, 37, 50, 80, 60,212,207, 3, 50,236, 3,175, 0,128,160,173,190,146,248, 66,124,180,184,199, + 15,208, 70,255,145, 59, 4, 0, 1,196,132,220, 67,255,248,229, 27, 51, 19, 35,176, 66,254,247,255,255,159,127,160, 73,251,139, + 23,206, 59, 57,131,110,176,251,251,255, 63, 51, 19,243,231,111,191,254,252,250,137,179, 38,255,251, 87, 81,250,185,168,208, 71, + 72,101, 98,101,198, 3,185, 92, 21,216, 9, 48,212,188,243,231,239, 95, 98,154,255, 88,167,130,137,109, 14, 99,155,134, 34,168, + 87, 80, 80, 16, 88,238, 3,123, 0,192,106, 64, 84, 84, 20, 50, 33, 12, 44,158, 62,124,248, 64,176, 2, 72,107, 93, 1, 44,247, +249, 21, 24,128,213, 64, 94,231,126, 96,233, 31,148,223,254,228,223,139,165,125,101,192,144, 36,166,249,111,108,172, 38,170,164, + 32, 38, 42,194, 6, 12,121,198,255,175,191,126,127,255,249, 7,145,254,237,237,216, 16,160,169,200,199, 39,204, 37, 42,245,251, +221,251,243, 91,150,127,120,247,136,200, 52, 49,175, 35,135,161,208,133,229,207, 47,133,175, 12,175,152, 63, 77,122,126,154,129, +141,143,192,120,215,221, 79,111,152,190, 63, 98,251,102,162,226,168, 21,199,115, 79,240,128,168,232,121, 89,139,123, 31,153, 62, +255,252,255,253,219,146,127, 28, 60,188,120,218,254, 84, 1, 15, 31, 62, 4,146,192,198,184,136,136, 72, 96, 96, 32,164,149, 74, + 59,144,158, 46,136, 57,242, 67,252,108, 48,217,165, 63,114, 65, 15,175,132, 32, 55,182,211,212,191,192, 52,121,252,248,113,200, +184,191,177,177, 49, 3,248, 34,226,149,155,182, 17,159, 38, 55,174,111,112, 47,207,245,242,114, 22, 97,103,254,204,248,127,231, +173,199,199,175, 60, 37, 88,124,103, 38, 68,222,187,115, 7,216,240,135, 32, 96,233,143,181, 93, 63, 10,200, 43,250,113,141,255, + 0, 1, 64, 0, 33,134,101,128, 37,224,237,107,151, 20,164,132, 56, 89, 89,254,254,253, 7,190,162,153, 33, 45, 61, 27,216, 37, +248, 11,222, 13,240,237,199,143,235,183,238,177,177,225, 28, 20,249,243,251,157,161,214,125,120,166,207, 42,188,191,118,137, 42, +164,207, 96,162,115,247,196, 69, 77, 22,102, 81,130,205,127,180,162, 31, 40,200,128,180, 19, 24,127,243, 31, 45, 57, 2, 5, 25, +144,118,198,226, 2,127,255,254,149,144,144, 0,246, 0, 94,190,124, 9,100, 3, 75,150,183,111,223, 2, 73,200, 45,213,248,245, +190,126,113,167,166,101, 63,176, 7,208, 93,108,251,229,207,223,162,206,213, 19,203, 67,139,251,182,176,128,238,160, 33,220,212, +146, 20, 17, 96,101, 96,253,203,192,248,252,254,213,135,175, 62, 42,139, 10, 93,124,247,236,220,221,167,196, 52,255,131,147,138, + 88,133, 24,152,152, 25, 22,108,187,191,118, 90,105, 82,199,204, 34, 95,253,108,103,121,130,254, 5, 54,255,123,253,194, 24, 62, +112, 48, 48,178, 50,244,246,132,156, 62,188,203, 57,147,177, 61,151,241, 68, 25,158,230, 63, 16, 92,124, 33, 98,243,253,227, 23, + 78,230,111, 28, 28,202,193,172,192, 66,255, 35, 19,235, 31, 6,181,255,127,191,253,126,243,252,232,228,143,209, 81,202, 52, 74, +199,240,193,104, 77, 48,128, 8,218,130, 1, 77,243, 15,214, 5,251, 68,118, 11,200, 46,253, 25, 80, 71,255,209, 22,140,210,116, + 38,224,214,249, 99,240,160,206, 74, 10,219, 1, 27, 11,218,174,164, 68,112,239, 2, 48, 77,134,187,152,243,255, 19,252,198,192, +186,182, 63,119,218,150, 11,165, 30, 54, 9,125,203, 66,218, 22, 19,172,183,224,123,199,208,184,163, 43,250,105, 13, 0, 2, 8, +209, 3, 0,182,124, 63, 60,191,115,247,241, 91, 22, 86,102, 96, 31,224,247,159,191,231,206,157, 93,180,104,254,175,191,255,127, +255,253,199,198,194,244,234,253,151,167,215,143,115,226,152, 2, 6, 22,157,154,202, 15,161,205,127,112,191,127,237, 18, 53,208, + 0, 16,211,127, 32, 98, 98,250,103,161,127,253, 47,238, 78, 0, 90,243, 31,190, 10, 8, 88,244, 19, 44,253,209,154,255,240, 21, + 8,192,162,144, 96,105, 8,206,207,239,191,124,249,194,202,202, 10,105,254,255,251,247, 15, 66, 18, 83, 1, 44,238,175, 60,247, +244, 32,143, 4,104,226,151,151,133, 25, 88, 31,240,177,179,126,120,247, 4,216,252,103, 97, 98, 34,216,252,151, 21,226,189,118, +239,254,159, 95,191,216, 89,216,190,124,249,113,241,254, 51, 96,209, 79,176,244,135,248,215, 63,167,121,233,164,137,223,254, 49, +200, 42,203, 92,185,122, 2, 88,250, 19,233, 95, 32, 40, 82, 54,217,124,123, 31,195,199, 63, 12, 28, 34,187, 79, 93, 3,150,254, +192,162, 31,127,233, 15, 4,250,191,124,142,238, 62,197,240,235,243, 23,198,207,239,153,190,124,100,249,253,251,239, 39,246, 31, +223, 56,158,221, 95, 81,117, 91,193, 64, 13,207, 12, 48, 16,192, 83, 14, 7, 24,160, 9,226, 7,179,193, 96, 0,243, 9,164,213, + 15, 44,211, 25,192,179,193, 4, 39,132, 41, 41,253,129, 69,252,127,220, 75,230,105,183, 28, 8,152, 38,225,107,126,106,106, 11, +129,105, 82, 92, 92, 28,178, 46, 8, 34, 78, 48, 77,166, 56,232, 21,244, 76,252,252,242,149, 40,159,216,213,107,143,128,165, 63, +100, 25, 43,145,117, 30, 28, 32,143,234,140,246, 3, 40, 1, 91,150, 52,111,193,123,143, 8, 64, 0,161, 76,204,242,242,242,158, + 61,176,225,255,127, 63, 5, 41, 97, 94, 46,118, 45, 29, 3, 45,109,125, 22, 38,134, 47,223,255, 62,122,254,238,212,129,173, 60, +220, 92,184, 12,250,250,237,155,154,252,243, 31, 63, 57,254, 67,174,205,251,207,192,201,241, 3,152,140,223,125, 96, 7, 10,240, +114,255,209, 85,123,112,248,140, 33,208, 10,252,205,127,120,171, 31,200,101,253,255,155,225, 15,116,245,216, 95, 22, 46,130,205, +127,120,171, 31,194,253,248, 10,186,228, 0,207,118, 92,120, 29, 0, 36,129,253, 0, 32,249,238,221, 59, 62, 62, 62,200,248, 15, + 49,151,178,130, 87,253,183,103,134,218, 51, 76, 58, 60,173,218, 59,164,120,226,178,142,108, 96, 15,128,141,157,131, 96,243,255, +218,163, 87, 42,178, 34,123,247,156, 96, 0,111,191, 4,146,191,127, 66,251,218,172,184,181, 67,154,255, 45, 73,206,121,245, 11, +100,149, 24, 73,242, 47,164,249,239,182,126,222,174,232, 72, 70, 25, 11, 6,240,150, 96, 6,240,225, 16, 16, 5,190, 60, 60,120, +156,173,247,179,236,226,246, 45, 63,212,143, 41,168,234,124,226,100,184,207,240,240,243,131,215,175,219,254,126,121, 47, 83, 24, + 87,140, 63,160,166, 79,159, 14, 44,238,191,127,255, 14, 47,194,128, 92,160,224,144,200, 72,144, 86,255, 75,240, 54,105, 98,102, +131,129,237,101,242, 74,127, 6,216,229,239,120, 10, 62, 82,247, 18, 19, 9,128,105,178,181,161,102,221,230,237,238, 54, 70,240, + 52, 9, 68,198,247,238,121, 4,199, 60,122,251, 77, 78,152, 11,127,243,191, 96,214,230,170,100, 55, 41, 9, 7, 72, 45, 2,113, + 42,158,190, 20,145,221,130,209,126, 0, 21,235, 3, 52, 17,128, 0, 66, 95,153,195,199,203,115,238,192,134,251, 50,234, 74,170, +154,124,220,156,255,254, 51,124,255,249,235,222,189,123,175,239, 93,224,229,225,102,194,221,170,229,228,224, 88,181,195, 30, 79, + 27, 31,168,151,155,155, 64,115, 15,178, 6, 20,216,228,255,247,247, 55,168,244, 7,131,223,140,172,184, 14, 99, 64, 6,144,245, +103,192, 38, 48,188, 28, 36,178,244,135,215, 1,240,205, 95,192, 58, 0,103, 0,225,168, 3, 22,195, 54, 66,205,110,131,237,137, +253,253, 69, 17,175, 46, 96,243,255,212,155, 15, 23,110,131, 6,124,224,229, 62,193,210, 31, 2,128,205,255,181, 70,220, 57,129, + 26,100,248, 23,216,252, 47,222,180,138,177,181,126,187,184,249,132, 47, 87,224,226,134, 44,172, 50, 28,132, 79,124, 2,246, 3, +182,111,250,241,228,253,221,215,111,159,191,188,197,195,252,151,207, 90,207,214, 49,206,145,166, 9,119,192, 55,253,146,177, 6, + 52, 61, 93,144,140,210,159, 97, 64,167, 52,129,105,210,210,210, 18, 45, 77, 2, 75,127, 6,208, 84, 48, 23,126,189,192,230,191, +235,158,147,209,245,139,236,236,236,196, 81,123,147,100, 87, 87,144, 58,128, 96,128, 96, 86,150,163,117, 6,158,114, 31,121, 38, + 0, 32,128,176,148,111,192,246,239,207,119,143,207, 29, 0, 45, 23,129, 92,184,204,206,206,142, 57, 55,139, 6, 88, 89, 89,249, +137, 56,242, 1, 15,128, 12,248, 48, 3,155,252,127,190, 49, 35, 21,253,196,156, 88, 13, 25,240, 1, 22,133,200,165, 33, 49, 69, + 63,191,168,212, 47,220,211,218,248, 65,116,243,226,219, 55,174,146,237,223, 83,183, 30, 67,178, 25,114,233, 79,176,232,135,128, + 56, 35,110,242,252, 11,138,211,254, 50, 72,209, 15, 47,253,137, 44,250,225,192, 83, 49,132, 1, 82,185, 17,183, 70, 6, 88,124, + 67, 54,253, 2,219,251,240,221,191, 64, 6,164,249, 15,100, 12,254, 67, 29,200, 88, 3, 74,139, 70, 58,173, 1,214, 52, 73,176, +232,135, 0,215,154,217, 84, 44,250, 73,170, 14, 71,203,122, 92, 0,237, 70,120, 6,140,121, 96,128, 0,194,222,192,101, 97, 97, +193, 53, 86, 67, 11, 0, 25,229,135, 20,253, 12, 36, 22,253,144, 81,111,242,138, 66, 6,208,202,165,127,196,116, 47,176,130, 87, +239, 62, 18,111, 17, 50,128,140,242,147, 87,244, 83,226, 95,200, 40,255,230, 47, 95,200, 46,250, 71,193,112, 5,144, 37,158,143, +222,126, 35,163,232,135,148,191,240,209,158,161, 91,255, 13,215, 58, 0,143, 44, 64, 0,141, 94, 10, 63, 10, 70,193, 40, 24, 5, + 35, 20, 0, 4,208,232,141, 96,163, 96, 20,140,130, 81, 48, 66, 1, 64, 0,141, 86, 0,163, 96, 20,140,130, 81, 48, 66, 1, 64, + 0,141, 86, 0,163, 96, 20,140,130, 81, 48, 66, 1, 64, 0,141, 86, 0,163, 96, 20,140,130, 81, 48, 66, 1, 64, 0, 13,252,165, +240, 35, 77,239,143, 23,143,137,215,203, 33, 33, 59, 26,206,163,122, 71,245,142,234,165,209,165,240, 0, 1, 52,168,123, 0,164, +238, 2,191,119,239,222, 30, 24, 0,178, 71,171,119, 60,224,227,199,143,143, 30, 61, 58,126,252,248,185,115,231,128, 12,242, 12, +161,226, 41,111,163, 96,144,131,155, 55,111,146,164, 56, 35, 35,131,108,139,200,214, 59, 10, 72, 5, 0, 1,196, 50,104, 93, 70, +106, 9, 14, 84,223,209,209, 17, 22, 22,134,172, 93, 73, 73,137,120,237, 64,176,122,245,234,208,208, 80, 37, 48,192,175, 62, 45, + 45,141,160,153, 64,199, 96, 93, 13,189,123,247,124, 98,244,190,127,207, 77,163,176,125,245,234,213,207,159, 63, 25, 25, 25, 57, + 56, 56,126,252,248, 1,172, 0, 78,159, 62,173,175,175,175,162,162, 66,146, 57,196, 28,149, 1,174,200, 51,137, 81, 54,115,230, +116,106,235, 77,199,161, 24,253,232, 49,130,233,138,161,158,145,177, 9,163,242,171,103, 12,187, 30,202,192,174, 65,208,121,238, +238,160, 35,117,201, 59,188, 26,114, 22,116,122,186, 32, 37, 43,235,129,165,106,127,127, 63,193, 13,119,169,169,105, 64,111, 97, +198,106, 73, 73, 49, 49,218,225,169, 98,194,132, 9,246,246,246,192,114,124,217,178,101,159, 62,125, 34,104, 41, 74,145,196,194, + 28, 97,197,150,158,145,222,181,163,187,196,181, 4, 34, 56,123,246, 44,172,122, 99, 98, 64,187,148,185,185,177,228, 20,200,205, + 78, 9, 9, 9,163, 59, 18,144, 1,100, 95, 24,124,245, 63, 64, 0, 97,175, 0, 48, 15, 27,161,209,241, 35, 84,172, 0,224,165, + 63,208,157,144, 61, 41, 64, 19,136,172, 0, 32,153, 28, 82,156, 65,206,189, 42, 47, 47, 39,172,119,181, 16, 33,131,113,134,216, + 87, 95, 2,183,168, 51, 16,113, 72, 26,121,247, 96, 0,219,254, 98, 98,208, 11, 30, 56, 57, 57,129,149,193,135, 15, 31,248,249, +249, 79,157, 2, 93,158, 76, 76, 29, 0, 12, 94, 72, 40, 1, 67, 44, 56, 56, 24, 24,224, 4,107,130, 77,155, 54, 64, 24,126,126, + 1,184,216,184,244,126, 63,150, 3, 13, 18,171, 41,112, 54, 50, 23,200,192,165,119,199, 14,148,203,205, 14, 29, 58,212,214,214, +134, 28, 80, 75,150, 44,193,159, 48, 58, 59, 59, 59,216, 59,193, 5,113, 40, 74, 22,168,103, 36, 53, 73,211, 63, 19, 33,151,254, + 64, 47, 3, 99,124,233,210,165, 71,142, 28,241,138,170,198,165,248, 24,198, 21,218,235, 87,131, 74,255,127,255,254,205,154, 53, + 11,168,157, 79,206, 30,107,161, 15,239, 14,222,184,113, 3,200,141,140,140, 4,178,163,162,162,136,169, 54,122,118, 67,111, 33, +126,177,243, 57, 80,239,178,124, 46,160,145,229, 30,101, 12,224,216, 91,190,112, 89,134, 61,190, 62,129,177,177, 49,241, 77,189, +209,210, 31, 25, 0, 4, 16, 19,214, 98, 5,152,189,129,145,141,150,225,137, 28,144,161,100,236, 5, 89, 47,164, 49, 78,188, 94, +160,131, 93,192, 0, 82, 7,144,148, 32, 32,165, 63,208, 58,208,245, 20, 96, 75,137,244, 5, 99,216,123, 8,194, 35,130, 11,240, +108,153, 14, 65,120, 68, 8,150,254,255,193,128,248,209,152,247,239,223, 3,203,122, 96, 5,144,148,148, 20, 29, 29,205,198,198, + 6,172, 3,128,253, 0,160,247,153,153,153, 9, 30,175,127,237,218, 53,160,189,107,214,172,129, 4, 23,208,210,181,107,215, 2, + 27,122, 64,113, 58, 39,101,180,202,128, 70, 77, 16, 96,233, 15, 76, 18,225, 55,194, 64, 45,125,212,192,175,248, 89,142,214, 39, +192, 5,128,225, 83, 90, 90,170,168,168, 72,134, 27,128,122,129,109,127, 97,225,189,148,183,253,225,165, 63, 73,218,225,165,127, +113,113, 49, 30,237,200,201, 15,216,252,183,179,179, 3, 50,128,117, 0,176, 31, 64,176,220, 64,211, 27,110, 9,106,149, 46,203, +231, 4,246, 3,202,220, 75,241,235, 5,182,253,129,118, 1,187,227, 46, 24, 0, 34, 53,218,252,199, 83,250, 3, 1, 64, 0, 49, + 97,235,114, 66, 47,134,134,180,163,225,205, 61, 98,138, 99, 72,158,161, 36,191,145, 55,128,131,181, 76, 39, 85, 11,188,242, 0, + 54,255, 9,158,127, 59,176, 0, 94,250, 3,201,167, 79,161, 23,110, 60,121,242, 4,127,102, 3,182,253,191,125,251,198,196,196, + 4,244, 35,144,253,236,217, 51, 86, 86, 86, 22, 48, 0, 50, 32, 71,117,162,109,232, 71,203,168, 19, 39, 78, 4, 22,253, 33, 33, + 33,192, 2, 5,104, 8,176,112, 4,178,129, 82,147, 38, 77, 26,102,185, 5, 94,250, 3,217,192,178, 27,222,182,128, 4, 62,188, +131, 72,100,249, 2, 84, 6, 12, 49, 96,162, 34,111,214,164,178,178, 18,168, 23, 79,212,224, 41,253,251,250,250,128, 81, 6,172, + 72,128,197,247,225,195,135, 25,192, 39, 50, 17, 95,250, 67,180, 3,211,204,153, 51,103, 32,218, 9,218, 8, 84, 31, 17, 17, 1, +225, 2,235, 0, 7, 7, 7,160,237, 27, 55,110, 36, 56,144, 8,108,254, 51, 48, 50, 44,205,131,158, 63, 1,236, 7, 68, 90,179, +131,250, 1,120, 1,158, 82, 98,180, 91,128, 86,250,167,149,163,151,138, 0, 1,196,130, 53,177,194, 47,134,190,135,116, 49, 52, +193,180, 78,173,210,159, 42, 21, 0, 37, 0, 88,121,144,237, 17,186, 1, 96, 81, 2, 44,250, 95,188,128,222,194,136,204,198, 5, + 94,191,126, 13,204,201,192,150,254,157, 59,119,128,218,129,121,245,215,175, 95,192,236, 7,172, 0,128,228,223,191,127,129,213, +195,250,245,235,113, 69,244,222,189,160,118, 40,176,196, 71, 86, 0, 97, 67,138, 39, 60, 41, 4,121,132, 7, 23, 27, 79, 99, 31, +215, 88, 16,158,193, 31,180,145, 31, 72,155,148,164, 52,208,193,222,201,136, 90,161, 66,198,253,239, 17, 51, 60,136,212,132,135, +212,145,144,146, 14, 24,134,196,183, 73, 33,122, 85, 85, 85, 25,136,158,110, 65, 6,153,153,153,240,193, 46, 32, 27, 88,124, 3, + 13, 33,190,244,183,183, 6, 29,201, 8,108,251,151,148,148, 0, 27,230, 16,237,190,126,169,248, 47,246,131, 55,255,225, 0, 50, + 22,180,109,219, 54, 13, 13, 13, 96,147, 29,191,222,112, 75,148,131,185,192, 99, 65, 12,203,151,157,191, 41,113, 19,191,222, 81, + 64, 70,233, 15, 4, 0, 1,132,125, 14, 0,216,165,130, 52,252,225, 23, 67,147, 84,250, 99,109,135,226, 25,158,198,165, 23, 89, +156,118, 7,254, 1,125, 10, 63,118, 28,217, 13,228,141,216,254, 95, 37, 72,182, 75,190,248, 16,158,240,132, 59, 18,173, 68,144, +145,145, 65, 86,128, 53,184,222,189,123,199,203,203, 11, 36,143, 29, 59, 6,172, 6,128,165, 63,176,201, 15,185,250, 6, 88,180, +253,254,253,251,231,207,159,120,154,168,144, 94, 17,102,152, 0, 69,214,172, 89, 3,148,197, 19, 92,148,207, 1, 0,203,122,228, +226, 30,194, 38,178, 26, 0, 22, 73, 36,215, 1,224, 33,126, 72,202, 71, 76, 38,129, 5,137,159, 91, 66,174, 35, 25, 96, 23,187, +147, 55, 40, 1,236, 4, 64,102, 47,136,215, 14,140, 74,248,248,187,141,141, 13,176, 4, 39,169,237, 15,212,254,231,207, 31,100, +237, 7,143,254,237,233,204, 32,216,252,135,148,248,152,160,191,191,223, 59,186, 6,151, 94,164,209,127,212,254, 1, 17,122, 71, + 1,217, 0, 32,128, 88,240,164, 90, 72,243,159,206,109,127,228,145, 40,250, 44,229, 68, 30,237, 65, 94, 31,130,191, 68,195,217, +159,133,141,254,147, 81, 19,192, 71,255,241,215, 4,209,209,209,220,220,220, 60, 60, 60,192,210,156,159,159, 95, 80, 80, 16,216, +188,138,141,141,133,200,114,112,112,184,185,185, 1,125,129,121,204, 31,176,196, 7,150,254, 63,126,252, 0,234, 98,103,103, 7, +102,239,255,160,203, 62,255, 2,197,129,165, 63,144, 65,112,128, 2,215, 48, 32,176,161, 74,135, 65, 51, 92,179,193,196, 0, 72, + 29, 64, 66, 60, 54, 97,241,108,216,245, 80,240,212, 20,177,134, 32, 55,255,225,213, 54,145, 13, 11,228,230, 63,214, 42, 31, 63, + 88,182,108, 25,196, 16, 96, 29, 64,198,208, 63,164,229, 7,236, 26, 22, 22, 22,158, 57,115, 6,166,157, 64,242,152, 56,113, 34, +218, 37,157, 43, 86,172, 56,120,240, 32, 48, 93, 65, 90, 36,120,214,167, 79,152, 56, 33,194, 2,165,249, 31, 61,233,219,138, 99, +191,129,122, 13,163, 12, 51,236, 51,136, 95,219, 62, 10,136,108,254, 3, 1, 64, 0, 49,225,105, 23, 67, 18, 1,124, 50, 0,255, + 48, 92,121,121, 57,121,238,195,165, 87, 9,124, 31, 41,241,173,120, 52, 0, 89, 17, 68,234,176, 41, 49,139, 59, 7, 3,152, 53, +107, 86, 95, 95, 31,156, 11, 41,253,253,192, 0,200, 0,102, 57,172,186,128, 21, 6,176,148,127,255,254,253,155, 55,111,128,228, + 55, 48,248,242,229,203,167, 79,159, 62,126,252, 8,236, 13, 0,123, 0,120,174,244, 1, 22, 64,192,150, 62,193, 74,116, 80,129, + 67, 72, 0, 46, 8,244, 62,156,141,103, 92, 27,121,220, 31,185, 45, 79, 82,179, 0, 77, 49,176, 56, 6,134, 33,217, 51, 1, 64, +189,196, 36,105, 96,137, 15, 76, 3,144,137, 95, 96, 29, 0,241, 59,241,151, 46, 84,151,219, 3,181,255, 91, 41, 0,212, 14,108, +122, 67,180, 31, 58,246, 15,214, 28,199,217,252,135, 15,248,128,198,109,150, 47,205,204,204, 4,154, 83, 80, 80, 64,208,106, 80, +243,159,129,113, 41,172,249, 31, 53,241, 27,115,196,199,229,199,126, 1,245,118,238,232, 26, 45,196,105, 84,250, 3, 1, 64, 0, +177,224, 42, 95,224, 67,255,240,201, 0,252,133, 35,164, 28,135,180,229, 73, 29,174, 65,211, 11,233, 19, 0, 5,201, 27,246,129, + 47, 3,165, 39,128, 52,252,201, 27,255,129, 52,252,137, 25,255,129,103,111, 8,163,177,177,113,254,252,249,176, 33, 20, 63, 8, + 3,216,252,199, 85, 1, 8, 11, 11,191,125,251, 22,216,222,127,253,250, 53,176, 7, 0,108,223, 65,122, 0, 95,191,126, 5,214, + 4,192,210, 31, 88, 13,148,149,225,156,115,131, 52,243,177, 46, 17,134,200,226,113, 51, 85,230, 0,136, 20, 71, 6,144, 97, 19, +244, 2,174,186,186,181,181, 85, 68, 68,132,166, 73, 2,179,249, 15, 7, 4,103, 2, 48,155,255, 36,181,253,129,125,196,152,152, + 24, 96,228, 2,189, 95, 85, 85, 5,236,253, 16,127,161, 77, 77,133,253,129, 3, 7, 24,215,128,238,103,221, 85,195,235,214,242, + 25,168,189,181, 19,212,138,199,223, 5,129,172,253, 7,183,250,151, 29, 60,120,248, 63,227,255,194,130, 66,117,117,117, 98, 44, + 5,234,141,176, 98, 69,180,250, 25, 64,122,197,221, 36,200,152,249, 24, 5, 88,202,243,206, 10,204,138, 1, 50, 66, 0, 16, 64, + 44,120,218,254,192,210, 31,121, 50,128, 96,215, 21,185, 28, 39,175, 31, 0,209, 75,225,200, 15,196,205,100,150,227,131, 62,193, + 65, 6,169,224, 87,117, 39, 38, 38,162,141,207, 0, 5, 33,249, 16, 19,200,200,200,220,185,115, 7, 88,226, 3,155,252,191,127, +255,134, 12,253,255,248,241, 3,178,150, 20, 50, 39,172,172,172,140,167,102, 5, 26, 14,233, 4,192, 83, 2, 48,168,209, 68,176, + 2, 90,204, 1, 32,143, 8,225, 10, 43,172,226,192, 0, 4,214, 1,225,225,225, 43, 87,174, 36,126,160, 18,141,221,209,209,145, +246, 52, 61, 12,152,210,176,109, 4,115,119,119,191,127,255, 62,218, 46, 4, 8, 0,138, 51,224,221, 20, 22, 26,186, 58, 52,212, +217,213,245, 30,230,100,195,219,183,206, 12, 12,239,211,211,113,230, 68,248, 85,136,144, 78,198,174, 93,187, 24, 72,185,206,140, +137,137, 17,212,136,129,148,254,151,254,204,223, 15,186, 8, 19, 88,250, 19,147, 53, 32,201, 9,216,234, 7,146,133, 69,133,234, +106,234, 68, 90, 90, 90, 86, 2,214,203, 0,108,245, 67,244, 74,184, 73,130, 70,155, 70, 11,127,218, 3,128, 0, 98,193,213,157, +135, 79,252,194,151,121, 16, 51, 38, 78,149,177, 32, 82,119, 0,140, 64, 0, 31,114,129,151,113,144,221, 27,200,130, 88,199, 76, +129,117,195,182,109,219,254,252,249,243,225,195, 7,200, 28, 0, 3,120,117, 16,144, 11,100, 19,140,187,252,252,252,137, 19, 39, + 66,170, 1,228,113,127,160, 56,173,235, 78, 96,113, 79, 76,161,143,181, 52,196,172, 24,128, 77,108, 34, 75,127,204, 82, 24,121, + 66,152, 96, 39, 0, 83,240,193,131, 7, 12, 68, 44, 49,128, 15,192,162,186,220,133, 24,255, 2,251,121,192,162, 31,121,240,157, + 24, 0,212,254,111,165, 32,176,220, 7,178, 23,236,255,181,226,216, 47,160,246,195,199, 73, 24,173, 58,116,232, 80, 65, 65, 1, +145,173,126, 56,128, 36,194,149,199,127, 3,245, 74,184, 75,194,234, 19,162,244, 66,182,251, 66,166,247,209,162,105,116, 39, 48, + 3,182,235,192,208,118, 2, 3, 4, 16, 11,214,236, 1,217, 84,133,220,244, 35, 56, 4,132,158, 61,200,173, 3, 40, 55, 4,126, + 26, 4,145, 0, 88,217, 96, 29,194, 38,166, 18,194, 28,243, 33,126, 20, 8,115,204,135,200, 81, 32,248, 76, 53,114,222,198, 42, +136,181,153,230,237,237,189,116,233, 82, 54, 54,182,159, 63,127, 2,235,128,127,255,254, 9, 8, 8,188,127,255,158,152,205,207, + 90, 90, 90, 64,243,119,239,222, 13, 89,246, 3,217, 19, 48,228, 50,216,190,125,251,128,129,176,101,203, 22, 50, 74,127,120, 89, +121,175,188, 28, 79, 87,181,180,180,148, 1,199,242,185,178,178, 50,252,115, 0,233,233,130,184,244, 2,219,254,196,148,227, 4, +251, 64,120,128,123,203,103, 56,155,164,210,127,218,180,105,228, 69, 71, 79,119, 47,168,201, 79, 1,192, 90, 89,194,111,159, 30, + 5,120, 0, 64, 0,225, 92, 6, 74, 80,132,166,128,158, 59, 0, 48,231,250,136,174,102,200, 44,248, 64,122, 57,201,116, 45,100, +116, 11, 82, 57,161,141,116, 33, 11,226,247, 81,116,116,244,221,187,119,247,239,223,255,253,251,247,191,127,255,250,250,250, 2, +139,114,226,195,220, 21, 12, 32,109, 55, 34, 27,254,212,154, 3,192,197,198, 83, 26,162,173, 75, 33,102, 55, 19, 3,252,168,159, +123,161,200,193, 2,204, 5,105, 79,211, 25, 97, 27,193, 32, 82, 88,123, 90,120,194,223,217,217,153, 96,130, 36, 67, 10,238, 95, + 96,140, 4, 6, 6, 66, 78, 31, 34, 21, 48,133,191, 7,106,247,243, 79,131,180, 21, 32,139, 62,145,143,121,160, 5, 48,142, 49, + 34, 91, 47,176,129,143,171,158,131, 72,141, 2,252, 0, 32,128, 6,227, 97,112,100, 52, 91,232,223, 8,165,196, 70, 74, 78,121, +163,150, 79,149,193, 0, 77,240,215,175, 95,204, 96, 64,237, 8,157, 62, 64,122,177, 36, 36,200,241, 97,132, 65, 61,244, 96, 40, +228,222, 33,176,244,135, 84,180,131,115,139, 41,133,123,101,192,218, 9, 15,189, 83,125, 57, 38,254,115,126,104, 87, 89,142, 14, + 10, 1, 1, 64, 0,141, 94, 10, 63, 10, 70,193, 40, 24, 5, 35, 20, 0, 4,208,232,141, 96,163, 96, 20,140,130, 81, 48, 66, 1, + 64, 0,141, 86, 0,163, 96, 20,140,130, 81, 48, 66, 1, 64, 0,177,140, 6,193, 40, 24, 5,163, 0, 25, 48, 98,178,254,195,137, + 81, 48,172, 0, 64, 0,141,246, 0, 70, 40,192,122, 56,248, 40, 24, 5,140, 96,204, 8, 58, 3,154, 17, 3,140,238,205, 26,110, + 0, 32,128, 70, 47,133, 31,161,122,125,109,103, 14,111,255,198,249,233, 34,154, 57, 76, 76,144,229,170,240, 21,141,255, 97, 0, 162, 96,209,166,203,200,122, 63, 60,216,207,193,193, 1, 81, 15, 57, 64, 27, 89, 47,228,212,188,127,255,254, 1,217,191,127,255, -230,149,181, 27, 1,225,204,200,204,194,254,255,223,159,127,255,254,108, 57,242, 4,121, 81, 40, 46,189,192, 32,122,249,242,165, -132,132, 4, 25,246, 82,162,119, 52, 47, 48,144,178, 82, 11, 32,128,134,252, 16, 80,117, 53,226, 10,187,214, 86, 51,250,233, 61, - 5,186, 84,175,213,172, 21,206, 32,213,229,184,246,169,226, 18, 39,213,156,225,214, 87,253,245,149,229,237,125,213, 31,151,164, -255, 60,190,245, 95,241, 9,175,214, 55, 62,121, 54,110, 94, 92,234,143, 28, 57, 98, 99, 99, 3, 41,250, 33,133, 56,164, 17, 11, - 47,196,255,193,192,195,135, 15,209,244,158, 59,119,206,216,216,152,147,147,147,133,133, 5,168, 17,174, 29, 82,238,255,133,129, -159, 63,127,158, 61,123,214, 65,214,110,240,135, 30,208,229,111,223,190, 61,126,252,184,128,128, 0,218,198, 8,194,141, 68, 70, - 38,118, 14, 33, 1, 65,245,175, 95,158,126,249,252, 24,212, 13, 96,252,207,240, 31,223,136, 16, 48,148,214,172, 89,115,235,214, - 45, 32, 27, 24,140,197,197,197,196, 91, 7,209,123,239,238, 29, 96,152,179,177,179, 23, 20, 20,210,116, 23,194, 8, 7, 0, 1, - 52,136, 42, 0, 92, 39, 77, 50,224, 61,104, 12, 82,112, 35, 23,229,196, 3, 74,244, 14, 39, 64,225,222, 81, 58,148, 94,159, 31, - 94,255,120,104,213,183,111, 63, 21,204,153, 56,101, 24, 85, 31, 93, 50,101,184,248,254, 39,207, 5,174,184, 55,140,210, 88, 53, - 93,187,118, 13, 88,130, 0, 11, 59, 22, 24,128, 84, 6,144,134,255,159, 63,127,128, 37, 56,176,253, 14, 44,253,247,237,219,199, - 44,108,130,172,247,219,183,111,231,207,159,183,176,176, 96, 99, 99,131, 95,154, 6,212, 14, 44,155,254,128, 1, 80,227,247,239, -223,129,106,190,124,249, 50,152, 99,182,170,170, 10, 57, 19,125,254,252,217,192,192,128, 12,189,139,151,157,229,228, 20, 3, 22, -200,160, 10,128,145,225, 63,100,183, 0,238, 98,249,217,179,103,192,144,137,138,138, 82, 82, 82,130,156, 75, 33, 36, 36,100, 98, - 98,130, 85,113,130, 59,202,206,184,203, 55,110, 28,224,229, 42,234,111, 50, 52,210,121,254,228,213,174,109, 7, 20,116, 12, 63, -125,250, 56, 90, 88,147, 13,208,198,123,145,151,254, 3, 4, 16, 11,214,178, 0, 82, 10,224, 98,211,168,244,207,202,194,126, 79, -250,251,247,239,151, 47, 95,142,167, 14,128,148,224,164, 54,225, 41,212, 11,111,251,147,209,252, 71,187,121, 6,151, 2, 26,133, - 54,164,199, 0, 39, 33,130,239,222,129,118,205, 8, 9,237, 25,132,201,247,215,227,107,236,199, 22,255,252,246, 47, 72,133, 89, - 93,244,207, 63,161,255,172, 66,204,159,223,178,113,126,254,174,121,113,202, 89,181,140,111, 92,242,216,218,173,140,215,175, 95, - 7,150,224, 78, 78, 78,144,114, 28, 8,128,133, 56,228,234, 27, 96, 33, 14,108,191, 63,126,252,120,255,254,253,192,154, 0,109, -231, 27, 80, 25, 80,205,197,139, 23,129,245, 7,176, 1,203,206,206, 14,209, 11,169, 0,128, 26,129,165,219,229,203,151,127,252, -248, 65,112,211,220,131, 7, 15,128,182, 0, 75, 94,160, 27,196,197,197, 85, 85, 85, 33,131, 75,196, 0, 74,244, 2,157, 90, 83, - 83, 3, 63, 12, 21, 88,154, 3,107, 68, 49, 49, 49, 97, 97, 97, 34, 75,255,121, 73, 73, 94,134,134, 64,182, 68,110, 46, 39,151, -248,151, 79,143, 62,125,188,251,255,255, 95,208,129,113,255, 8,220, 65, 13, 44,238, 69, 68, 68, 22, 45, 90, 20, 31, 31,191,105, -211, 38, 32,247,208,161, 67,191,126,253, 98, 96,144,195,170,254,109,123, 17,156,205,243,235,183,212,159, 31, 5,165,245,253, 61, -141,221, 61,211,164,153,254, 78,235,233,115,138,136,194,165,119, 20,144, 84,250, 51, 32, 29, 5, 10, 4, 0, 1,132,189, 7,128, -124, 4, 10, 46, 54,213, 1,253,207,112,166,194, 0, 20,172, 14, 32, 9,192,235,212,249,129,139, 48,101, 19,215,199,209,180, 25, - 14, 49, 28,153, 36,120,109,247, 0,130, 31, 31,222,168,221,223,250,138,249,175, 10, 63,131,188,220,127,102, 61, 54, 22, 37, 37, -182,159, 63,126, 30,125,252,243, 35, 11,243, 63,214, 31,123, 22, 51,121,229,255, 99, 65, 31, 11,130, 95,126, 41, 40, 40,232,232, -232, 8, 44, 58,129,197, 40,176, 33, 15,105,248, 3,203,110, 96, 43,245,224,193,131, 76, 96,128, 85, 47, 80,229,213,171, 87,109, -108,108,248,248,248,128,218,129, 34,192,210, 31, 88,138,125,250,244,233,244,233,211,192,106, 0,104, 26,100, 38, 0, 23,184,116, -233,210,177, 99,199,238,223,191, 15,212, 2,180, 93, 66, 66, 2,216, 10,182,178,178,226,230, 38,188, 21,156,108,189, 64, 39, 65, -110,254, 65, 22,132,156, 11, 13,108, 69, 17, 83,133, 48, 49,179, 33,115, 95, 76,158, 44, 17, 32,211,221, 61,241,247,239,175,224, -192, 97,252, 7, 44,253,255,131,186, 0,255,113,143,191,157, 60,121,178,162,162, 2, 24,104, 65, 65, 65,178,178,178,192,138,118, -219,182,109,230,238,132, 54,253, 50, 50, 46,185,243,124,237,237,167,155, 54, 46,100,102,102, 44,202,141,213,151, 16,153, 85, 80, - 63,155, 24,189,163, 0, 71,233,143,220,228, 71,171, 15, 0, 2,136,132, 85, 64,180, 62,238, 81, 9, 55,160, 69, 19,158, 66,189, - 12,100,141,251, 83,189, 45, 15,191,204,146,248, 66, 28,171, 74, 96,219,159,200,230, 63,176, 16, 4, 22,127,152, 92,100, 65, 76, - 0, 87, 3,191,101, 16,147,139, 21,188,187,122,238,217,211, 79, 98,188, 44, 74,188,255, 89, 68,254,177, 88,122,112,235, 47,230, - 52,234,101,231,231,100,251,242,253,219,183,191,114,204,223,222, 95, 58,134,165, 20, 99, 98,130, 92,118,127,251,246,109, 96,107, - 29, 88,136, 11,131, 1,176,101, 42, 32, 32,240,241,227, 71, 96,155, 20, 88, 60, 65, 70,249,209,244, 66,196,129,197, 46,176, 14, -184,117,235, 22, 23, 23, 23, 80, 23,176,249, 44, 42, 42,202,195,195, 3, 20, 1, 86, 33,144,161, 33,204,202, 3,185,253,190,123, -247,238,187,119,239, 42, 42, 42,186,187,187,155,153,153,125,251,246,109,223,190,125,192,142, 5,176,250, 33,216,246,223,189,103, -239,189,231, 31,121, 85, 44,212,220,147,165,205,252,222,255,100, 2,138, 16,212, 11, 44,253,129, 21, 6,176,242, 0, 22,193,122, -122,122,240, 97, 28, 8,131, 96,233, 15, 44,250,185,121,164,132,132,117,150,174,184,148, 52,111,222,182,243,231,129, 8,216, 3, - 96, 0, 77,119,127,133,170, 97, 4, 34,124,235,129,128, 5, 61,176,213,159,147,147,195,203,203, 11, 12,186,181,107,215, 2, 29, -243,230,205, 27, 53, 53, 53,130,169,107,226,249,219, 61, 39,174,204,238,169,100, 97,254,206,244,247,115,215,132,121, 43, 15,157, -125,198,196, 66,234, 9,163,163,128, 72, 0, 16, 64, 44,196, 23,244,131,121, 42,102,196, 86, 3,144,161, 27,146, 70,111, 48,187, - 23,240,126, 0,193,158,199,231,207,159,129,205, 82, 96,179,218,212,212, 20,141,123,234,212, 41,136, 32, 86, 0,145, 5,146,192, -150, 41,176, 25, 11, 44, 26, 32,130,200, 92,172,128,239,199,219,109,143,126, 72,191,103, 54,228, 99, 20,125,205,160,194,194,207, -196, 40,252,255,199,203,175, 47, 25,175, 62,250,247,226,235, 15, 96, 25,204,240,239, 22,131,145, 59,174, 10,128,157,157, 29, 88, - 10, 75, 75, 75,187,186,186, 2, 75,118, 96, 17,249,246,237, 91, 96,145, 4,148, 2, 22,241,144,227,143,254, 97,232,133,104, 7, - 42, 0, 38,123, 96,199, 87, 69, 69,133,159,159,255,203,151, 47,231,207,159, 7,214, 10, 64, 51,127,130, 1,158, 86, 17,176,122, -123,242,228,137,190,190,190,131,131,131,140,140,204,215,175, 95,129,245, 7,176,155,123,252,248,113,130,131, 57, 64,189, 47,223, -125, 20, 82,179, 80,178, 13, 23,144, 81,251,249,245,195,163,147, 91,111,239, 93, 72, 80, 47,100,246, 2,216,185, 17, 23, 23, 7, - 22,184,192,154, 0, 82,244, 67,198,130,128,108,172, 55,228, 64,171, 61, 22, 14, 1, 65,117, 1, 33,117, 38, 38, 86, 96,113, 63, -119,254,254,164, 68, 71,136,222,212,212, 84,160,227, 33,122,193, 94, 6, 23, 5,216,166, 1,128, 1,187,121,243,230,172,172, 44, - 73, 73,208, 1,159,123,247,238, 5, 86,102,156, 96,224,237,237,125,236,218,119, 60,190, 94,118,243,113,239,233, 27,115, 58,202, -101,212,229,191,126,121,191,113,251,233, 75,151,111, 10,252,255,199,246,226,165,119, 78,244,209,171,223, 71,203,107, 82, 1,218, - 73, 63,152, 29, 2,128, 0, 98,193, 44, 11,224,135,220,226, 98, 15, 42, 64,118,193, 77,161, 94,178,199,127, 40,111,245, 19, 35, -133,167, 40, 39,123,213, 16, 48, 39, 3,139,251,247,239,223, 99,229, 18, 9,128,181, 5,176,252, 5, 22,250, 10, 10, 10,152, 92, - 76,240,250,205,227, 99,207,191,123,115,113, 29,126,252, 79,202,136, 93,241,231,217,247,215,178,214,119, 93,250,247,224,227,151, - 95,255,159,126,254,203,201,194,244,231,227, 11,126,108,237, 24,120, 29, 0, 44, 49, 31, 62,124,120,227,198, 13,109,109,109,160, -131, 79,156, 56, 1, 25,217,199, 53,136, 15,212, 11,233, 4, 64,244, 2,235,128,199,143, 31,235,234,234, 2,139,111, 96,253, 1, - 20, 1,138, 67, 86, 7,225,233, 1, 60,122,244, 8,104,190,177,177, 49,176,244, 7, 42, 6,118, 65,204,205,205,129, 86, 3,197, -129, 53, 7,254, 80, 2,170,249,199,196, 38,109,224, 2, 44,253,153,152, 89, 57,249, 68,229,204,189, 31,158,216,132, 95, 47,208, -157, 31, 62,124,120,250,244,169,156,156,156,181,181, 53,208, 82,200,200, 79,124,124, 60, 68, 1,176, 14,195, 99, 41, 7,135,176, -176,168,254,175,159, 31,223,188, 61,255,243,231,251,223,191, 65,243,219, 16,189, 47, 95,188,128,235, 5,181,254,113,212,122,207, -159, 63, 95,186,116,105,116,116, 52, 48,172, 24,192,215,209, 0,123, 3,149,149,149,192,218, 8,166, 4,231,242,196, 91,159,190, -149, 31,188,208, 81,146,110,235,227,242,245,203,155, 85,235, 14,206,156,187,118,123, 81,130,210,171, 39,157,159, 94, 8, 9, 9, -227,209, 59, 10,136, 28, 11,194,172, 18, 0, 2,136, 5,235, 80, 12, 65,246, 32, 7,148,175,209, 36, 6,180,152,182,208,255, 6, - 49,228,178, 27,173, 50,160,198, 97,144, 56,193,205,155, 55, 97,243,120, 88,184, 36, 1, 96, 17,188,123,247,110,200, 37, 30,200, - 92,172,221,252,139,239,190,127,252,245,239,226,235, 63,207, 62,252, 17, 63,193,162,183,234,206,195, 7, 87,111,158,252,245,135, -133,249,215, 63,134, 31,191,254,191,255,255, 79, 84,240, 63,214, 66, 28,190, 0, 20,178,140,231,229,203,151,242,242,242,192,122, - 11, 50,236, 3, 36, 17, 27,156, 8, 1,248,166, 1, 8, 57, 56,111,142, 3, 86, 78,144, 91, 80, 20, 21, 21,145, 43,182, 51,103, -206, 0, 73, 96,240, 66, 46,221,195,117,237, 15, 48,180,128,228,247,111, 47,191,124,126,252,247,239, 15,100,189,155,192, 85, 53, -176, 27, 4,210,251, 31,251,216, 63, 48, 30, 39, 79,158, 12,108,230,219,216,216, 0,185, 71,143, 30,221,176, 97, 67,118,118, 54, - 82,233,143, 19, 60,255,246, 51,118,219,137,130, 48,239,144,216,224,111, 63, 62,173,223,116, 96,194,180,101,139,220, 76,129,165, -255,104,217, 77,245,154, 0,185, 14, 0, 8, 32,106,238, 4, 70, 30,137,198,197, 30, 78, 96, 48,148, 2,144,177,123,226,199,127, -240,204, 25,224,143, 35, 96,241,225,234,234, 42, 40, 40,136,149, 75, 18, 0,234, 2,234,133, 23,247,104, 92, 52,240,253, 47,223, -111, 70,134, 51,111,126,190,250,251,119,239,189, 31,171, 86,255,216,247, 68,244, 14, 27,255,147,143,191, 31,127,254,247,245, 15, -195,183, 63,255,217,133, 37,112, 21,217,144,149,254,127,255,254,253,243,231,143,176,176, 48, 15, 15, 15,176, 14,248,253,251, 55, - 68, 4,109, 59, 24,178, 94,200, 74,127,160,154,239,223,191, 3,185,178,178,178,192,150,181,164,164, 36,176,218, 0,182,193,129, - 53, 31,196,100, 60,227,162,192,102, 56,176,175,112,246,236,217, 39, 79,158, 64,174,225, 60,121,242,228,151, 47, 95,128,226,192, -206, 7,254, 32, 2,170, 97,250,247,235,233,249, 61, 31,158,220,250,247,247,247,247, 79,175, 31,157,220,250,235,235,123,252,122, -225,142,249,246,237, 27,124,118, 26,216, 9,184,122,245, 42,176, 28,135, 92,218,254,241, 35,206,245,148, 64,191,254,249,253,133, -147, 91,130,131, 83, 8,178, 35, 24, 89,239,236,217,179, 33,122,255,161, 6, 24,176, 3,183,104,209, 34, 96,235,161,169,169,201, -207,207,207,199,199, 7,210, 21,216,188,121,115,105,105, 41,176,203,133,199,155, 64,189,139, 23, 47,142,200,202,113, 90,115,176, - 36, 46, 40,175, 44,243,199,175, 47,247,239, 62,158, 57,115,213, 6, 95, 43, 7, 89, 49,226, 19, 21,176,178, 25, 45,220,241,143, - 5,193,203,125,228,121, 96,128, 0,162,254, 81, 16,152,183,167, 98,178,169,220,222,199, 88,200,143,220,228,199,223,252,199,212, -123, 10, 40, 84, 93,141,201, 38,102, 8,136,120,189,212,234, 13,192, 23,243, 16,223,252,127,247,206, 5, 62,115, 64, 82, 7, 66, - 65, 65,193,215,215, 23,216, 12,196,202, 37, 18, 0,213, 3,117,193, 7,124,208,184, 88,212,171,170,168,114, 51,243, 50, 50,252, -254,255,255,250,251, 95, 75,239,252, 92,126,236,217,233,187,239,158,125,103,120,251,227,239,221, 47,255,159,255,252, 47,171,172, -130,181, 52,132,172,218, 4, 22,214,192, 66, 28, 88,118,235,232,232,128,171, 76, 33, 51, 51, 51, 72, 33, 14, 41,199, 49, 11,113, - 72,225, 14,172, 39,128, 10,128,213,188,178,178,242,135, 15, 31, 30, 63,126,252,238,221, 59,160, 83,129,189, 10,160, 56,208, 4, -136, 50, 92, 46, 55, 53, 53,149,145,145, 1, 22,160, 59,118,236,216, 2, 6,135, 15, 31, 6, 54,204, 45, 45, 45,241,204,121,192, -245,138, 11,241,191,189,119,225,230,238,249, 87,183, 78,191,190,117,230,195,227, 27,216,153,254,225,215, 11,172,156,128,205,109, - 62, 62,190,139, 23, 47, 2,107, 29,228,106, 0,210,150, 95,186,116, 41,158, 18,249,215,207,143, 31, 63,220, 97,101,229, 22, 16, -210,224,230,145, 6, 50, 32,125, 2, 32,120,118,114,234,254, 69,121,174, 26, 95,192, 21, 0, 3,116, 27, 24, 56,216,182,110,221, -202,201,201, 9, 52, 22, 24, 50, 22, 22, 22,240,174, 64, 76, 76, 12,176, 35,130,223,155,219,182,109,229,227,227,177,179, 55, 55, - 48,210, 11,204, 74,250,198,248,231,245,171,119, 25,185,205,157, 38, 42, 70, 98, 36,180, 45,128,165,127, 87, 87,215,104, 29, 64, - 76, 53,128, 38, 2, 16, 64,116,218, 8, 54, 32,141,101,242,198,232,205, 90, 91,145,203,110, 32,151,234,122,225,109,237,196,245, -113,120, 20,208,122, 79, 22,220, 22,228,157, 1,248,181, 0, 75, 31,103,103,103, 96, 25,138,201, 5,150,170,248, 66, 6, 44, 11, - 36, 13, 13, 13,129,229, 20, 92, 16,153,139, 21, 72,171,105,233, 94, 61, 43,255,254,227,155,191,255, 62,253,248,195, 14, 44,173, -127,254,145,227, 97,121,255,231,207,211,175,160, 21, 68,222,170,226,220, 10, 90, 95,176,141,135,192, 87,124,234,234,234,234,235, -235, 3, 11, 38,200,194, 77,160,179,129, 69,213,250,245,235, 33, 27, 2,128, 34,140, 24,122, 33,187,189,128,233, 86, 77, 77, 13, - 88,127,188,126,253, 26,178,132, 20,104, 26, 80,228,213,171, 87, 16,189, 64, 17, 60,245, 37,176,103, 3, 89,202, 9, 44,145,225, - 75, 57,129, 46, 33,184, 26, 7,164,215,197, 25,164,247,238,201,103,231,119, 67,245, 90, 59, 17,212, 11, 44,253,141,140,140,142, - 30, 61, 10,212, 43, 45, 45, 13, 52,135,155,155,187,170,170,106,210,164, 73,192,174, 15,208,246,190,190, 62, 92,119,196, 3,171, -188,143,239,239, 0,139,117,126, 33, 53, 9, 41,203,239,223,223,124,249,244,176,187,103, 82, 99, 67,149,148, 12,195,242,124, 46, -198,176,247,142,113, 12,144, 26, 19,190, 17,248,214,173, 91,192, 52, 96, 99, 99, 3, 52, 31, 88,229, 0,229,166, 76,153, 18, 30, - 30, 14,169,110,241,131,155, 55,111,133, 4,251, 71, 68,248,233,232,170,191,253,252,241,203,199, 55,105,121,205,205,129,206,206, -255,190,145, 84,250, 79,152, 48, 1, 24, 41,192, 90, 39, 55, 55, 55, 32, 32, 96,180,160, 71, 30,240,193, 90,238,195, 1, 64, 0, -177,208,167,160, 39,184,130, 40, 36, 36,132,188,157,192,184, 0,242, 70, 45,242,234, 0, 82, 75,127,226,245,226, 95,117, 67,235, -163, 29,224,227, 69,112, 91,144,247, 4, 16, 4,192,114, 16,121,181, 15,156,139,103, 9, 16, 92, 22, 77, 13,126, 45, 16, 32,165, -168,252,195,204,246,207,169,109, 15, 62, 50,240, 48,178,202,243, 48, 61,253,203,200,204,206,114,232,213,223, 31,255, 24, 68,217, -153,149, 77,236,190, 8, 42, 96, 43,206, 64, 77,120, 96,139, 27,216, 14, 5,150,137,159, 62,125, 2,150,221,144, 10, 0,216,126, - 7, 86, 90,192, 50,107,243,230,205,144,225, 32,180,108, 0, 20,129,108, 27,214,212,212,132,140,222, 0,245, 66,210, 54,164,223, - 0, 20, 7,246, 6,190,124,249,130, 63, 97,235,233,233, 1, 75,100,242, 54,115,145,167, 23,232,108, 41, 41, 41,119,119,119, 96, -173,115,227,198,141, 71,143, 30, 1,107, 59, 1, 1, 1, 96, 85, 52,103,206, 28, 92,123,113,145, 70,129,190,125,120,127,243,199, -143,119, 2,130,106, 60,188,178,188,124,114, 95, 63, 63,237,232,156, 27, 25,225, 2,172, 0, 96, 1,251, 31,185, 6,240,242,242, -218,182,109, 27,176,195, 1, 12, 16, 63, 63,191,133, 11, 23, 2,235,117, 13, 13, 13, 98,252,232,237,237,181,126,253,230, 79, 31, -222, 62,121,246, 60, 63, 59,174,180,162, 45,208,201,202,230,231, 39, 6, 86, 98,203, 37, 96,233,223,208,208, 0,233,134, 2, 59, -106,192,126, 64, 89, 89,217,104, 29,128,191, 62, 64, 6, 0, 1, 68,205, 10,128,194, 21, 68,100,148,242, 16,240,230,205,220,234, - 83, 27,177, 14,248, 16,156,254, 5,234, 61, 85,189, 17,173,193,142, 60,140,131,167, 28,127, 51,247,205,169,141,213,228,233, 29, - 40, 48, 20, 79, 13, 82,176,114,188,244,243,207,235,125,123, 89,255,124,191,244,249,255,158,207,127,216, 24, 25,133,255,255,119, -148, 20,176,119,115, 22, 50,118,192,209,158, 5,245, 0,128, 77, 96, 96,121, 4,108,194, 3, 11,122, 96, 49, 10, 41,196, 33,141, -119, 81, 81, 81,107,107,235,157, 59,119, 98, 14,227, 0, 69,128, 85, 5,176,185, 13, 84, 15,108,213, 66,186, 17, 12,176,121, 5, - 32, 23,168, 0,216,171, 56,113,226, 4,193,105,112, 5, 48, 32,211,227,100,233, 5,214, 1,192, 18, 31,232, 60, 96, 15, 0,216, -233, 1,246, 93,128,130, 79,159, 62,245,244,244, 4, 54,255, 9,106,255,251,247,231,215, 47, 79,127,253,250,200,249,233, 1,159, -128, 50, 23,143, 20, 16,237,218,251,146,209, 89, 28,214,152, 3,147, 48,245, 86, 86, 86,192,128, 5,150,254,192,154, 64, 88, 88, - 56, 46, 46,238,192,129, 3, 68, 58,213,210,210,138,157,157,157,239,218,217,236,236,100, 25, 53,213,174,130,228, 5,211, 22, 78, - 97,254, 65,124,233, 95, 94, 94, 14,244,236,179,103,207, 56, 57, 57,129,145, 2,236,238,180,182,182, 86, 87, 87,143,214, 1,240, - 49, 31, 96,161,143,231, 40, 8,128, 0,162,114, 15, 96, 64, 86, 16, 97, 45,212,136,108,254, 99,234, 69,110,191, 67,198,115,112, -149,227,148,232,197, 83, 22,147, 90, 70, 15,251,147,224,128, 37,154,129,179,187,176,148,204,235,235, 87,152, 31,222, 83,249,253, -156, 87, 88,220, 74, 87, 67,219, 88,231,187, 4,206,253, 65,192,146, 26,216,246, 7, 54,243, 33,131,245,192,174, 0,144, 1, 57, -206, 1, 62, 58, 36, 43, 43, 11,172, 3, 48, 11, 44, 96,105, 98, 96, 96, 0,172, 3,128,229, 59, 68, 37,124, 81, 13,252, 36, 56, -160, 81,134,134,134,103,207,158, 29,156,129, 6,116,188, 24, 24,168,171,171, 3,253, 11,172,198,128,222, 7,134, 70, 53, 81,243, - 82,255,127,255,250,252,251,215,151,239,223, 95,179,179, 11,178,178,241, 50, 49,177, 44, 89,186, 53, 38,218, 27, 90, 11,162,170, -134,116, 44,122,123,123,129, 21, 45,144,161,166,166, 70,252,181,210, 70, 70,198,204,166,166, 73, 13, 16,189,255,213,212,212,213, - 2, 2,240,143, 10, 34,131,206,206,206,209, 82,158,152, 58, 0,107,233, 15, 4, 0, 1, 52,108, 47,132, 33,123,233, 39,114,145, - 77,106, 19,158, 18,189,163, 0, 63,144,213,212, 6, 34, 32, 3,126,246, 38,254,125, 65,161,161,161,130,130,130,144,165, 62,192, - 18, 16, 50,164, 3,233, 1, 64, 38,126, 33, 7,130, 42, 43, 43, 3, 5,143, 92,249,138,172,119,194,132, 9,171, 87,175,134, 40, - 0,157, 20,132,227, 56,104, 96,203,151,224,160,202, 32,169, 65,121,192,128,196,230, 2,164, 26,248, 12, 44,253,129,102, 0,131, - 13,162, 23,215,152, 23,228,200, 79, 72, 80,147,228, 60, 96, 48, 23, 22, 22,146,161,119,180,153, 79,124, 29,128, 75, 10, 32,128, - 70, 47,133, 31, 5,163, 96, 20, 96,148, 11, 12, 12,232,135, 61,252, 31,189, 17,108, 24, 2,128, 0, 26,189, 18,114, 20,140,130, - 81,128,209,248,103, 24,189, 1,114, 68, 0,128, 0, 26,189, 18,114, 20,140,130, 81, 48, 10, 70, 40, 0, 8,160,209, 10, 96, 20, -140,130, 81, 48, 10, 70, 40, 0, 8,160,209, 10, 96, 20,140,130, 81, 48, 10, 70, 40, 0, 8, 32,196, 28,192,232, 37,203,163,122, - 71,245,226,210,155,158,158,238, 31,144,190,113, 3,150, 35, 55, 70,195,106,192,245,182,194, 86,220,225, 90,228, 58,122, 41, 60, - 46, 0, 16, 64, 44,104,169, 28, 83, 5,145,235,198, 6,149, 94, 34,181, 15,148,155, 7, 15, 32,251,204, 9,234, 30, 68,138, 7, - 64,174, 28, 56,120,240, 32,144,109,111,111,143,255,242, 0,218,133, 18,176,244,247,242, 52,130, 28,163, 55,236, 55, 94, 12, 45, - 0, 44,253,125,125,149,225,236,234,234,234,209, 48, 33, 30, 0, 4, 16,250, 42,160,255,171, 80,206, 96, 98, 12, 35,225,180,119, -180,140, 65,210, 9,160,148,232, 69,115, 51, 73,206, 30, 40, 55, 67,192,187,215,119, 94,191,126,254,242,205,151,143, 31,127,243, -243,179,138,139,240,136,138, 74, 10,137, 18,117,188,218,185,227,211,238,221,189,117,247,193,143,199,207,255,203, 74, 50, 42, 43, -112, 40, 41,171, 25, 89,102,209,191,218,128,156, 45, 74,163, 98,241,242,229,203, 6, 6, 59,102,204,248,118,224, 0, 67,125,253, -174,199,143, 31, 75, 72, 72,112,112,112,136,138,138, 42, 41, 41,145, 81, 25, 28, 62,124, 88, 92, 92, 92, 94, 94,158,224,145,156, -200, 0, 88,250,167,165,165, 49, 48,204,218, 56,122,224,216,224, 3,191,126,149,239,220,153,230,238, 62,203,215,183, 19,210, 27, - 24,173, 6,144, 1,158,141, 96, 0, 1, 52, 76,150,129,194, 75,124, 70, 70,134,127, 43, 5, 7,191,131,127,255,250,250,248,209, -229, 95,191,126,171, 40, 10, 56,216,200, 9,240,179,191,255,240,227,233,243, 47,183,239, 61,255,240,241,141,172,156, 46, 43, 27, -206,171, 95,223,191,185,117,236,224,108,102,134, 79,225,222, 12,214,198, 12,202,242, 12,119, 30,252, 63,114,230,251,182,253, 23, -183,174, 45,181,178, 79, 21, 20, 81, 35,210, 25,100,183,253,145, 53, 66, 14,146,163, 81, 29,240,238,221,187,188,188,111,162,162, - 12,161,161, 12, 29, 29,160, 11,185,254,252,249, 3,172, 0,196,196,196,128, 21, 0,176, 79, 32, 37, 37, 69,208,144, 23, 47, 94, -188,122,245,234,229,203,151,174,174,174, 75,150, 44, 97, 0,239,245,141,138,138,194,127,128, 29, 50,216,182,253, 28,176,244, 7, -147,163, 96,112, 53,255,129,100,112,240,218,157, 59, 65,100, 90,218, 93, 72,111, 96,180, 43,128, 89,244,195, 69,144,235, 0,128, - 0, 26, 38, 21, 0,176, 19, 0,169, 3,134, 68,233, 15, 4, 79, 30, 93, 22, 23,225, 48, 53, 84, 4,223,175,196,248,239,223,127, - 62, 30,118,110,101, 54, 5, 89,254,107, 55,223, 0,101, 21, 85, 44,112,233, 5,150,254,182,198,159, 10, 18, 25,152,153, 65, 21, -222,239, 63, 12,220, 92, 12,154, 42, 12, 22, 6, 12, 91,246,127, 2,202,122, 7,119,211,116, 8, 8,235,165,146, 52,186,242, 65, - 72, 72,104,203, 22, 78, 89,217,239,192, 30,192,251,247, 44, 42, 96,240,229,203,151,123,247,238, 29, 56,112,224,211,167, 79,192, -114, 28,127, 63,224,250,245,235,231,206,157, 99,101,101, 69, 22,252,254,253,251,220,185,115,129,134, 68, 68, 68, 16,227,140,141, - 27,128, 94, 78, 7,147, 36, 0,248, 61,201,144, 99,239,208,184,120, 98,132, 1,233,196, 64, 60, 92,156,237,161,255,255, 69,222, -190, 85,122,240, 64,248,233,211, 39, 98, 98,143,148,148, 62,138,137,253, 39,250, 68, 94,160, 59,137, 57,167, 15,143, 22,252, 92, -106,233,133, 15,254,164,165,237, 4, 50, 32, 36, 68, 10,200, 24,173, 3,176,182,250, 33, 71, 3,193, 69, 0, 2,104, 88,173, 2, - 98, 28, 34,238,124,247,250,206,239,223,191,205,140, 36,225, 34, 76, 76,140,108,108,204,156, 28, 44,172,172, 76,202,138,130,192, -158, 1, 80, 13,174,145, 31, 96,219,191, 48,137,225,199, 79,134,251,143, 25,222,127,100,248,240,137, 97,217, 38,134,220, 6,134, -170, 30, 6, 43, 35, 6,166,255,159,128,106,134, 77,156,234,234,234,110,220,168, 41, 38,198, 16, 21,197, 34, 33, 97, 10, 44,175, -125,125,125,125,124,124,220,221,221,197,197,197,129, 37,251,202,149, 43,239,222,189,139,235,162,196, 75,151, 46, 93,184,112, 1, -173,244,135,131,253,251,247, 95,189,122, 21, 79, 89,124,232,208, 33,120,105, 11, 41,253, 33,108,160, 56, 49, 21,222, 41, 24,192, -202, 37,178,126,197,207,197, 90,250, 43,221,184, 97,187,103,143,236,173, 59,108,159, 62, 73,222,186,161,179,101,179,232,197,139, - 12, 68,223,233, 13,116, 33,176,216, 5,246,153,136,143, 38,136, 22, 60, 92,252,122,145,139,123, 60, 92, 92, 0, 82,238, 67,200, - 95,190, 42, 12,163, 0,169,232,199,127,214, 3, 64, 0, 13,150, 30, 0, 85,218,143,255,169, 97, 47,121, 67, 25,240,155,182,136, - 25, 99,121,253,230,185,186,178, 16,164,220, 71,147,226, 96,103,249,240,241,167,154,178,208,173,123,207,177, 78, 6,220,187,123, - 43, 28,116, 36, 23,195,142, 67, 12, 83, 23, 51,184,217, 50,120, 57, 48,220,184,195,112,254,234,127, 78, 14, 70, 67,109, 6,119, -123,134,117, 59,111, 25, 89,210,106, 8, 8,107, 16,209,238,198, 55, 96,235, 30,216,222, 7, 50,128, 45,125,107,107,107,184,160, -160,160,160,166, 38,139,159, 31,176, 15,116,230,214,173,111, 12, 12,192, 64, 97,199, 28,249,185,124,249, 50,174,210, 31, 94, 7, -224,186, 35, 37, 58, 58,122, 41, 24, 0, 25,112,255, 2,139,126,160, 8, 68,150, 62,121, 1, 63, 23, 19,240,189,124,169,120,242, -228, 47, 38, 38, 86, 70,134, 63,255,254,255,251,253,247,223,159, 63,162,135, 15,125, 20, 17,249, 41, 67,236, 74, 18, 96,177,123, -229,202, 21, 67, 67, 67, 3, 3, 3,226,181, 32,119,110,208,184, 68,118, 35, 72, 45,253, 49,139,251,157, 72,253,128, 81, 64, 16, - 0, 4, 16,122, 5,128, 57,125, 74,100,161,134,171, 48, 37, 70, 47, 45,198,142,137, 92,166,130,117, 2,153, 72,189,104,202,136, -159,139,126,249,250,139,163,181, 28,176, 65,118,248,248,227,111,223,127, 3, 69,140,244, 37, 68,133, 57, 31, 63,253,124,231,254, -123, 22, 22, 38, 85, 37,193,163, 39,191,170,107, 98,209,123,247,193, 15,107, 99,134,159,191, 25,182, 31,100,216,127,252,191,148, - 56,163,146, 28,131,179, 13,131,134, 50, 35, 11, 51,232, 28,117, 11, 3,134,238,153, 63,240, 15,248, 16,100,224,105, 53,192, 71, -252,209,198, 37,104,183, 54,230,209,163, 71, 12,224,243,241,145, 5, 31, 60,120,160,165,245,170,170, 10, 20,240,109,109,183, 30, - 60,208,102, 96, 67, 63, 25, 20,168, 6,127,233, 15, 81,131, 75,202, 14, 12, 32, 37, 62,164,208,135, 87, 12,240, 11,141,169, 14, - 40,108,254, 3,129,192,245, 27,191,126,255,102, 98, 98,250,207,204, 12,186, 20, 1,114,160,221,223,127,236,151, 46, 17, 95, 1, - 48,128,239,149, 60,122,244, 40,176,171, 42, 45, 45, 77,204, 68, 11,133,117, 0,121,109,127, 96,113,239, 62,203, 61,120, 45, 67, -218, 78, 16, 3,200,133,212, 10,108,155,239,140, 22,238,104, 0,235,189,240, 0, 1, 68,120, 21, 16,241,235,130, 48, 91,133, 68, -182, 19,177,214, 19,196, 87, 60, 88, 93,142,231,242,116, 92,197, 52,124, 2,153, 72,189, 88,149, 65, 76, 3, 54,236,255,173,194, - 57, 27, 1, 94,243, 3,106,174, 62,126,246,233,251,119,208,181, 86, 42, 74,130,192, 10,224,226,213, 87, 55,111,191,227,224, 96, - 86, 86, 20,120,255, 17,251, 65,243,143,159,255, 87,150, 7,153,239, 97,199, 96,160,197,200,206,198,240,231, 15,168, 31, 32,192, -203,112,239, 17,131,187, 29,131,188, 12, 72, 13, 77, 83, 18,188,220, 39,114, 72,122,160, 0,214, 65, 12, 82,157, 10, 41,235,225, - 21, 0, 77, 75,127, 56,192,117,117, 59,158, 43,221,225,128,245,238,157,159,191,127, 49, 50,179,252,253,255, 31,152, 78,254,252, -253,247, 27,216, 17,248,251,151,241,246, 77, 6, 6, 47, 82, 93, 2,236, 7, 0, 59, 82,220,220,220,252,252,252,196,215, 1, 68, - 14,254, 80, 88,250, 87, 87, 87,183,182,182, 2, 75,127,120,101, 0, 36,129,213, 0,176,244,223,188,249, 46,100, 2, 0, 50, 75, -172,103, 23, 63, 90,250, 99,150,254, 64, 0, 16, 64,131,101, 8, 8,107, 97, 74,100, 65, 76,210, 90, 85,236, 38, 80,105,237, 16, -208, 37,196, 24,197,207,207,250,254,195, 15, 17, 33,174, 80, 63, 13, 96,254,100,103,103,102, 6,182,215,254,255,247,113, 83,246, -118, 85, 6,154,240,246,253,119,160, 26,172,122,101, 37, 25,239, 62,252,175,161,204,224,100, 9, 26,242,186,113,135, 65, 79,131, - 65,144,143,193,211,129,225,223, 63, 6, 96, 39,224,214,125,144, 26,252,129, 76,144, 65,252, 70, 18, 74,198,205,136, 1,192,246, - 43,176, 5,122,247,238, 93, 96, 75,220,214,214,150,135,135, 7,114, 98,176,130,130,194,169, 83, 98,141,141, 79, 25, 25, 25, 95, -189, 82, 83, 83, 83,184,246, 12,139, 94, 52,145, 85,171, 86,161, 52, 26,254,255, 15, 15, 15, 39,190, 14,160, 91,233, 79, 70,221, - 0, 7,239,100,164,217,110,220,252,207,202,192,246, 15, 52,239,251,251,239,159, 95,255,255,126,251,243,231,187,138, 6, 25,142, -209,209,209, 1,134, 63,145,165, 63, 3,248,154, 79, 96,147, 31, 94,124,163,113,113, 1, 72, 47, 1,174, 12,141, 75, 16, 0,155, -255,144,162, 31, 72, 34,183,253, 33,179,196,192,202, 96,180,244,199, 90,250, 3, 1, 64, 0, 13,135, 85, 64, 4,123, 30, 4,193, -255,255, 12, 76,225,239, 41,175, 3, 32,139,145,152,194,222,227,105,254, 3,129,184, 8,207,227,167,159,129, 21, 64,223,244,211, -118, 86,178, 70,122,226,140,172,140,144,229, 64,144,149, 26, 64, 89,160, 26,172,122,149, 21, 56,142,158,253, 14,172, 0, 68,140, - 25, 42, 50, 25,242, 19, 24,248,121, 65, 35, 63,141,147, 24, 26,242, 65, 10,142,158, 5,169, 33,105,160,140,242,197,160,180, 91, - 6,250,230,205, 27,200, 61,136, 91,183,110,125,244,232,145,135,135,135,162,162,226,231,207,159,223,191,127,127,253,250,159, 3, - 7,128,133,133,137,163,163,163,140,140,204,181,103,175,209,244, 2,219,173,248,111,236,250,243,231,207, 96, 75,204,240,210, 31, - 79, 53,128,191, 14,248,164,165,205,126,233,210,191,255,255,185,153, 88,152,153, 25,255, 0, 75,255,223,191, 63,255,250,245, 91, - 95,159, 36,151,112,113,113,145, 52, 7, 0, 47,238,113,113,105, 81, 7, 0,155,249,105,224, 54, 62,114,233, 15,111,254,143, 2, -252,165, 63, 16, 0, 4,208,232,113,208,176,214, 34,149,214,143, 66,235, 0,188,213,137,168,168,228,157,251,207,244,181,197, 42, -242, 45, 22, 44,191,204,201,193, 98,160, 35, 6,191, 78,249,223,191,255,119,238,191, 23, 23,195, 62,234,170,164,172,182,117,223, -197,132, 96,134,255,247, 24, 44,130, 24,148,100, 25,150,110,132,201,229, 51,252,253,203,176,117, 31, 72, 13,237, 2, 10,107,255, -140,118,203, 64,111,220,184,161,169,121,127,254,124, 32,243,111, 83,211,165,117,235,190,169,171,171, 3, 43,128,123,247,238,189, -124,249,210,200,200, 8,216,132,199,181, 12, 84, 73, 73,233,244,233,211,120,238, 24, 33,242,122, 94,248, 16, 16,144,164,117, 15, - 0, 88,178, 67,138,126, 92, 67, 64,184,164, 16,181,154,140,204, 91, 91,187,191,251, 15,252, 98, 99,229,249,207,242,227,223,191, -143,191,126,125,118,114,254, 47, 39, 71,116,135,152, 17, 88,254, 18, 63,244, 15,215, 2, 47,238,209,184, 36,213, 1,184,214,206, -226, 1,104,165, 63,124,228,103,116, 54, 24,127,233, 15, 4, 0, 1, 52, 90, 1, 80, 19, 64, 39, 0, 8,141, 2, 9,137,170,124, -248,248,230,228,217,103,230,198, 82,158, 46, 74, 59,246,222,219,186, 11,148,106,107,138,173,128,165, 63, 80,156,157,157, 13,215, -126, 96, 35,203,172,173,107, 75,251,231,129, 86,130,206,104, 1,173,254,116,177, 6,173, 4,237,175, 5,149,254,253,243, 24,254, - 50,240, 17,191, 31,152,212, 54, 59,174, 30, 3,237, 86, 1,125,253,250,213,208,240, 7,164, 36, 49, 49,249,191, 99,199,189, 91, -183,110, 65, 54,130, 57, 56, 56,216,219,219,227,217, 4,160,172,172,124,249,242,101, 92,157, 0, 96,243,223,216,216,152, 24, 55, - 64, 22,131, 66, 22, 5, 1,217,196,215, 1,104, 27,205,136,220,119, 6,175, 3,112,201, 18,208,207,196,244,203,220,252,141,148, -212,151, 75,151,120, 30, 61,250,161,168,248, 85, 91,251,175,172, 44, 3,209,151,109,145, 87,118, 35,107, 65,227,226,247, 56,178, - 44,154,189,164, 58, 3, 2,144,203,125, 72,111,128,212, 33,205, 97, 6,240,172,233, 0, 8,160,209, 10, 0,203,234, 29, 58, 24, - 37, 43,167,251,248,209,229,181, 91,110,170, 40, 10,122,187, 41, 11, 10,112,188,255,240,227,252,229,151,192,182, 63,176,244, 7, -202,226,209,107,101,159,122,248,224,236, 99,103, 63,121, 59, 49,204,110, 7,237, 4,190,251,144, 97,238, 42, 80,219, 31, 88,250, - 3,101, 41, 47,208,201, 40,253,105, 52, 7, 32, 33, 33,241,224,129,200,153, 51,160,225,157, 91,183,248, 76, 77,181,132,133,133, -225, 59,129, 9, 30, 5, 97, 97, 97,113,240,224, 65, 70,140, 61, 80,192,210, 95, 69, 69, 5, 88, 67, 16, 83,250, 35,143,254, 67, -186, 2, 68,214, 1,100, 23,103,184, 74,121,194,165, 63,172, 14,248, 39, 47,255, 13,136,200, 10,115, 50,138, 93,252, 62,197,111, - 32, 37,122,241,151,254,160, 69,162, 35,126, 2,128, 1,219,126, 96,120,149, 0, 16, 64,132,151,129, 18, 63,197, 74,204, 50, 80, -226,245, 18,175,157, 18,123,177,250,142, 60,123, 73,154,139,102,101,227, 86, 82,177,120,247,250,206,189, 7,207,143,159,121, 2, - 63, 11, 72, 92, 76,138,224, 89, 64,130, 34,106,222,193,221,231,142, 79, 91,185,245, 86,219, 84,186,158, 5, 68,231,210, 31, 8, -212,213,213, 47, 94,244, 74, 76, 60, 3,238, 1,152,132,133,233,115,113,113,145, 84,127,132,135,135,223,188,121,243,204,153, 51, -204,160,185,118, 38, 96,209,207,198,198, 6,108,251, 3, 77, 38,181,244, 39,163, 14, 24, 5,180, 6,160,181, 64,105,173,238,179, -220,177,238, 9, 24,157, 12,192, 15, 0, 2,136,133,146, 1, 1,154,234, 37,210,192, 65,229,102, 82, 1,176,172, 7, 34,117,178, -244, 2,203,122, 34,119,123, 81,203, 23,116,219,195,129, 12,128,197,189, 37, 24, 80, 88,139, 16, 83,220, 99, 2,204,178, 30,200, -134,108, 11, 24,173, 0, 6, 85, 29,192,240, 16,139,184, 73,181,201, 8, 15, 25,130, 87,190, 3, 4,208,232,165,240,163, 96, 20, -140,130, 81, 48, 66, 1, 64, 0,141,222, 8, 54, 10, 70,193, 40, 24, 5, 35, 20, 0, 4,208,104, 5, 48, 10, 70,193, 40, 24, 5, - 35, 20, 0, 4,208,104, 5, 48, 10, 70,193, 40, 24, 5, 35, 20, 0, 4,208,104, 5, 48, 10, 70,193, 40, 24, 5, 35, 20, 0, 4, -208,232,165,240,212,209,139,231, 88, 52,154,234,189, 7, 6,171, 87,175, 38, 67,239,253,251,247,239,222,189, 75,158,222,209,180, - 49,170,119, 84,239, 80,209,139, 7, 0, 4, 16,206,141, 96, 68,158,130, 73,117,189, 84, 7,105,161, 31, 25,216,216,102, 45,229, -196,163, 6, 88,134,226,217,123,137,223,205,112,189,189,189,189,197,197,197, 36,221,150, 14,215,123,101, 42,159, 78,246, 39, 50, -110, 90,215, 19,158,242,255,205, 95, 32, 99,214,172, 89,224, 75,107, 73, 0,102,234, 43,254,124,250,196,201,201, 9,172, 3, 66, - 67, 67,105, 23, 5, 68,238,171,192,234,223,129,210,139,203, 52,250, 36, 96, 70, 70, 70, 38, 48,128,108, 97,251,245,235, 23, 51, -248,108,231,255,255,255, 51,140,130, 81, 64, 61, 0, 16, 64, 44,184,210, 58,214,164,198, 72,232, 86, 57, 72, 38, 33, 79, 47, 49, - 45, 98,178,193,238,221,187, 25, 56, 52,241,148,194,229,229,229, 98, 98, 98,104, 82,192, 2, 29,191,177, 16,189,144,162,255,196, -137, 19,144,106,128, 36,189,255,174,213, 49,105, 53, 45,218, 7, 58,174, 0,200,134, 72, 1, 69, 8,250,136,239, 83,209,191,255, - 12, 43,118,128, 52,122,218,179,106,171, 92, 5,214, 1,160, 10,143,136,106, 64, 88,238,212,235,219, 47, 14, 95,147,255,250,147, -219,211,253,131,180, 4,227,153, 51,199, 62,125,250,225,228,228, 68,163,116, 70,211, 70, 3, 30,189, 4, 75, 76,226,147, 37,169, - 0, 24,191, 93, 93, 93,165,165,165,196,236, 55, 70, 6,192,178,158, 5, 12, 32, 59,215,128,137, 4,104,200,223,191,127,255,128, - 1,144, 65, 35, 7,111,221,186, 21,127,224,120,121, 17, 62, 77,122,219,182,109, 36,169, 31, 5,116, 3,144,253,192,104,235,254, - 1, 2,136,133,164,210,223,216,216,248,236,217,179, 4, 51, 33,214, 76,133, 71, 47,154, 57,192,178, 24, 50,172, 65,246, 1,147, -105,190,179, 24, 56,213,102,173,114, 0, 53,141, 87,243,131, 74,127, 66, 37, 56,230,217,241,192, 18, 28,255,169, 44,112,189, 64, - 54,176, 5,109, 1, 6, 36,233,133,148,248, 16,178, 3,182, 91, 27, 88,250,151, 5,115,116,173,253,129,199,131,252,223,139,117, -212,152,191,126,255, 95, 20,203,113,226,234,159,239, 95,255,127,251,197,224,104,112,245,234,173,191, 4,187, 2,247, 30,247,159, - 59,205,205,203,199, 40, 33, 41, 46, 42,174,242,240,238, 47, 5,173,223,172, 28,175,246,172,127,179,126,253,250,192,192,192,209, -172, 66, 21, 0,140, 95, 95, 95, 95, 96, 29,128,150,134,141,140,140, 26, 27, 27,129, 82,216, 91,100, 44, 44,108, 48,240,248,241, - 99, 85, 85, 85, 96, 53,192,203,203,123,231,206, 29, 30, 30,158,211,167, 79, 31, 63,126, 60, 59, 59, 27,103,202, 7, 71, 61, 60, -255,194,115, 34, 68, 4,200,133,180, 18,176,130, 77,155, 54, 97,106,129,139, 0,185,196, 20,232, 27, 55,110, 36, 73, 61, 85,192, -139, 23, 47, 36, 36, 36, 70,147, 28,158,114, 31, 23, 0, 8, 32, 22,146, 74,127,252, 54,225, 57,168, 4,255, 17,231,104,165,127, - 71, 71, 71, 69, 69, 5, 92,132,248, 58, 32,205,120, 22,131,176,218,172, 93, 14,240, 86,191,171,171, 43,144, 1, 33, 49,199,197, -144, 75,112,172,165, 63,102,159, 0,211, 83,240,150, 62,176,198, 66, 14, 10, 98,244, 98,109,233, 3, 75,127,252,222, 20,249, 94, -164, 42,207,204,201,206, 40, 47,197,252,230,253,191,223,127,152,223,126,248,255,241,203,255, 59, 79,254, 49, 48, 49,136,112, 93, - 2,250, 75, 73, 73, 9,171,222,127,255, 87,107, 42, 43, 29,127,241, 82, 81, 78, 84, 71, 79,137,153, 93, 72, 94,241,253,251,239, - 63, 94,189,248,251,228,229, 15, 46, 22,160, 86,125, 92,122,105, 55, 34, 68,124, 20,147,167, 23,179, 69, 66,235,177, 20, 96, 56, - 2, 45,213,210,210,218,188,121, 51,114,116, 0, 51, 17,158,210, 31, 8, 88, 89, 89, 57, 56, 56,222,188,121,163,166,166,102,104, -104, 8,172, 15, 38, 77,154, 4,108,245,235,234,234,174, 91,183, 14, 88, 1, 92,186,116, 9, 88, 37,224,234, 7,248,251,251, 67, -252,139, 43, 23,227, 41,148,129,101, 55, 36,100,176, 54,224,128,226, 47, 95,190, 36,166, 2, 32, 73, 61,164,248,222,191,127, 63, - 86, 41, 71, 71, 71, 98, 74,118,160,118, 41, 41, 41,117,117,245,209,106,128, 84, 0, 16, 64, 44,152,185, 11, 87,251,157, 62, 14, - 2,230, 22, 96,233, 79,100,133,129,115,180,135, 33, 13, 72,174,158,101,198,192,246, 29,207,232, 63, 90, 9,142, 86,153,225, 47, -193, 33, 0, 94,121,156, 56,113, 2,185,249, 79,140,222,101,165, 60,152,185, 52,186,231, 43,126, 93,255,254,253, 99,231, 98,100, - 98, 98,224,226,100,248,240,233,223,207,255,255,185, 57, 25,127,252, 99,248,254,243,191,140, 40,211,191, 63, 12,183, 31,255,221, -179,103, 15,214, 78,192,167,143, 39, 4, 4,184,217,216,254,167, 38,152,255,253,251,255,197,171, 95,143,158,126, 96, 96,125,204, - 41,248,243,249,171, 7, 76,108, 31,175, 93,251,240,244,229, 30, 82,231, 18, 40, 28, 17, 66,190, 89,140, 24,128,124,226, 30,230, -253,157,184,192,187,119, 46,112,182,144,208, 30, 92, 69, 36,193,250, 6, 89, 4, 79,221, 3, 76, 90, 62, 62, 62,144,114,255,234, -213,171, 16, 6,164,237, 15, 20,199, 99, 35, 59, 59,251,215,175, 95, 53, 53, 53,129,101, 31, 48, 33, 37, 39, 39, 3, 5,127,255, -254,189, 96,193, 2, 96, 7,250,220,185,115, 43, 87,174,252,254,253, 59,230, 93, 55, 16,224,237,237, 77,118,164,204,157, 59, 23, -127, 37, 74, 76,139, 30,110, 8,145,234, 25,192,231, 53, 1,139,239,103,207,208, 47,244, 1, 10, 18, 95,160, 63, 3,131,209,106, - 0, 19,192,199,124,176,118, 5, 0, 2,136,133,152, 86, 60, 37,197, 49,169, 0,185, 29, 77, 84,171,127, 86, 58,131, 36,195, 44, - 95, 80, 86,156,117, 54, 13, 62,218, 3,110,245,127, 68,238, 7,224, 47,193, 95,189,122, 5, 47,181,137, 44,193,241, 3, 72,189, - 2, 44, 47,112, 29,182,129,167, 0,130,140,255, 96,234, 5,106,121,115,173, 72, 18, 60,248, 3, 17,249,254,247,255,143, 95, 12, -191,193,220,223,127,254,255,103, 2, 49, 46, 95, 58, 11,172, 71, 25, 24,216,208,140,253,248,241, 42, 43,187,160,136,144,192,135, -119,223, 62,124,252,112,226,204,139,167, 47,255,179,113,127,147, 86,249,242,253,219, 27, 85,189,223, 10,154, 63, 87,206, 62,123, -231,206, 29, 6, 6,142,209,156, 67, 97,243, 31, 8,128,205,127, 96,113,191,101,203, 22,109,109,237,208,208, 80,130,165, 63,164, - 2,120,253,250, 53, 23, 23,151,157,157, 93, 79, 79, 15,176, 67, 0, 76, 6, 11, 23, 46, 4,150,254,192, 70,198,222,189,123, 47, - 95,190, 44, 34, 34,130,231, 42, 27, 96,253,141,107, 8,104,246,236,217,120,172,166,202, 16, 16,208, 16, 50,134,128,128,165, 54, -102, 5, 64,198,241, 77,163,213, 0,169, 0, 32,128, 6,215,113,208,152,247,138, 16, 57, 56, 0,106,239, 87,220,103, 96,102, 75, -115, 83, 96, 16, 80,152, 5,190,248, 15,255,232, 63, 85, 6, 49, 32, 19,191,240,182, 63, 50,128,204, 10, 96,118, 47,136,108,177, - 46, 45,225,198,236, 13,240,126, 42,126,240,235,255,139, 55,192,214, 31, 19, 15, 23,168,171, 14, 44,244,127,252,100, 0,214, 1, - 64,242,215,111,134, 31,223, 25,126,253,132,181, 64, 81, 43, 15,158, 63, 69, 79, 31,201,201, 42,242,252,103,101,121,243,253,251, -254,131,143,175,221,121,250,238,221, 23,109,227,191, 95,127,252,249,241,243,239,247,111,255, 94, 60, 98,248,254,149,161,187,187, -123,244,132, 40,172, 61, 21, 34, 19, 36,164,249,175,165,165, 5,108,248, 3, 43, 3, 96, 5, 0,233, 4, 16, 44,253, 33, 67, 64, - 6, 6, 6, 28, 28, 28,192, 66, 63, 41, 41,169,189,189, 29, 88,146,158, 60,121,242,224,193,131,151, 46, 93,250,248,241,163,170, -170,234,167, 79,159,240,220,114, 19, 16, 16,128,217,182,128,244,120,240,247, 15, 6,106, 8, 8,107, 39,128,164,230,255,104, 53, - 64, 54, 0, 8,160, 65, 81, 1, 64,134,254, 33,221,100,228, 58, 0,158,217, 32,131,245,196,143, 20, 67,202,125, 96,195, 31, 60, - 10,196, 54,107, 41,245,221, 12, 89,249,227,226,226,178,103,207, 30, 92, 93, 25, 92,189, 25,172,133, 59, 49, 99, 65,241,149, 95, -165,196,153,162,124,217,128,197, 61, 63, 47, 35, 19, 35,184,225,207,240,255,199, 55,134,175,191,254, 3,187, 5, 95,127,252,255, -247, 31,251,205, 31,241,249, 95,117,245,239, 73,104,188,219,189,253,213,187,119, 63, 12, 44, 63,233, 9,125, 97, 96,253,249,227, -219,191, 87, 79,255,127,253,202,248,231, 15,163,144, 8, 35, 3,227,191,209, 92, 65, 21, 0, 73,207,200, 19, 42,192,154, 0,185, -104,198, 58, 19, 0, 44,217,203,202,202, 88, 88, 88, 22, 45, 90, 52,127,254,252,196,196,196,142,142, 14, 96,137,252,224,193,131, -239,223,191, 3,179, 9,176,237,159,145,145,129,103,241, 18,217, 83,175, 3, 53, 4,132,181, 19, 64,222,233,173,163,128, 84, 0, - 16, 64,131,165, 7,128, 60,108,141, 89,208,227, 42,100,145,193,172,179,105,176,162,255,246,234, 73,247,193,171,128, 16,245, 1, -158, 81, 32, 74, 70,120,128, 14,131, 55,255, 33,189, 1, 56, 27,216, 3,128,236,177,194,156,124, 38, 88,250, 67, 86, 1, 97,234, -253,243,151,225,235,183,255, 63,127,129,166,124,129, 36, 11, 59, 84, 16, 88, 1,124,255,253,255,237,187,255,175,223,255, 63,119, -237,207,191,127,160,161,188,171, 79, 81,204,252,243,135,225,217,227, 95,143,239,190, 63,114,252, 61,176,145,119,237,198, 63,159, -168, 63,108, 44,255, 95,191,100, 56,178,139,225,211,167,255,255,255, 49,216, 56, 49,114,112, 48,120,122,250,227, 95,105,184, 97, - 65,122, 64, 2, 69, 43,116, 41,185, 65,140,164,123, 23,224, 64, 72,104, 15,221, 18, 51, 90, 2, 6,114,141,140,140,206,157, 59, -183,121,243,102,100,113, 92, 83,193,192,182,133,128,128, 0,164, 17, 61,111,222, 60, 96, 63, 0, 88, 19, 64,106, 14,160,212,135, - 15, 31,128, 61,128,111,223,240,221,245,146,154,154,138, 60,116, 3,105,254,227, 31,255, 25,216, 33, 32,180, 78, 0, 37,205,127, -136,246,209,182, 63,145, 0, 32,128, 6, 75, 5,112,246,236, 89, 92,107, 87,128,226, 4,214,143,178,115,175, 86, 56,196,240,231, - 44,131, 34,119, 90,171,226,172, 3,192,142,246, 44, 88,101,224, 74,252, 40, 16,242, 74, 80,204, 85,161,152, 57, 28, 88,138, 65, - 74,127,228, 25, 96, 72,219, 31,194,197,218, 3,128,235, 37,175,100,185,125,251,246,163, 43,147,254,137,254, 99, 98, 97, 96,101, - 2,229,180,223,255,254, 3, 11,247,207,159,255,255,250,205,240,231, 55,168, 62, 40, 44, 2,117,167,174, 62,125,130,169,247,225, -173,137,218,218,255, 14, 31,252,203,200,196,240,250, 5, 35, 7, 39,195,193, 29, 12,191,190, 3, 75, 8, 6, 61, 35,214,103,143, -254,217,219,123, 3,243, 45,158,157,132,192,210,191, 43,155,161,108, 42,249,117, 0, 37, 23, 8,147,167, 23,215,176, 6,125, 0, -100,229,143,143,143, 15, 36,234, 33,221, 89, 96, 51, 31,171,226,127,255,254,157, 63,127,222,214,214, 22, 46, 2,172, 3, 32,101, -241,239,223,191,255,254,253, 11,140, 68, 81, 81, 81, 92,147,192,240, 81, 32, 50,218,239, 3, 56, 4,132,214, 9, 32,187,249, 63, - 90,244,147, 10, 0, 2,136,180, 10, 0, 88, 16,211, 98, 39, 36,164,177, 12,204, 21, 64,134,139,139, 11, 90,219, 31, 82,140, 18, -191, 85, 21,190, 10, 8,194, 37,166,237,143, 60, 3, 12, 1, 16, 46,100, 49, 40,126,189,240,210, 31,109, 62,128, 24,189,184, 0, -176,249,143, 75,175,170,170,234,252, 57,191,157, 45, 88,129, 5,192,239, 95,255,216,217, 64,121,245,243,215,255, 63,127,255, 7, - 22,253,103,175,252,253,251,239, 63,174,117,156, 64,189,139, 23,254,177,119, 96, 14,140,102,254,242,249,255,231,143, 12, 95, 63, - 51, 42,170,254,255,251,155,145,133,137,227,195,187,127,207,158,252, 42, 41,244,193,223,246,159,144,207,160, 38,199, 48,185,136, - 33,183,143,162, 58,128,236, 62, 1,121,122, 41, 95,247, 73, 94,202, 7,150,254, 13, 13, 13,200,141,253,174,174, 46, 32, 23,215, -238,176, 95,191,126, 1,139,176, 31, 63,126, 48, 51, 51, 67,238, 62, 91,187,118,109,112,112,240,247,239,223,129,130, 63,127,254, -228,225,225, 1, 86, 3,248,189, 67,222, 90,160,129, 29, 2,130,119, 2, 32,140,209,162,159, 62, 0, 32,128, 72,168, 0, 40, 44, -253,241,104, 7, 22,250,144, 82, 30, 50,110, 14, 95,114,138,220,240, 71,171, 24, 80, 0, 51, 35, 3, 27, 19, 3, 39, 51, 3, 15, - 11,195,207,207,171,219, 89, 25, 56, 79,165,133, 40, 50,112, 10,205, 90, 76, 84,195, 31,235,154, 31, 72, 9,142,127, 81, 60,114, -233,143, 60, 31, 64,140, 94,252,165, 63, 30,189,109,157, 51,138,242, 51, 56, 56,128,173, 69, 6, 93,117,102,104, 88, 93,254,251, -251,239,255,191,255,152, 75, 74, 74,240, 24,222,212, 50,163,164, 36, 3,216, 99,248,245,251,255,223, 63, 12,192, 46,132,131, 55, -195,231, 15,140, 55, 46, 2, 11, 24, 38, 63,223, 32,252,165,127, 67, 50,131, 10,248, 72, 18,101,105, 6, 10,251, 1, 35, 1, 96, -238,249, 2,173,236, 2, 3, 92, 90,128, 21, 0,176,172, 7,109,199,208,215,255,243,231, 15, 43, 43, 43,176, 77, 13,108,196, 0, - 75,255,111,223,190, 1,155,255,130,130,130,120,150,129,194, 1,124, 64,149,152,193,159,193, 48, 4, 4,239, 4,144, 17,206, 68, -110, 23, 24, 5,152, 0, 32,128,136,173, 0,104,212,246,199,218,181,199, 28,240, 33,219,106,130,163,255,148,148,254, 12,168, 51, -189,240, 58,140, 1,188,154,150,160, 94, 92, 51, 1,196,232,237,155, 56, 3, 24, 92, 76, 76, 12, 71,206,130, 70,252, 33,179,190, -224,161,255, 18,130,122,123,122,102,100,100,130, 55,124, 48,129,180,156, 58,196,240,245,203,191,255,255, 24,252,252,188,221,221, -221,241,148,254,229, 49, 12, 2, 60, 12,207,222, 48,112,178, 51,252,251,207,192,205,193,208,154,206, 80, 61,115,152,215, 1,184, -186, 23,196,164, 73,180,210, 63, 35, 35, 3, 82,244,111,222,188, 25, 88, 74, 98,173, 6,128, 21, 0, 19, 19, 19,176, 61,251,249, -243,231, 51,103,206, 24, 26, 26, 2,171,129,143, 31, 63, 94,188,120, 81, 81, 81, 81, 88, 88, 24, 88,250, 3, 69, 8,118,104, 32, - 59,194, 72,234, 16, 12,248, 16, 16,121,109,127,178,117,141, 2, 32, 0, 8, 32,244, 10, 0,215,146,127, 34, 87,191, 81,210,131, - 6, 42,192, 60,148,141, 96,105, 56, 43,109, 38,104,180,231, 22, 3, 8, 33,192, 71, 48,186, 79,182,155,137, 41,133,225, 62, 2, -150, 17,144,253, 4,192,106,131,212,171,140,129,122,151,150,112, 67,234, 3, 82,111,232,133, 7, 23,100,214,151,248, 14,199,140, -233, 8,189, 95, 62,129, 10, 8, 63, 63, 63,194, 97,181,132,250,197, 40,173,245, 14,224,208, 63, 3,234, 52, 47, 48,192,129,101, +230,149,181, 27, 1,233,138,145,153,133,253,255,191, 63,255,254,253,217,114,228, 9,242,162, 80, 92,122,129, 65,244,242,229, 75, + 9, 9, 9, 50,236,165, 68,239,104,222,103, 32,101,165, 22, 64, 0, 13,249, 33,160,234,106,196, 21,118,173,173,102,244,211,123, + 10,116,169, 94,171, 89, 43,156, 65,170,203,113,237, 83,197, 37, 78,170, 57,195,173,175,250,235, 43,203,219,251,170, 63, 46, 73, +255,121,124,235,191,226, 19, 94,173,111,124,242,108,220,188,184,212, 31, 57,114,196,198,198, 6, 82,244, 67, 10,113, 72, 35, 22, + 94,136,255,131,129,135, 15, 31,162,233, 61,119,238,156,177,177, 49, 39, 39, 39, 11, 11, 11, 80, 35, 92, 59,164,220,255, 11, 3, + 63,127,254, 60,123,246,172,131,172,221,224, 15, 61,160,203,223,190,125,123,252,248,113, 1, 1, 1,180,141, 17,132,251, 4,140, + 76,236, 28, 66, 2,130,234, 95,191, 60,253,242,249, 49,168, 27,192,248,159,225, 63,190, 17, 33, 96, 40,173, 89,179,230,214,173, + 91, 64, 54, 48, 24,139,139,139,137,183, 14,162,247,222,221, 59,192, 48,103, 99,103, 47, 40, 40,164,233, 46,132, 17, 14, 0, 2, +104, 16, 85, 0,184, 78,154,100,192,123,208, 24,164,224, 70, 46,202,137, 7,148,232, 29, 78,128,194,189,163,116, 40,189, 62, 63, +188,254,241,208,170,111,223,126, 42,152, 51,113,202, 48,170, 62,186,100,202,112,241,253, 79,158, 11, 92,113,111, 24,165,177,106, +186,118,237, 26,176, 4, 1, 22,118, 44, 48, 0,169, 12, 32, 13,255, 63,127,254, 0, 75,112, 96,251, 29, 88,250,239,219,183,143, + 89,216, 4, 89,239,183,111,223,206,159, 63,111, 97, 97,193,198,198, 6,191, 52, 13,168, 29, 88, 54,253, 1, 3,160,198,239,223, +191, 3,213,124,249,242,101, 48,199,108, 85, 85, 21,114, 38,250,252,249,179,129,129, 1, 25,122, 23, 47, 59,203,201, 41, 6, 44, +144, 65, 21, 0, 35,195,127,200,110, 1,220,197,242,179,103,207,128, 33, 19, 21, 21,165,164,164, 4, 57,151, 66, 72, 72,200,196, +196, 4,171,226, 4,119,148,157,113,151,111,220, 56,192,203, 85,212,223,100,104,164,243,252,201,171, 93,219, 14, 40,232, 24,126, +250,244,113,180,176, 38, 27,160,141,247, 34, 47,253, 7, 8, 32, 22,172,101, 1,164, 20,192,197,166, 81,233,159,149,133,253,158, +244,247,239,223, 47, 95,190, 28, 79, 29, 0, 41,193, 73,109,194, 83,168, 23,222,246, 39,163,249,143,118,243, 12, 46, 5, 52, 10, +109, 72,143, 1, 78, 66, 4,223,189, 3,237,154, 17, 18,218, 51, 8,147,239,175,199,215,216,143, 45,254,249,237, 95,144, 10,179, +186,232,159,127, 66,255, 89,133,152, 63,191,101,227,252,252, 93,243,226,148,179,106, 25,223,184,228,177,181, 91, 25,175, 95,191, + 14, 44,193,157,156,156, 32,229, 56, 16, 0, 11,113,200,213, 55,192, 66, 28,216,126,127,252,248,241,254,253,251,129, 53, 1,218, +206, 55,160, 50,160,154,139, 23, 47, 2,235, 15, 96, 3,150,157,157, 29,162, 23, 82, 1, 0, 53, 2, 75,183,203,151, 47,255,248, +241,131,224,166,185, 7, 15, 30, 0,109, 1,150,188, 64, 55,136,139,139,171,170,170, 66, 6,151,136, 1,148,232, 5, 58,181,166, +166, 6,126, 24, 42,176, 52, 7,214,136, 98, 98, 98,194,194,194, 68,150,254,243,146,146,188, 12, 13,129,108,137,220, 92, 78, 46, +241, 47,159, 30,125,250,120,247,255,255,191,160, 3,227,254, 17,184,131, 26, 88,220,139,136,136, 44, 90,180, 40, 62, 62,126,211, +166, 77, 64,238,161, 67,135,126,253,250,197,192, 32,135, 85,253,219,246, 34, 56,155,231,215,111,169, 63, 63, 10, 74,235,251,123, + 26,187,123,166, 73, 51,253,157,214,211,231, 20, 17,133, 75,239, 40, 32,169,244,103, 64, 58, 10, 20, 8, 0, 2, 8,123, 15, 0, +249, 8, 20, 92,108,170, 3,250,159,225, 76,133, 1, 40, 88, 29, 64, 18,128,215,169,243, 3, 23, 97,202, 38,174,143,163,105, 51, + 28, 98, 56, 50, 73,240,218,238, 1, 4, 63, 62,188, 81,187,191,245, 21,243, 95, 21,126, 6,121,185,255,204,122,108, 44, 74, 74, +108, 63,127,252, 60,250,248,231, 71, 22,230,127,172, 63,246, 44,102,242,202,255,199,130, 62, 22, 4,191,252, 82, 80, 80,208,209, +209, 17, 88,116, 2,139, 81, 96, 67, 30,210,240, 7,150,221,192, 86,234,193,131, 7,153,192, 0,171, 94,160,202,171, 87,175,218, +216,216,240,241,241, 1,181, 3, 69,128,165, 63,176, 20,251,244,233,211,233,211,167,129,213, 0,208, 52,200, 76, 0, 46,112,233, +210,165, 99,199,142,221,191,127, 31,168, 5,104,187,132,132, 4,176, 21,108,101,101,197,205, 77,120, 43, 56,217,122,129, 78,130, +220,252,131, 44, 8, 57, 23, 26,216,138, 34,166, 10, 97, 98,102, 67,230,190,152, 60, 89, 34, 64,166,187,123,226,239,223, 95,193, +129,195,248, 15, 88,250,255, 7,117, 1,254,227, 30,127, 59,121,242,100, 69, 69, 5, 48,208,130,130,130,100,101,101,129, 21,237, +182,109,219,204,221, 9,109,250,101,100, 92,114,231,249,218,219, 79, 55,109, 92,200,204,204, 88,148, 27,171, 47, 33, 50,171,160, +126, 54, 49,122, 71, 1,142,210, 31,185,201,143, 86, 31, 0, 4, 16, 9,171,128,104,125,220,163, 18,110, 64,139, 38, 60,133,122, + 25,200, 26,247,167,122, 91, 30,126,153, 37,241,133, 56, 86,149,192,182, 63,145,205,127, 96, 33, 8, 44,254, 48,185,200,130,152, + 0,174, 6,126,203, 32, 38, 23, 43,120,119,245,220,179,167,159,196,120, 89,148,120,255,179,136,252, 99,177,244,224,214, 95,204, +105,212,203,206,207,201,246,229,251,183,111,127,229,152,191,189,191,116, 12, 75, 41,198,196, 4,185,236,254,246,237,219,192,214, + 58,176, 16, 23, 6, 3, 96,203, 84, 64, 64,224,227,199,143,192, 54, 41,176,120,130,140,242,163,233,133,136, 3,139, 93, 96, 29, +112,235,214, 45, 46, 46, 46,160, 46, 96,243, 89, 84, 84,148,135,135, 7, 40, 2,172, 66, 32, 67, 67,152,149, 7,114,251,125,247, +238,221,119,239,222, 85, 84, 84,116,119,119, 55, 51, 51,251,246,237,219,190,125,251,128, 29, 11, 96,245, 67,176,237,191,123,207, +222,123,207, 63,242,170, 88,168,185, 39, 75,155,249,189,255,201, 4, 20, 33,168, 23, 88,250, 3, 43, 12, 96,229, 1, 44,130,245, +244,244,224,195, 56, 16, 6,193,210, 31, 88,244,115,243, 72, 9, 9,235, 44, 93,113, 41,105,222,188,109,231,207, 3, 17,176, 7, +192, 0,154,238,254, 10, 85,195, 8, 68,248,214, 3, 1, 11,122, 96,171, 63, 39, 39,135,151,151, 23, 24,116,107,215,174, 5, 58, +230,205,155, 55,106,106,106, 4, 83,215,196,243,183,123, 78, 92,153,221, 83,201,194,252,157,233,239,231,174, 9,243, 86, 30, 58, +251,140,137,133,212, 19, 70, 71, 1,145, 0, 32,128, 88,136, 47,232, 7,243, 84,204,136,173, 6, 32, 67, 55, 36,141,222, 96,118, + 47,224,253, 0,130, 61,143,207,159, 63, 3,155,165,192,102,181,169,169, 41, 26,247,212,169, 83, 16, 65,172, 0, 34, 11, 36,129, + 45, 83, 96, 51, 22, 88, 52, 64, 4,145,185, 88, 1,223,143,183,219, 30,253,144,126,207,108,200,199, 40,250,154, 65,133,133,159, +137, 81,248,255,143,151, 95, 95, 50, 94,125,244,239,197,215, 31,192, 50,152,225,223, 45, 6, 35,119, 92, 21, 0, 59, 59, 59,176, + 20,150,150,150,118,117,117, 5,150,236,192, 34,242,237,219,183,192, 34, 9, 40, 5, 44,226, 33,199, 31,253,195,208, 11,209, 14, + 84, 0, 76,246,192,142,175,138,138, 10, 63, 63,255,151, 47, 95,206,159, 63, 15,172, 21,128,102,254, 4, 3, 60,173, 34, 96,245, +246,228,201, 19,125,125,125, 7, 7, 7, 25, 25,153,175, 95,191, 2,235, 15, 96, 55,247,248,241,227, 4, 7,115,128,122, 95,190, +251, 40,164,102,161,100, 27, 46, 32,163,246,243,235,135, 71, 39,183,222,222,187,144,160, 94,200,236, 5,176,115, 35, 46, 46, 14, + 44,112,129, 53, 1,164,232,135,140, 5, 1,217, 88,111,200,129, 86,123, 44, 28, 2,130,234, 2, 66,234, 76, 76,172,192,226,126, +238,252,253, 73,137,142, 16,189,169,169,169, 64,199, 67,244,130,189, 12, 46, 10,176, 77, 3, 0, 3,118,243,230,205, 89, 89, 89, +146,146,160, 3, 62,247,238,221, 11,172,204, 56,193,192,219,219,251,216,181,239,120,124,189,236,230,227,222,211, 55,230,116,148, +203,168,203,127,253,242,126,227,246,211,151, 46,223, 20,248,255,143,237,197, 75,239,156,232,163, 87,191,143,150,215,164, 2,180, +147,126, 48, 59, 4, 0, 1,196,130, 89, 22,192, 15,185,197,197, 30, 84,128,236,130,155, 66,189,100,143,255, 80,222,234, 39, 70, + 10, 79, 81, 78,246,170, 33, 96, 78, 6, 22,247,239,223,191,199,202, 37, 18, 0,107, 11, 96,249, 11, 44,244, 21, 20, 20, 48,185, +152,224,245,155,199,199,158,127,247,230,226, 58,252,248,159,148, 17,187,226,207,179,239,175,101,173,239,186,244,239,193,199, 47, +191,254, 63,253,252,151,147,133,233,207,199, 23,252,216,218, 49,240, 58, 0, 88, 98, 62,124,248,240,198,141, 27,218,218,218, 64, + 7,159, 56,113, 2, 50,178,143,107, 16, 31,168, 23,210, 9,128,232, 5,214, 1,143, 31, 63,214,213,213, 5, 22,223,192,250, 3, + 40, 2, 20,135,172, 14,194,211, 3,120,244,232, 17,208,124, 99, 99, 99, 96,233, 15, 84, 12,236,130,152,155,155, 3,173, 6,138, + 3,107, 14,252,161, 4, 84,243,143,137, 77,218,192, 5, 88,250, 51, 49,179,114,242,137,202,153,123, 63, 60,177, 9,191, 94,160, + 59, 63,124,248,240,244,233, 83, 57, 57, 57,107,107,107,160,165,144,145,159,248,248,120,136, 2, 96, 29,134,199, 82, 14, 14, 97, + 97, 81,253, 95, 63, 63,190,121,123,254,231,207,247,191,127,131,230,183, 33,122, 95,190,120, 1,215, 11,106,253,227,168,245,158, + 63,127,190,116,233,210,232,232,104, 96, 88, 49,128,175,163, 1,246, 6, 42, 43, 43,129,181, 17, 76, 9,206,229,137,183, 62,125, + 43, 63,120,161,163, 36,221,214,199,229,235,151, 55,171,214, 29,156, 57,119,237,246,162, 4,165, 87, 79, 58, 63,189, 16, 18, 18, +198,163,119, 20, 16, 57, 22,132, 89, 37, 0, 4, 16, 11,214,161, 24,130,236, 65, 14, 40, 95,163, 73, 12,104, 49,109,161,255, 13, + 98,200,101, 55, 90,101, 64,141,195, 32,113,130,155, 55,111,194,230,241,176,112, 73, 2,192, 34,120,247,238,221,144, 75, 60,144, +185, 88,187,249, 23,223,125,255,248,235,223,197,215,127,158,125,248, 35,126,130, 69,111,213,157,135, 15,174,222, 60,249,235, 15, + 11,243,175,127, 12, 63,126,253,127,255,255,159,168,224,127,172,133, 56,124, 1, 40,100, 25,207,203,151, 47,229,229,229,129,245, + 22,100,216, 7, 72, 34, 54, 56, 17, 2,240, 77, 3, 16,114,112,222, 28, 7,172,156, 32,183,160, 40, 42, 42, 34, 87,108,103,206, +156, 1,146,192,224,133, 92,186,135,235,218, 31, 96,104, 1,201,239,223, 94,126,249,252,248,239,223, 31,200,122, 55,129,171,106, + 96, 55, 8,164,247, 63,246,177,127, 96, 60, 78,158, 60, 25,216,204,183,177,177, 1,114,143, 30, 61,186, 97,195,134,236,236,108, +164,210, 31, 39,120,254,237,103,236,182, 19, 5, 97,222, 33,177,193,223,126,124, 90,191,233,192,132,105,203, 22,185,153, 2, 75, +255,209,178,155,234, 53, 1,114, 29, 0, 16, 64,212,220, 9,140, 60, 18,141,139, 61,156,192, 96, 40, 5, 32, 99,247,196,143,255, +224,153, 51,192, 31, 71,192,226,195,213,213, 85, 80, 80, 16, 43,151, 36, 0,212, 5,212, 11, 47,238,209,184,104,224,251, 95,190, +223,140, 12,103,222,252,124,245,247,239,222,123, 63, 86,173,254,177,239,137,232, 29, 54,254, 39, 31,127, 63,254,252,239,235, 31, +134,111,127,254,179, 11, 75,224, 42,178, 33, 43,253,255,254,253,251,231,207, 31, 97, 97, 97, 30, 30, 30, 96, 29,240,251,247,111, +136, 8,218,118, 48,100,189,144,149,254, 64, 53,223,191,127, 7,114,101,101,101,129, 45,107, 73, 73, 73, 96,181, 1,108,131, 3, +107, 62,136,201,120,198, 69,129,205,112, 96, 95,225,236,217,179, 79,158, 60,129, 92,195,121,242,228,201, 47, 95,190, 0,197,129, +157, 15,252, 65, 4, 84,195,244,239,215,211,243,123, 62, 60,185,245,239,239,239,239,159, 94, 63, 58,185,245,215,215,247,248,245, +194, 29,243,237,219, 55,248,236, 52,176, 19,112,245,234, 85, 96, 57, 14,185,180,253,227, 71,156,235, 41,129,126,253,243,251, 11, + 39,183, 4, 7,167, 16,100, 71, 48,178,222,217,179,103, 67,244,254, 67, 13, 48, 96, 7,110,209,162, 69,192,214, 67, 83, 83,147, +159,159,159,143,143, 15,164, 43,176,121,243,230,210,210, 82, 96,151, 11,143, 55,129,122, 23, 47, 94, 28,145,149,227,180,230, 96, + 73, 92, 80, 94, 89,230,143, 95, 95,238,223,125, 60,115,230,170, 13,190, 86, 14,178, 98,196, 39, 42, 96,101, 51, 90,184,227, 31, + 11,130,151,251,200,243,192, 0, 1, 68,253,163, 32, 48,111, 79,197,100, 83,185,189,143,177,144, 31,185,201,143,191,249,143,169, +247, 20, 80,168,186, 26,147, 77,204, 16, 16,241,122,169,213, 27,128, 47,230, 33,190,249,255,238,157, 11,124,230,128,164, 14,132, +130,130,130,175,175, 47,176, 25,136,149, 75, 36, 0,170, 7,234,130, 15,248,160,113,177,168, 87, 85, 81,229,102,230,101,100,248, +253,255,255,245,247,191,150,222,249,185,252,216,179,211,119,223, 61,251,206,240,246,199,223,187, 95,254, 63,255,249, 95, 86, 89, + 5,107,105, 8, 89,181, 9, 44,172,129,133, 56,176,236,214,209,209, 1, 87,153, 66,102,102,102,144, 66, 28, 82,142, 99, 22,226, +144,194, 29, 88, 79, 0, 21, 0,171,121,101,101,229, 15, 31, 62, 60,126,252,248,221,187,119, 64,167, 2,123, 21, 64,113,160, 9, + 16,101,184, 92,110,106,106, 42, 35, 35, 3, 44, 64,119,236,216,177, 5, 12, 14, 31, 62, 12,108,152, 91, 90, 90,226,153,243,128, +235, 21, 23,226,127,123,239,194,205,221,243,175,110,157,126,125,235,204,135,199, 55,176, 51,253,195,175, 23, 88, 57, 1,155,219, +124,124,124, 23, 47, 94, 4,214, 58,200,213, 0,164, 45,191,116,233, 82, 60, 37,242,175,159, 31, 63,126,184,195,202,202, 45, 32, +164,193,205, 35, 13,100, 64,250, 4, 64,240,236,228,212,253,139,242, 92, 53,190,128, 43, 0, 6,232, 54, 48,112,176,109,221,186, +149,147,147, 19,104, 44, 48,100, 44, 44, 44,224, 93,129,152,152, 24, 96, 71, 4,191, 55,183,109,219,202,199,199, 99,103,111,110, + 96,164, 23,152,149,244,141,241,207,235, 87,239, 50,114,155, 59, 77, 84,140,196, 72,104, 91, 0, 75,255,174,174,174,209, 58,128, +152,106, 0, 77, 4, 32,128,232,180, 17,108, 64, 26,203,228,141,209,155,181,182, 34,151,221, 64, 46,213,245,194,219,218,137,235, +227,240, 40,160,245,158, 44,184, 45,200, 59, 3,240,107, 1,150, 62,206,206,206,192, 50, 20,147, 11, 44, 85,241,133, 12, 88, 22, + 72, 26, 26, 26, 2,203, 41,184, 32, 50, 23, 43,144, 86,211,210,189,122, 86,254,253,199, 55,127,255,125,250,241,135, 29, 88, 90, +255,252, 35,199,195,242,254,207,159,167, 95, 65, 43,136,188, 85,197,185, 21,180,190, 96, 27, 15,129,175,248,212,213,213,213,215, +215, 7, 22, 76,144,133,155, 64,103, 3,139,170,245,235,215, 67, 54, 4, 0, 69, 24, 49,244, 66,118,123, 1,211,173,154,154, 26, +176,254,120,253,250, 53,100, 9, 41,208, 52,160,200,171, 87,175, 32,122,129, 34,120,234, 75, 96,207, 6,178,148, 19, 88, 34,195, +151,114, 2, 93, 66,112, 53, 14, 72,175,139, 51, 72,239,221,147,207,206,239,134,234,181,118, 34,168, 23, 88,250, 27, 25, 25, 29, + 61,122, 20,168, 87, 90, 90, 26,104, 14, 55, 55,119, 85, 85,213,164, 73,147,128, 93, 31,160,237,125,125,125,184,238,136, 7, 86, +121, 31,223,223, 1, 22,235,252, 66,106, 18, 82,150,223,191,191,249,242,233, 97,119,207,164,198,134, 42, 41, 25,134,229,249, 92, +140, 97,239, 29,227, 24, 32, 53, 38,124, 35,240,173, 91,183,128,105,192,198,198, 6,104, 62,176,202, 1,202, 77,153, 50, 37, 60, + 60, 28, 82,221,226, 7, 55,111,222, 10, 9,246,143,136,240,211,209, 85,127,251,249,227,151,143,111,210,242,154,155, 3,157,157, +255,125, 35,169,244,159, 48, 97, 2, 48, 82,128,181, 78,110,110,110, 64, 64,192,104, 65,143, 60,224,131,181,220,135, 3,128, 0, + 98,161, 79, 65, 79,112, 5, 81, 72, 72, 8,121, 59,129,113, 1,228,141, 90,228,213, 1,164,150,254,196,235,197,191,234,134,214, + 71, 59,192,199,139,224,182, 32,239, 9, 32, 8,128,229, 32,242,106, 31, 56, 23,207, 18, 32,184, 44,154, 26,252, 90, 32, 64, 74, + 81,249,135,153,237,159, 83,219, 30,124,100,224, 97,100,149,231, 97,122,250,151,145,153,157,229,208,171,191, 63,254, 49,136,178, + 51, 43,155,216,125, 17, 84,192, 86,156,129,154,240,192, 22, 55,176, 29, 10, 44, 19, 63,125,250, 4, 44,187, 33, 21, 0,176,253, + 14,172,180,128,101,214,230,205,155, 33,195, 65,104,217, 0, 40, 2,217, 54,172,169,169, 9, 25,189, 1,234,133,164,109, 72,191, + 1, 40, 14,236, 13,124,249,242, 5,127,194,214,211,211, 3,150,200,228,109,230, 34, 79, 47,208,217, 82, 82, 82,238,238,238,192, + 90,231,198,141, 27,143, 30, 61, 2,214,118, 2, 2, 2,192,170,104,206,156, 57,184,246,226, 34,141, 2,125,251,240,254,230,143, + 31,239, 4, 4,213,120,120,101,121,249,228,190,126,126,218,209, 57, 55, 50,194, 5, 88, 1,192, 2,246, 63,114, 13,224,229,229, +181,109,219, 54, 96,135, 3, 24, 32,126,126,126, 11, 23, 46, 4,214,235, 26, 26, 26,196,248,209,219,219,107,253,250,205,159, 62, +188,125,242,236,121,126,118, 92,105, 69, 91,160,147,149,205,207, 79, 12,172,196,150, 75,192,210,191,161,161, 1,210, 13, 5,118, +212,128,253,128,178,178,178,209, 58, 0,127,125,128, 12, 0, 2,136,154, 21, 0,133, 43,136,200, 40,229, 33,224,205,155,185,213, +167, 54, 98, 29,240, 33, 56,253, 11,212,123,170,122, 35, 90,131, 29,121, 24, 7, 79, 57,254,102,238,155, 83, 27,171,201,211, 59, + 80, 96, 40,158, 26,164, 96,229,120,233,231,159,215,251,246,178,254,249,126,233,243,255, 61,159,255,176, 49, 50, 10,255,255,239, + 40, 41, 96,239,230, 44,100,236,128,163, 61, 11,234, 1, 0,155,192,192,242, 8,216,132, 7, 22,244,192, 98, 20, 82,136, 67, 26, +239,162,162,162,214,214,214, 59,119,238,196, 28,198, 1,138, 0,171, 10, 96,115, 27,168, 30,216,170,133,116, 35, 24, 96,243, 10, + 64, 46, 80, 1,176, 87,113,226,196, 9,130,211,224, 10, 96, 64,166,199,201,210, 11,172, 3,128, 37, 62,208,121,192, 30, 0,176, +211, 3,236,187, 0, 5,159, 62,125,234,233,233, 9,108,254, 19,212,254,247,239,207,175, 95,158,254,250,245,145,243,211, 3, 62, + 1,101, 46, 30, 41, 32,218,181,247, 37,163,179, 56,172, 49, 7, 38, 97,234,173,172,172,128, 1, 11, 44,253,129, 53,129,176,176, +112, 92, 92,220,129, 3, 7,136,116,170,165,165, 21, 59, 59, 59,223,181,179,217,217,201, 50,106,170, 93, 5,201, 11,166, 45,156, +194,252,131,248,210,191,188,188, 28,232,217,103,207,158,113,114,114, 2, 35, 5,216,221,105,109,109,173,174,174, 30,173, 3,224, + 99, 62,192, 66, 31,207, 81, 16, 0, 1, 68,229, 30,192,128,172, 32,194, 90,168, 17,217,252,199,212,139,220,126,135,140,231,224, + 42,199, 41,209,139,167, 44, 38,181,140, 30,246, 39,193, 1, 75, 52, 3,103,119, 97, 41,153,215,215,175, 48, 63,188,167,242,251, + 57,175,176,184,149,174,134,182,177,206,119, 9,156,251,131,128, 37, 53,176,237, 15,108,230, 67, 6,235,129, 93, 1, 32, 3,114, +156, 3,124,116, 72, 86, 86, 22, 88, 7, 96, 22, 88,192,210,196,192,192, 0, 88, 7, 0,203,119,136, 74,248,162, 26,248, 73,112, + 64,163, 12, 13, 13,207,158, 61, 59, 56, 3, 13,232,120, 49, 48, 80, 87, 87, 7,250, 23, 88,141, 1,189, 15, 12,141,106,162,230, +165,254,255,254,245,249,247,175, 47,223,191,191,102,103, 23,100,101,227,101, 98, 98, 89,178,116,107, 76,180, 55,180, 22, 68, 85, + 13,233, 88,244,246,246, 2, 43, 90, 32, 67, 77, 77,141,248,107,165,141,140,140,153, 77, 77,147, 26, 32,122,255,171,169,169,171, + 5, 4,224, 31, 21, 68, 6,157,157,157,163,165, 60, 49,117, 0,214,210, 31, 8, 0, 2,104,216, 94, 8, 67,246,210, 79,228, 34, +155,212, 38, 60, 37,122, 71, 1,126, 32,171,169, 13, 68, 64, 6,252,236, 77,252,251,130, 66, 67, 67, 5, 5, 5, 33, 75,125,128, + 37, 32,100, 72, 7,210, 3,128, 76,252, 66, 14, 4, 85, 86, 86, 6, 10, 30,185,242, 21, 89,239,132, 9, 19, 86,175, 94, 13, 81, + 0, 58, 41, 8,199,113,208,192,150, 47,193, 65,149, 65, 82,131,242,128, 1,137,205, 5, 72, 53,240, 25, 88,250, 3,205, 0, 6, + 27, 68, 47,174, 49, 47,200,145,159,144,160, 38,201,121,192, 96, 46, 44, 44, 36, 67,239,104, 51,159,248, 58, 0,151, 20, 64, 0, +141, 94, 10, 63, 10, 70,193, 40,192, 40, 23, 24, 24,208, 15,123,248, 63,122, 35,216, 48, 4, 0, 1, 52,122, 37,228, 40, 24, 5, +163, 0,163,241,207, 48,122, 3,228,136, 0, 0, 1, 52,122, 37,228, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, + 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163,151,194,143,234, 29,213, 75, + 88,111,122,122,186,127, 64,250,198, 13, 88,142,220, 24, 13,171, 1,215,219, 10, 91,113,135,107,145,235,232,165,240,184, 0, 64, + 0,177,160,165,114, 76, 21, 68,174, 27, 27, 84,122,137,212, 62, 80,110, 30, 60,128,236, 51, 39,168,123, 16, 41, 30, 0,185,114, +224,224,193,131, 64,182,189,189, 61,254,203, 3,104, 23, 74,192,210,223,203,211, 8,114,140,222,176,223,120, 49,180, 0,176,244, +247,245, 85,134,179,171,171,171, 71,195,132,120, 0, 16, 64,232,171,128,254,175, 66, 57,131,137, 49,140,132,211,222,209, 50, 6, + 73, 39,128, 82,162, 23,205,205, 36, 57,123,160,220, 12, 1,239, 94,223,121,253,250,249,203, 55, 95, 62,126,252,205,207,207, 42, + 46,194, 35, 42, 42, 41, 36, 74,212,241,106,231,142, 79,187,119,247,214,221, 7, 63, 30, 63,255, 47, 43,201,168,172,192,161,164, +172,102,100,153, 69,255,106, 3,114,182, 40,141,138,197,203,151, 47, 27, 24,236,152, 49,227,219,129, 3, 12,245,245,187, 30, 63, +126, 44, 33, 33,193,193,193, 33, 42, 42,170,164,164, 68, 70,101,112,248,240, 97,113,113,113,121,121,121,130, 71,114, 34, 3, 96, +233,159,150,150,198,192, 48,107,227,232,129, 99,131, 15,252,250, 85,190,115,103,154,187,251, 44, 95,223, 78, 72,111, 96,180, 26, + 64, 6,120, 54,130, 1, 4,208, 48, 89, 6, 10, 47,241, 25, 25, 25,254,173, 20, 28,252, 14,254,253,235,235,227, 71,151,127,253, +250,173,162, 40,224, 96, 35, 39,192,207,254,254,195,143,167,207,191,220,190,247,252,195,199, 55,178,114,186,172,108, 56,175,126, +125,255,230,214,177,131,179,153, 25, 62,133,123, 51, 88, 27, 51, 40,203, 51,220,121,240,255,200,153,239,219,246, 95,220,186,182, +212,202, 62, 85, 80, 68,141, 72,103,144,221,246, 71,214, 8, 57, 72,142, 70,117,192,187,119,239,242,242,190,137,138, 50,132,134, + 50,116,116,128, 46,228,250,243,231, 15,176, 2, 16, 19, 19, 3, 86, 0,192, 62,129,148,148, 20, 65, 67, 94,188,120,241,234,213, +171,151, 47, 95,186,186,186, 46, 89,178,132, 1,188,215, 55, 42, 42, 10,255, 1,118,200, 96,219,246,115,192,210, 31, 76,142,130, +193,213,252, 7,146,193,193,107,119,238, 4,145,105,105,119, 33,189,129,209,174, 0,102,209, 15, 23, 65,174, 3, 0, 2,104,152, + 84, 0,192, 78, 0,164, 14, 24, 18,165, 63, 16, 60,121,116, 89, 92,132,195,212, 80, 17,124,191, 18,227,191,127,255,249,120,216, +185,149,217, 20,100,249,175,221,124, 3,148, 85, 84,177,192,165, 23, 88,250,219, 26,127, 42, 72,100, 96,102, 6, 85,120,191,255, + 48,112,115, 49,104,170, 48, 88, 24, 48,108,217,255, 9, 40,235, 29,220, 77,211, 33, 32,172,151, 74,210,232,202, 7, 33, 33,161, + 45, 91, 56,101,101,191, 3,123, 0,239,223,179,168,128,193,151, 47, 95,238,221,187,119,224,192,129, 79,159, 62, 1,203,113,252, +253,128,235,215,175,159, 59,119,142,149,149, 21, 89,240,251,247,239,115,231,206, 5, 26, 18, 17, 17, 65,140, 51, 54,110, 0,122, + 57, 29, 76,146, 0,224,247, 36, 67,142,189, 67,227,226,137, 17, 6,164, 19, 3,241,112,113,182,135,254,255, 23,121,251, 86,233, +193, 3,225,167, 79,159,136,137, 61, 82, 82,250, 40, 38,246,159,232, 19,121,129,238, 36,230,156, 62, 60, 90,240,115,169,165, 23, + 62,248,147,150,182, 19,200,128,144, 16, 41, 32, 99,180, 14,192,218,234,135, 28, 13, 4, 23, 1, 8,160, 97,181, 10,136,113,136, +184,243,221,235, 59,191,127,255, 54, 51,146,132,139, 48, 49, 49,178,177, 49,115,114,176,176,178, 50, 41, 43, 10, 2,123, 6, 64, + 53,184, 70,126,128,109,255,194, 36,134, 31, 63, 25,238, 63,102,120,255,145,225,195, 39,134,101,155, 24,114, 27, 24,170,122, 24, +172,140, 24,152,254,127, 2,170, 25, 54,113,170,171,171,187,113,163,166,152, 24, 67, 84, 20,139,132,132, 41,176,188,246,245,245, +245,241,241,113,119,119, 23, 23, 23, 7,150,236, 43, 87,174,188,123,247, 46,174,139, 18, 47, 93,186,116,225,194, 5,180,210, 31, + 14,246,239,223,127,245,234, 85, 60,101,241,161, 67,135,224,165, 45,164,244,135,176,129,226,196, 84,120,167, 96, 0, 43,151,200, +250, 21, 63, 23,107,233,175,116,227,134,237,158, 61,178,183,238,176,125,250, 36,121,235,134,206,150,205,162, 23, 47, 50, 16,125, +167, 55,208,133,192, 98, 23,216,103, 34, 62,154, 32, 90,240,112,241,235, 69, 46,238,241,112,113, 1, 72,185, 15, 33,127,249,170, + 48,140, 2,164,162, 31,255, 89, 15, 0, 1, 52, 88,122, 0, 84,105, 63,254,167,134,189,228, 13,101,192,111,218, 34,102,140,229, +245,155,231,234,202, 66,144,114, 31, 77,138,131,157,229,195,199,159,106,202, 66,183,238, 61,199, 58, 25,112,239,238,173,112,208, +145, 92, 12, 59, 14, 49, 76, 93,204,224,102,203,224,229,192,112,227, 14,195,249,171,255, 57, 57, 24, 13,181, 25,220,237, 25,214, +237,188,101,100, 73,171, 33, 32,172, 65, 68,187, 27,223,128,173,123, 96,123, 31,200, 0,182,244,173,173,173,225,130,130,130,130, +154,154, 44,126,126,192, 62,208,153, 91,183,190, 49, 48, 0, 3,133, 29,115,228,231,242,229,203,184, 74,127,120, 29,128,235,142, +148,232,232,232,165, 96, 0,100,192,253, 11, 44,250,129, 34, 16, 89,250,228, 5,252, 92, 76,192,247,242,165,226,201,147,191,152, +152, 88, 25, 25,254,252,251,255,239,247,223,127,127,254,136, 30, 62,244, 81, 68,228,167, 12,177, 43, 73,128,197,238,149, 43, 87, + 12, 13, 13, 13, 12, 12,136,215,130,220,185, 65,227, 18,217,141, 32,181,244,199, 44,238,119, 34,245, 3, 70, 1, 65, 0, 16, 64, +232, 21, 0,230,244, 41,145,133, 26,174,194,148, 24,189,180, 24, 59, 38,114,153, 10,214, 9,100, 34,245,162, 41, 35,126, 46,250, +229,235, 47,142,214,114,192, 6,217,225,227,143,191,125,255, 13, 20, 49,210,151, 16, 21,230,124,252,244,243,157,251,239, 89, 88, +152, 84,149, 4,143,158,252,170,174,137, 69,239,221, 7, 63,172,141, 25,126,254,102,216,126,144, 97,255,241,255, 82,226,140, 74, +114, 12,206, 54, 12, 26,202,140, 44,204,160,115,212, 45, 12, 24,186,103,254,192, 63,224, 67,144,129,167,213, 0, 31,241, 71, 27, +151,160,221,218,152, 71,143, 30, 49,128,207,199, 71, 22,124,240,224,129,150,214,171,170, 42, 80,192,183,181,221,122,240, 64,155, +129, 13,253,100, 80,160, 26,252,165, 63, 68, 13, 46, 41, 59, 48,128,148,248,144, 66, 31, 94, 49,192, 47, 52,166, 58,160,176,249, + 15, 4, 2,215,111,252,250,253,155,137,137,233, 63, 51, 51,232, 82, 4,200,129,118,127,255,177, 95,186, 68,124, 5,192, 0,190, + 87,242,232,209,163,192,174,170,180,180, 52, 49, 19, 45, 20,214, 1,228,181,253,129,197,189,251, 44,247,224,181, 12,105, 59, 65, + 12, 32, 23, 82, 43,176,109,190, 51, 90,184,163, 1,172,247,194, 3, 4, 16,225, 85, 64,196,175, 11,194,108, 21, 18,217, 78,196, + 90, 79, 16, 95,241, 96,117, 57,158,203,211,113, 21,211,240, 9,100, 34,245, 98, 85, 6, 49, 13,216,176,255,183, 10,231,108, 4, +120,205, 15,168,185,250,248,217,167,239,223, 65,215, 90,169, 40, 9, 2, 43,128,139, 87, 95,221,188,253,142,131,131, 89, 89, 81, +224,253, 71,236, 7,205, 63,126,254, 95, 89, 30,100,190,135, 29,131,129, 22, 35, 59, 27,195,159, 63,160,126,128, 0, 47,195,189, + 71, 12,238,118, 12,242, 50, 32, 53, 52, 77, 73,240,114,159,200, 33,233,129, 2, 88, 7, 49, 72,117, 42,164,172,135, 87, 0, 52, + 45,253,225, 0,215,213,237,120,174,116,135, 3,214,187,119,126,254,254,197,200,204,242,247,255,127, 96, 58,249,243,247,223,111, + 96, 71,224,239, 95,198,219, 55, 25, 24,188, 72,117, 9,176, 31, 0,236, 72,113,115,115,243,243,243, 19, 95, 7, 16, 57,248, 67, + 97,233, 95, 93, 93,221,218,218, 10, 44,253,225,149, 1,144, 4, 86, 3,192,210,127,243,230,187,144, 9, 0,200, 44,177,158, 93, +252,104,233,143, 89,250, 3, 1, 64, 0, 13,150, 33, 32,172,133, 41,145, 5, 49, 73,107, 85,177,155, 64,165,181, 67, 64,151, 16, + 99, 20, 63, 63,235,251, 15, 63, 68,132,184, 66,253, 52,128,249,147,157,157,153, 25,216, 94,251,255,223,199, 77,217,219, 85, 25, +104,194,219,247,223,129,106,176,234,149,149,100,188,251,240,191,134, 50,131,147, 37,104,200,235,198, 29, 6, 61, 13, 6, 65, 62, + 6, 79, 7,134,127,255, 24,128,157,128, 91,247, 65,106,240, 7, 50, 65, 6,241, 27, 73, 40, 25, 55, 35, 6, 0,219,175,192, 22, +232,221,187,119,129, 45,113, 91, 91, 91, 30, 30, 30,200,137,193, 10, 10, 10,167, 78,137, 53, 54, 62,101,100,100,124,245, 74, 77, + 77, 77,225,218, 51, 44,122,209, 68, 86,173, 90,133,210,104,248,255, 63, 60, 60,156,248, 58,128,110,165, 63, 25,117, 3, 28,188, +147,145,102,187,113,243, 63, 43, 3,219, 63,208,188,239,239,191,127,126,253,255,251,237,207,159,239, 42, 26,100, 56, 70, 71, 71, + 7, 24,254, 68,150,254, 12,224,107, 62,129, 77,126,120,241,141,198,197, 5, 32,189, 4,184, 50, 52, 46, 65, 0,108,254, 67,138, +126, 32,137,220,246,135,204, 18, 3, 43,131,209,210, 31,107,233, 15, 4, 0, 1, 52, 28, 86, 1, 17,236,121, 16, 4,255,255, 51, + 48,133,191,167,188, 14,128, 44, 70, 98, 10,123,143,167,249, 15, 4,226, 34, 60,143,159,126, 6, 86, 0,125,211, 79,219, 89,201, + 26,233,137, 51,178, 50, 66,150, 3, 65, 86,106, 0,101,129,106,176,234, 85, 86,224, 56,122,246, 59,176, 2, 16, 49,102,168,200, +100,200, 79, 96,224,231, 5,141,252, 52, 78, 98,104,200, 7, 41, 56,122, 22,164,134,164,129, 50,202, 23,131,210,110, 25,232,155, + 55,111, 32,247, 32,110,221,186,245,209,163, 71, 30, 30, 30,138,138,138,159, 63,127,126,255,254,253,245,235,127, 14, 28, 0, 22, + 22, 38,142,142,142, 50, 50, 50,215,158,189, 70,211, 11,108,183,226,191,177,235,207,159, 63,131, 45, 49,195, 75,127, 60,213, 0, +254, 58,224,147,150, 54,251,165, 75,255,254,255,231,102, 98, 97,102,102,252, 3, 44,253,127,255,254,252,235,215,111,125,125,146, + 92,194,197,197, 69,210, 28, 0,188,184,199,197,165, 69, 29, 0,108,230,167,129,219,248,200,165, 63,188,249, 63, 10,240,151,254, + 64, 0, 16, 64,163,199, 65,195, 90,139, 84, 90, 63, 10,173, 3,240, 86, 39,162,162,146,119,238, 63,211,215, 22,171,200,183, 88, +176,252, 50, 39, 7,139,129,142, 24,252, 58,229,127,255,254,223,185,255, 94, 92, 12,251,168,171,146,178,218,214,125, 23, 19,130, + 25,254,223, 99,176, 8, 98, 80,146,101, 88,186, 17, 38,151,207,240,247, 47,195,214,125, 32, 53,180, 11, 40,172,253, 51,218, 45, + 3,189,113,227,134,166,230,253,249,243,129,204,191, 77, 77,151,214,173,251,166,174,174, 14,172, 0,238,221,187,247,242,229, 75, + 35, 35, 35, 96, 19, 30,215, 50, 80, 37, 37,165,211,167, 79,227,185, 99,132,200,235,121,225, 67, 64, 64,146,214, 61, 0, 96,201, + 14, 41,250,113, 13, 1,225,146, 66,212,106, 50, 50,111,109,237,254,238, 63,240,139,141,149,231, 63,203,143,127,255, 62,254,250, +245,217,201,249,191,156, 28,209, 29, 98, 70, 96,249, 75,252,208, 63, 92, 11,188,184, 71,227,146, 84, 7,224, 90, 59,139, 7,160, +149,254,240,145,159,209,217, 96,252,165, 63, 16, 0, 4,208,104, 5, 64, 77, 0,157, 0, 32, 52, 10, 36, 36,170,242,225,227,155, +147,103,159,153, 27, 75,121,186, 40,237,216,123,111,235, 46, 80,170,173, 41,182, 2,150,254, 64,113,118,118, 54, 92,251,129,141, + 44,179,182,174, 45,237,159, 7, 90, 9, 58,163, 5,180,250,211,197, 26,180, 18,180,191, 22, 84,250,247,207, 99,248,203,192, 71, +252,126, 96, 82,219,236,184,122, 12,180, 91, 5,244,245,235, 87, 67,195, 31,144,146,196,196,228,255,142, 29,247,110,221,186, 5, +217, 8,230,224,224, 96,111,111,143,103, 19,128,178,178,242,229,203,151,113,117, 2,128,205,127, 99, 99, 99, 98,220, 0, 89, 12, + 10, 89, 20, 4,100, 19, 95, 7,160,109, 52, 35,114,223, 25,188, 14,192, 37, 75, 64, 63, 19,211, 47,115,243, 55, 82, 82, 95, 46, + 93,226,121,244,232,135,162,226, 87,109,237,191,178,178, 12, 68, 95,182, 69, 94,217,141,172, 5,141,139,223,227,200,178,104,246, +146,234, 12, 8, 64, 46,247, 33,189, 1, 82,135, 52,135, 25,192,179,166, 3, 32,128, 70, 43, 0, 44,171,119,232, 96,148,172,156, +238,227, 71,151,215,110,185,169,162, 40,232,237,166, 44, 40,192,241,254,195,143,243,151, 95, 2,219,254,192,210, 31, 40,139, 71, +175,149,125,234,225,131,179,143,157,253,228,237,196, 48,187, 29,180, 19,248,238, 67,134,185,171, 64,109,127, 96,233, 15,148,165, +188, 64, 39,163,244,167,209, 28,128,132,132,196,131, 7, 34,103,206,128,134,119,110,221,226, 51, 53,213, 18, 22, 22,134,239, 4, + 38,120, 20,132,133,133,197,193,131, 7, 25, 49,246, 64, 1, 75,127, 21, 21, 21, 96, 13, 65, 76,233,143, 60,250, 15,233, 10, 16, + 89, 7,144, 93,156,225, 42,229, 9,151,254,176, 58,224,159,188,252, 55, 32, 34, 43,204,201, 40,118,241,251, 20,191,129,148,232, +197, 95,250,131, 22,137,142,248, 9, 0, 6,108,251,129,225, 85, 2, 64, 0, 17, 94, 6, 74,252, 20, 43, 49,203, 64,137,215, 75, +188,118, 74,236,197,234, 59,242,236, 37,105, 46,154,149,141, 91, 73,197,226,221,235, 59,247, 30, 60, 63,126,230, 9,252, 44, 32, +113, 49, 41,130,103, 1, 9,138,168,121, 7,119,159, 59, 62,109,229,214, 91,109, 83,233,122, 22, 16,157, 75,127, 32, 80, 87, 87, +191,120,209, 43, 49,241, 12,184, 7, 96, 18, 22,166,207,197,197, 69, 82,253, 17, 30, 30,126,243,230,205, 51,103,206, 48,131,230, +218,153,128, 69, 63, 27, 27, 27,176,237, 15, 52,153,212,210,159,140, 58, 96, 20,208, 26,128,214, 2,165,181,186,207,114,199,186, + 39, 96,116, 50, 0, 63, 0, 8, 32, 22, 74, 6, 4,104,170,151, 72, 3, 7,149,155, 73, 5,192,178, 30,136,212,201,210, 11, 44, +235,137,220,237, 69, 45, 95,208,109, 15, 7, 50, 0, 22,247,150, 96, 64, 97, 45, 66, 76,113,143, 9, 48,203,122, 32, 27,178, 45, + 96,180, 2, 24, 84,117, 0,195, 67, 44,226, 38,213, 38, 35, 60,100, 8, 94,249, 14, 16, 64,163,151,194,143,130, 81, 48, 10, 70, +193, 8, 5, 0, 1, 52,122, 35,216, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, + 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163,151, +194, 83, 71, 47,158, 99,209,104,170,247, 30, 24,172, 94,189,154, 12,189,247,239,223,191,123,247, 46,121,122, 71,211,198,168,222, + 81,189, 67, 69, 47, 30, 0, 16, 64, 56, 55,130, 17,121, 10, 38,213,245, 82, 29,164,133,126,100, 96, 99,155,181,148, 19,143, 26, + 96, 25,138,103,239, 37,126, 55,195,245,246,246,246, 22, 23, 23,147,116, 91, 58, 92,239,149,169,124, 58,217,159,200,184,105, 93, + 79,120,202,255, 55,127,129,140, 89,179,102,129, 47,173, 37, 1,152,169,175,248,243,233, 19, 39, 39, 39,176, 14, 8, 13, 13,165, + 93, 20, 16,185,175, 2,171,127, 7, 74, 47, 46,211,232,147,128, 25, 25, 25,153,192, 0,178,133,237,215,175, 95,204,224,179,157, +255,255,255,207, 48, 10, 70, 1,245, 0, 64, 0,177,224, 74,235, 88,147, 26, 35,161, 91,229, 32,153,132, 60,189,196,180,136,201, + 6,187,119,239,102,224,208,196, 83, 10,151,151,151,139,137,137,161, 73, 1, 11,116,252,198, 66,244, 66,138,254, 19, 39, 78, 64, +170, 1,146,244,254,187, 86,199,164,213,180,104, 31,232,184, 2, 32, 27, 34, 5, 20, 33,232, 35,190, 79, 69,255,254, 51,172,216, + 1,210,232,105,207,170,173,114, 21, 88, 7,128, 42, 60, 34,170, 1, 97,185, 83,175,111,191, 56,124, 77,254,235, 79,110, 79,247, + 15,210, 18,140,103,206, 28,251,244,233,135,147,147, 19,141,210, 25, 77, 27, 13,120,244, 18, 44, 49,137, 79,150,164, 2, 96,252, +118,117,117,149,150,150, 18,179,223, 24, 25, 0,203,122, 22, 48,128,236, 92, 3, 38, 18,160, 33,127,255,254,253, 3, 6, 64, 6, +141, 28,188,117,235, 86,252,129,227,229, 69,248, 52,233,109,219,182,145,164,126, 20,208, 13, 64,246, 3,163,173,251, 7, 8, 32, + 22,146, 74,127, 99, 99,227,179,103,207, 18,204,132, 88, 51, 21, 30,189,104,230, 0,203, 98,200,176, 6,217, 7, 76,166,249,206, + 98,224, 84,155,181,202, 1,212, 52, 94,205, 15, 42,253, 9,149,224,152,103,199, 3, 75,112,252,167,178,192,245, 2,217,192, 22, +180, 5, 24,144,164, 23, 82,226, 67,200, 14,216,110,109, 96,233, 95, 22,204,209,181,246, 7, 30, 15,242,127, 47,214, 81, 99,254, +250,253,127, 81, 44,199,137,171,127,190,127,253,255,237, 23,131,163,193,213,171,183,254, 18,236, 10,220,123,220,127,238, 52, 55, + 47, 31,163,132,164,184,168,184,202,195,187,191, 20,180,126,179,114,188,218,179,254,205,250,245,235, 3, 3, 3, 71,179, 10, 85, + 0, 48,126,125,125,125,129,117, 0, 90, 26, 54, 50, 50,106,108,108, 4, 74, 97,111,145,177,176,176,193,192,227,199,143, 85, 85, + 85,129,213, 0, 47, 47,239,157, 59,119,120,120,120, 78,159, 62,125,252,248,241,236,236,108,156, 41, 31, 28,245,240,252, 11,207, +137, 16, 17, 32, 23,210, 74,192, 10, 54,109,218,132,169, 5, 46, 2,228, 18, 83,160,111,220,184,145, 36,245, 84, 1, 47, 94,188, +144,144,144, 24, 77,114,120,202,125, 92, 0, 32,128, 88, 72, 42,253,241,219,132,231,160, 18,252, 71,156,163,149,254, 29, 29, 29, + 21, 21, 21,112, 17,226,235,128, 52,227, 89, 12,194,106,179,118, 57,192, 91,253,174,174,174, 64, 6,132,196, 28, 23, 67, 46,193, +177,150,254,152,125, 2, 76, 79,193, 91,250,192, 26, 11, 57, 40,136,209,139,181,165, 15, 44,253,241,123, 83,228,123,145,170, 60, + 51, 39, 59,163,188, 20,243,155,247,255,126,255, 97,126,251,225,255,199, 47,255,239, 60,249,199,192,196, 32,194,117, 9,232, 47, + 37, 37, 37,172,122,255,253, 95,173,169,172,116,252,197, 75, 69, 57, 81, 29, 61, 37,102,118, 33,121,197,247,239,191,255,120,245, +226,239,147,151, 63,184, 88,128, 90,245,113,233,165,221,136, 16,241, 81, 76,158, 94,204, 22, 9,173,199, 82,128,225, 8,180, 84, + 75, 75,107,243,230,205,200,209, 1,204, 68,120, 74,127, 32, 96,101,101,229,224,224,120,243,230,141,154,154,154,161,161, 33,176, + 62,152, 52,105, 18,176,213,175,171,171,187,110,221, 58, 96, 5,112,233,210, 37, 96,149,128,171, 31,224,239,239, 15,241, 47,174, + 92,140,167, 80, 6,150,221,144,144,193,218,128, 3,138,191,124,249,146,152, 10,128, 36,245,144,226,123,255,254,253, 88,165, 28, + 29, 29,137, 41,217,129,218,165,164,164,212,213,213, 71,171, 1, 82, 1, 64, 0,177, 96,230, 46, 92,237,119,250, 56, 8,152, 91, +128,165, 63,145, 21, 6,206,209, 30,134, 52, 32,185,122,150, 25, 3,219,119, 60,163,255,104, 37, 56, 90,101,134,191, 4,135, 0, +120,229,113,226,196, 9,228,230, 63, 49,122,151,149,242, 96,230,210,232,158,175,248,117,253,251,247,143,157,139,145,137,137,129, +139,147,225,195,167,127, 63,255,255,231,230,100,252,241,143,225,251,207,255, 50,162, 76,255,254, 48,220,126,252,119,207,158, 61, + 88, 59, 1,159, 62,158, 16, 16,224,102, 99,251,159,154, 96,254,247,239,255, 23,175,126, 61,122,250,129,129,245, 49,167,224,207, +231,175, 30, 48,177,125,188,118,237,195,211,151,123, 72,157, 75,160,112, 68, 8,249,102, 49, 98, 0,242,137,123,152,247,119,226, + 2,239,222,185,192,217, 66, 66,123,112, 21,145, 4,235, 27,100, 17, 60,117, 15, 48,105,249,248,248, 64,202,253,171, 87,175, 66, + 24,144,182, 63, 80, 28,143,141,236,236,236, 95,191,126,213,212,212, 4,150,125,192,132,148,156,156, 12, 20,252,253,251,247,130, + 5, 11,128, 29,232,115,231,206,173, 92,185,242,251,247,239,152,119,221, 64,128,183,183, 55,217,145, 50,119,238, 92,252,149, 40, + 49, 45,122,184, 33, 68,170,103, 0,159,215, 4, 44,190,159, 61, 67,191,208, 7, 40, 72,124,129,254, 12, 12, 70,171, 1, 76, 0, + 31,243,193,218, 21, 0, 8, 32, 22, 98, 90,241,148, 20,199,164, 2,228,118, 52, 81,173,254, 89,233, 12,146, 12,179,124, 65, 89, +113,214,217, 52,248,104, 15,184,213,255, 17,185, 31,128,191, 4,127,245,234, 21,188,212, 38,178, 4,199, 15, 32,245, 10,176,188, +192,117,216, 6,158, 2, 8, 50,254,131,169, 23,168,229,205,181, 34, 73,240,224, 15, 68,228,251,223,255, 63,126, 49,252, 6,115, +127,255,249,255,159, 9,196,184,124,233, 44,176, 30,101, 96, 96, 67, 51,246,227,199,171,172,236,130, 34, 66, 2, 31,222,125,251, +240,241,195,137, 51, 47,158,190,252,207,198,253, 77, 90,229,203,247,111,111, 84,245,126, 43,104,254, 92, 57,251,236,157, 59,119, + 24, 24, 56, 70,115, 14,133,205,127, 32, 0, 54,255,129,197,253,150, 45, 91,180,181,181, 67, 67, 67, 9,150,254,144, 10,224,245, +235,215, 92, 92, 92,118,118,118, 61, 61, 61,192, 14, 1, 48, 25, 44, 92,184, 16, 88,250, 3, 27, 25,123,247,238,189,124,249,178, +136,136, 8,158,171,108,128,245, 55,174, 33,160,217,179,103,227,177,154, 42, 67, 64, 64, 67,200, 24, 2, 2,150,218,152, 21, 0, + 25,199, 55,141, 86, 3,164, 2,128, 0, 26, 92,199, 65, 99,222, 43, 66,228,224, 0,168,189, 95,113,159,129,153, 45,205, 77,129, + 65, 64, 97, 22,248,226, 63,252,163,255, 84, 25,196,128, 76,252,194,219,254,200, 0, 50, 43,128,217,189, 32,178,197,186,180,132, + 27,179, 55,192,251,169,248,193,175,255, 47,222, 0, 91,127, 76, 60, 92,160,174, 58,176,208,255,241,147, 1, 88, 7, 0,201, 95, +191, 25,126,124,103,248,245, 19,214, 2, 69,173, 60,120,254, 20, 61,125, 36, 39,171,200,243,159,149,229,205,247,239,251, 15, 62, +190,118,231,233,187,119, 95,180,141,255,126,253,241,231,199,207,191,223,191,253,123,241,136,225,251, 87,134,238,238,238,209, 19, +162,176,246, 84,136, 76,144,144,230,191,150,150, 22,176,225, 15,172, 12,128, 21, 0,164, 19, 64,176,244,135, 12, 1, 25, 24, 24, +112,112,112, 0, 11,253,164,164,164,246,246,118, 96, 73,122,242,228,201,131, 7, 15, 94,186,116,233,227,199,143,170,170,170,159, + 62,125,194,115,203, 77, 64, 64, 0,102,219, 2,210,227,193,223, 63, 24,168, 33, 32,172,157, 0,146,154,255,163,213, 0,217, 0, + 32,128, 6, 69, 5, 0, 25,250,135,116,147,145,235, 0,120,102,131, 12,214, 19, 63, 82, 12, 41,247,129, 13,127,240, 40, 16,219, +172,165,212,119, 51,100,229,143,139,139,203,158, 61,123,112,117,101,112,245,102,176, 22,238,196,140, 5,197, 87,126,149, 18,103, +138,242,101, 3, 22,247,252,188,140, 76,140,224,134, 63,195,255, 31,223, 24,190,254,250, 15,236, 22,124,253,241,255,223,127,236, + 55,127,196,231,127,213,213,191, 39,161,241,110,247,246, 87,239,222,253, 48,176,252,164, 39,244,133,129,245,231,143,111,255, 94, + 61,253,255,245, 43,227,159, 63,140, 66, 34,140, 12,140,255, 70,115, 5, 85, 0, 36, 61, 35, 79,168, 0,107, 2,228,162, 25,235, + 76, 0,176,100, 47, 43, 43, 99, 97, 97, 89,180,104,209,252,249,243, 19, 19, 19, 59, 58, 58,128, 37,242,131, 7, 15,190,127,255, + 14,204, 38,192,182,127, 70, 70, 6,158,197, 75,100, 79,189, 14,212, 16, 16,214, 78, 0,121,167,183,142, 2, 82, 1, 64, 0, 13, +150, 30, 0,242,176, 53,102, 65,143,171,144, 69, 6,179,206,166,193,138,254,219,171, 39,221, 7,175, 2, 66,212, 7,120, 70,129, + 40, 25,225, 1, 58, 12,222,252,135,244, 6,224,108, 96, 15, 0,178,199, 10,115,242,153, 96,233, 15, 89, 5,132,169,247,207, 95, +134,175,223,254,255,252, 5,154,242, 5,146, 44,236, 80, 65, 96, 5,240,253,247,255,183,239,254,191,126,255,255,220,181, 63,255, +254,129,134,242,174, 62, 69, 49,243,207, 31,134,103,143,127, 61,190,251,254,200,241,247,192, 70,222,181, 27,255,124,162,254,176, +177,252,127,253,146,225,200, 46,134, 79,159,254,255,255,199, 96,227,196,200,193,193,224,233,233, 79,204, 74,195, 13, 11,210, 3, + 18,200, 92,167, 75,201, 13, 98, 36,221,187, 0, 7, 66, 66,123,232,150,152,209, 18, 48,144,107,100,100,116,238,220,185,205,155, + 55, 35,139,227,154, 10, 6,182, 45, 4, 4, 4, 32,141,232,121,243,230, 1,251, 1,192,154, 0, 82,115, 0,165, 62,124,248, 0, +236, 1,124,251,134,239,174,151,212,212, 84,228,161, 27, 72,243, 31,255,248,207,192, 14, 1,161,117, 2, 40,105,254, 67,180,143, +182,253,137, 4, 0, 1, 52, 88, 42,128,179,103,207,226, 90,187, 2, 20, 39,176,126,148,157,123,181,194, 33,134, 63,103, 25, 20, +185,211, 90, 21,103, 29, 0,118,180,103,193, 42, 3, 87,226, 71,129,144, 87,130, 98,174, 10,197,204,225,192, 82, 12, 82,250, 35, +207, 0, 67,218,254, 16, 46,214, 30, 0, 92, 47,121, 37,203,237,219,183, 31, 93,153,244, 79,244, 31, 19, 11, 3, 43, 19, 40,167, +253,254,247, 31, 88,184,127,254,252,255,215,111,134, 63,191, 65,245, 65, 97, 17,168, 59,117,245,233, 19, 76,189, 15,111, 77,212, +214,254,119,248,224, 95, 70, 38,134,215, 47, 24, 57, 56, 25, 14,238, 96,248,245, 29, 88, 66, 48,232, 25,177, 62,123,244,207,222, +222, 27,152,111, 9,238, 36, 4,150,254, 93,217, 12,101, 83,201,169, 3, 40,185, 64,152, 60,189,184,134, 53,232, 3, 32, 43,127, +124,124,124, 32, 81, 15,233,206, 2,155,249, 88, 21,255,251,247,239,252,249,243,182,182,182,112, 17, 96, 29, 0, 41,139,127,255, +254,253,247,239, 95, 96, 36,138,138,138,226,154, 4,134,143, 2,145,209,126, 31,192, 33, 32,180, 78, 0,217,205,255,209,162,159, + 84, 0, 16, 64,164, 85, 0,192,130,152, 22, 59, 33, 33,141,101, 96,174, 0, 50, 92, 92, 92,208,218,254,144, 98,148,248,173,170, +240, 85, 64, 16, 46, 49,109,127,228, 25, 96, 8,128,112, 33,139, 65,241,235,133,151,254,104,243, 1,196,232,197, 5,128,205,127, + 92,122, 85, 85, 85,231,207,249,237,108,193, 10, 44, 0,126,255,250,199,206, 6,202,171,159,191,254,255,249,251, 63,176,232, 63, +123,229,239,223,127,255,113,173,227, 4,234, 93,188,240,143,189, 3,115, 96, 52,243,151,207,255, 63,127,100,248,250,153, 81, 81, +245,255,223,223,140, 44, 76, 28, 31,222,253,123,246,228, 87, 73, 33,225,113,106, 96,233, 63, 33,159, 65, 77,142, 97,114, 17, 67, +110, 31,153,117, 0,217,125, 2,242,244, 82,190,238,147,188,148, 15, 44,253, 27, 26, 26,144, 27,251, 93, 93, 93, 64, 46,174,221, + 97,191,126,253, 2, 22, 97, 63,126,252, 96,102,102,134,220,125,182,118,237,218,224,224,224,239,223,191, 3, 5,127,254,252,201, +195,195, 3,172, 6,240,123,135,188,181, 64, 3, 59, 4, 4,239, 4, 64, 24,163, 69, 63,125, 0, 64, 0,145, 80, 1, 80, 88,250, +227,209, 14, 44,244, 33,165, 60,100,220, 28,190,228, 20,185,225,143, 86, 49,160, 0,102, 70, 6, 54, 38, 6, 78,102, 6, 30, 22, +134,159,159, 87,183,179, 50,112,158, 74, 11, 81,100,224, 20,154,181,152,168,134, 63,214, 53, 63,144, 18, 28,255,162,120,228,210, + 31,121, 62,128, 24,189,248, 75,127, 60,122,219, 58,103, 20,229,103,112,112, 0, 91,139, 12,186,234,204,208,176,186,252,247,247, +223,255,127,255, 49,151,148,148,224, 49,188,169,101, 70, 73, 73, 6,176,199,240,235,247,255,191,127, 24,128, 93, 8, 7,111,134, +207, 31, 24,111, 92, 4, 22, 48, 76,126,190, 65,196,148,254, 13,201, 12, 42,224,131, 73,148,165, 25,200,238, 7,140, 4,128,185, +231, 11,180,178, 11, 12,112,105, 1, 86, 0,192,178, 30,180, 29, 67, 95,255,207,159, 63,172,172,172,192, 54, 53,176, 17, 3, 44, +253,191,125,251, 6,108,254, 11, 10, 10,226, 89, 6, 10, 7,240, 1, 85, 98, 6,127, 6,195, 16, 16,188, 19, 64, 70, 56, 19,185, + 93, 96, 20, 96, 2,128, 0, 34,182, 2,160, 81,219, 31,107,215, 30,115,192,135,108,171, 9,142,254, 83, 82,250, 51,160,206,244, +194,235, 48, 6,240,106, 90,130,122,113,205, 4, 16,163,183,111,226, 12, 96,112, 49, 49, 49, 28, 57, 11, 26,241,135,204,250,130, +135,254, 75, 8,234,237,233,153,145,145, 9,222,240,193, 4,210,114,234, 16,195,215, 47,255,254,255, 99,240,243,243,118,119,119, + 39, 88,250,151,199, 48, 8,240, 48, 60,123,195,192,201,206,240,239, 63, 3, 55, 7, 67,107, 58, 67,245,204, 97, 91, 7,224,234, + 94, 16,147, 38,209, 74,255,140,140, 12, 72,209,191,121,243,102, 96, 41,137,181, 26, 0, 86, 0, 76, 76, 76,192,246,236,231,207, +159,207,156, 57, 99,104,104, 8,172, 6, 62,126,252,120,241,226, 69, 69, 69, 69, 97, 97, 97, 96,233, 15, 20, 33,216,161,129,236, + 8, 35,169, 67, 48,224, 67, 64,228,181,253,201,214, 53, 10,128, 0, 32,128,208, 43, 0, 92, 75,254,137, 92,253, 70, 73, 15, 26, +168, 0,243, 80, 54,130,165,225,172,180,153,160,209,158, 91, 12, 32,132, 0, 31,193,232, 62,217,110, 38,166, 20,134,251, 8, 88, + 70, 64,246, 19, 0,171, 13, 82,175, 50, 6,234, 93, 90,194, 13,169, 15, 72,189,161, 23, 30, 92,144, 89, 95,226, 59, 28, 51,166, + 35,244,126,249, 4, 42, 32,252,252,252,136,212,219,185,132,154,197, 40,173,245, 14,224,208, 63, 3,234, 52, 47, 48,192,129,101, 226,150, 45, 91, 48,165,208, 42, 0,160, 50, 96, 3, 31,200,144,147,147,251,240,225, 67,109,109, 45,176, 2,144,150,150,254,242, 229, 11, 80, 16, 50, 19, 64,208,106, 50, 70,129, 94,188,120, 65,185,151,169, 98,200, 40,160, 27, 0, 8,160, 65,113, 41, 60, 28, - 0,139, 48, 50,204, 33,123,133, 15, 21,251, 52, 4,143,126, 35,163, 43, 64, 76,112, 97,101,147,170,151,152,210,159,146,102,254, + 0,139, 48, 50,204, 33,123,133, 15, 21,251, 52, 4,143,126, 35,163, 43, 64, 76,112, 97,101,147,170,151,248,210,159,188,102,254, 64,165, 43,170,196, 47,121,134,192,143,243,132,159,232,169,169,169, 57,111,222,188,127, 96,128,167,253, 14,105,221, 3,213, 0, 11,122,200, 97,112,224, 10,254, 31, 29, 14,131, 27, 5,195, 27, 96,221,220, 3, 16, 64,163,151,194,143,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52,122, 35,216, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 21,192, 40, 24, 5,163, 96, 20,140, 80, 0, 16, @@ -1449,7 +1437,7 @@ char datatoc_blenderbuttons[]= { 123,223,254,127, 99, 96,100, 96,251,199, 42, 39, 42, 47, 42, 44, 74, 80,215,177, 99,199,144,185, 86, 86, 86,163, 13,213, 81, 64, 35, 0, 16, 64,212, 60, 12,142,200, 75, 84,174, 62,253,128, 41,136, 86,230, 34,111, 71,196, 95, 28, 19,185, 75, 8, 79,229, 1, 49, 1, 82,162, 97, 46,208,134,200, 98, 93, 44,139,108,181,180,162, 44,144,124,249,227,199,159,239,224,243,248, 63,124, 98, 0, -159, 95,132,239, 4, 11, 48, 64,190,144,178,175,175,143,152, 11,208,153, 24, 65, 27,113, 33, 36, 16, 96,101, 76,159, 65,147,202, +159, 95,132,239, 4, 11, 48, 64,190,144,178,175,175,143,152, 11,208,153, 24, 65, 91,112, 33, 36, 16, 96,101, 76,159, 65,147,202, 18, 57,172, 32, 69, 63,241, 97, 69,118,253, 13, 41,253,193, 5, 55,168, 14, 32,222, 40, 72,133,129, 81, 1,144,230,140, 95,191, 202,119,238, 76,115,119,159,229,235,219, 9,233, 13, 16, 89, 13, 28,185,122, 68,222, 80, 54, 57, 56, 65,144, 75,240,223,159,191, 63,254,255,220,113,114,215,190,131,123,173,148,172, 57, 56, 56,240,148,254,153,153,153,200, 34,211,167, 79, 31,173, 3, 70, 1, @@ -1547,5 +1535,5 @@ char datatoc_blenderbuttons[]= { 225,100, 23,103,148, 55,123,233, 48,122,142,117,248, 7,118,226, 6,253,194,138, 18,143,147,218, 78,167,238,112, 16,168,148,127, 136, 69,220,164,218,132,160, 94, 46, 46, 46, 29, 85, 93, 74,156, 29, 28, 28, 60, 90,132,141, 2,202,235, 0, 92, 82, 0, 1, 52, 122, 41,252, 40, 24, 5,163, 96, 20,140, 80, 0, 16, 64,163, 55,130,141,130, 81, 48, 10, 70,193, 8, 5, 0, 1, 52, 90, 1,140, -130, 81, 48, 10, 70,193, 8, 5, 0, 1, 6, 0,178,212, 98,212,112,143,196, 46, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +130, 81, 48, 10, 70,193, 8, 5, 0, 1, 6, 0,179, 52, 4, 9, 62,158, 98,201, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, }; diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c index 43813f7f907..a068ec8c71e 100644 --- a/source/blender/src/butspace.c +++ b/source/blender/src/butspace.c @@ -221,6 +221,23 @@ void test_grouppoin_but(char *name, ID **idpp) *idpp= NULL; } +void test_texpoin_but(char *name, ID **idpp) +{ + ID *id; + + if( *idpp ) (*idpp)->us--; + + id= G.main->tex.first; + while(id) { + if( strcmp(name, id->name+2)==0 ) { + *idpp= id; + id_us_plus(id); + return; + } + id= id->next; + } + *idpp= NULL; +} /* --------------------------------- */ @@ -372,11 +389,12 @@ void redraw_test_buttons(Object *new) addqueue(sa->win, REDRAW, 1); buts->re_align= 1; - if(new) { - BIF_preview_changed(buts); + if(new && buts->mainb==CONTEXT_SHADING) { + /* does node previews too... */ + BIF_preview_changed(ID_TE); } } - // always to context switch + // always do context switch if(new) butspace_context_switch(buts, new); } diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c index 963744696ac..51f9b2531c6 100644 --- a/source/blender/src/buttons_shading.c +++ b/source/blender/src/buttons_shading.c @@ -49,6 +49,7 @@ #include "DNA_lamp_types.h" #include "DNA_material_types.h" #include "DNA_object_types.h" +#include "DNA_node_types.h" #include "DNA_packedFile_types.h" #include "DNA_radio_types.h" #include "DNA_screen_types.h" @@ -64,6 +65,7 @@ #include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_node.h" #include "BKE_material.h" #include "BKE_utildefines.h" #include "BKE_texture.h" @@ -77,6 +79,7 @@ #include "BSE_filesel.h" #include "BSE_headerbuttons.h" +#include "BSE_node.h" #include "BIF_gl.h" #include "BIF_graphics.h" @@ -107,9 +110,8 @@ /* ---------function prototypes ------------- */ void load_tex_image(char *); void load_plugin_tex(char *); -int vergcband(const void *, const void *); + void save_env(char *); -void drawcolorband(ColorBand *, float , float , float , float ); static MTex emptytex; static int packdummy = 0; @@ -213,7 +215,7 @@ void load_tex_image(char *str) /* called from fileselect */ BIF_undo_push("Load image"); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } } @@ -230,20 +232,9 @@ void load_plugin_tex(char *str) /* called from fileselect */ tex->plugin= add_plugin_tex(str); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } -int vergcband(const void *a1, const void *a2) -{ - const CBData *x1=a1, *x2=a2; - - if( x1->pos > x2->pos ) return 1; - else if( x1->pos < x2->pos) return -1; - return 0; -} - - - void save_env(char *name) { Tex *tex; @@ -264,276 +255,18 @@ void save_env(char *name) } -void drawcolorband(ColorBand *coba, float x1, float y1, float sizex, float sizey) -{ - CBData *cbd; - float dx, v3[2], v1[2], v2[2]; - int a; - - if(coba==NULL) return; - - /* first background, to show tranparency */ - dx= sizex/12.0; - v1[0]= x1; - for(a=0; a<12; a++) { - if(a & 1) glColor3f(0.3, 0.3, 0.3); else glColor3f(0.8, 0.8, 0.8); - glRectf(v1[0], y1, v1[0]+dx, y1+0.5*sizey); - if(a & 1) glColor3f(0.8, 0.8, 0.8); else glColor3f(0.3, 0.3, 0.3); - glRectf(v1[0], y1+0.5*sizey, v1[0]+dx, y1+sizey); - v1[0]+= dx; - } - - glShadeModel(GL_SMOOTH); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - - cbd= coba->data; - - v1[0]= v2[0]= x1; - v1[1]= y1; - v2[1]= y1+sizey; - - glBegin(GL_QUAD_STRIP); - - glColor4fv( &cbd->r ); - glVertex2fv(v1); glVertex2fv(v2); - - for(a=0; a<coba->tot; a++, cbd++) { - - v1[0]=v2[0]= x1+ cbd->pos*sizex; - - glColor4fv( &cbd->r ); - glVertex2fv(v1); glVertex2fv(v2); - } - - v1[0]=v2[0]= x1+ sizex; - glVertex2fv(v1); glVertex2fv(v2); - - glEnd(); - glShadeModel(GL_FLAT); - glDisable(GL_BLEND); - - /* outline */ - v1[0]= x1; v1[1]= y1; - - cpack(0x0); - glBegin(GL_LINE_LOOP); - glVertex2fv(v1); - v1[0]+= sizex; - glVertex2fv(v1); - v1[1]+= sizey; - glVertex2fv(v1); - v1[0]-= sizex; - glVertex2fv(v1); - glEnd(); - - - /* help lines */ - - v1[0]= v2[0]=v3[0]= x1; - v1[1]= y1; - v2[1]= y1+0.5*sizey; - v3[1]= y1+sizey; - - cbd= coba->data; - glBegin(GL_LINES); - for(a=0; a<coba->tot; a++, cbd++) { - v1[0]=v2[0]=v3[0]= x1+ cbd->pos*sizex; - - glColor3ub(0, 0, 0); - glVertex2fv(v1); - glVertex2fv(v2); - - if(a==coba->cur) { - glVertex2f(v1[0]-1, v1[1]); - glVertex2f(v2[0]-1, v2[1]); - glVertex2f(v1[0]+1, v1[1]); - glVertex2f(v2[0]+1, v2[1]); - } - - glColor3ub(255, 255, 255); - glVertex2fv(v2); - glVertex2fv(v3); - - if(a==coba->cur) { - if(cbd->pos>0.01) { - glVertex2f(v2[0]-1, v2[1]); - glVertex2f(v3[0]-1, v3[1]); - } - if(cbd->pos<0.99) { - glVertex2f(v2[0]+1, v2[1]); - glVertex2f(v3[0]+1, v3[1]); - } - } - } - glEnd(); - - - glFlush(); -} - -static void drawcolorband_cb(void) +static int vergcband(const void *a1, const void *a2) { - ID *id, *idfrom; - - buttons_active_id(&id, &idfrom); /* base material, not the matlayer! */ - if( GS(id->name)==ID_TE) { - Tex *tex= (Tex *)id; - drawcolorband(tex->coba, 10,145,300,30); - } - else if( GS(id->name)==ID_MA) { - Material *ma= (Material *)id; - ma= get_active_matlayer(ma); - if(ma) { - if(ma->ramp_show==0) - drawcolorband(ma->ramp_col, 10,110,300,30); - else - drawcolorband(ma->ramp_spec, 10,110,300,30); - } - } -} - -static void do_colorbandbuts(ColorBand *coba, unsigned short event) -{ - int a; - - if(coba==NULL) return; - - switch(event) { - case B_ADDCOLORBAND: - - if(coba->tot < MAXCOLORBAND-1) coba->tot++; - coba->cur= coba->tot-1; - - do_colorbandbuts(coba, B_CALCCBAND); - BIF_undo_push("Add colorband"); - - break; - - case B_DELCOLORBAND: - if(coba->tot<2) return; - - for(a=coba->cur; a<coba->tot; a++) { - coba->data[a]= coba->data[a+1]; - } - if(coba->cur) coba->cur--; - coba->tot--; - - BIF_undo_push("Delete colorband"); - allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); - break; - - case B_CALCCBAND: - case B_CALCCBAND2: - if(coba->tot<2) return; - - for(a=0; a<coba->tot; a++) coba->data[a].cur= a; - qsort(coba->data, coba->tot, sizeof(CBData), vergcband); - for(a=0; a<coba->tot; a++) { - if(coba->data[a].cur==coba->cur) { - if(coba->cur!=a) addqueue(curarea->win, REDRAW, 0); /* button cur */ - coba->cur= a; - break; - } - } - if(event==B_CALCCBAND2) return; - - allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); - - break; - - case B_DOCOLORBAND: - - break; - } -} - -/* callback for label button... the size of the button (300) still hardcoded! */ -static void do_colorband_cb(void *namev, void *arg2_unused) -{ - ColorBand *coba= namev; - CBData *cbd; - uiBlock *block; - float dx; - int a; - short mval[2], mvalo[2]; - - /* weak; find panel where colorband is */ - block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Colors"); - if(block==NULL) block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Ramps"); + const CBData *x1=a1, *x2=a2; - if(coba && block) { - int mindist= 12, xco; - uiGetMouse(mywinget(), mvalo); - - if(G.qual & LR_CTRLKEY) { - /* insert new key on mouse location */ - if(coba->tot < MAXCOLORBAND-1) { - float pos= ((float)(mvalo[0] - 12))/300.0f; - float col[4]; - - do_colorband(coba, pos, col); - - coba->tot++; - coba->cur= coba->tot-1; - - coba->data[coba->cur].r= col[0]; - coba->data[coba->cur].g= col[1]; - coba->data[coba->cur].b= col[2]; - coba->data[coba->cur].a= col[3]; - coba->data[coba->cur].pos= pos; - - do_colorbandbuts(coba, B_CALCCBAND); - BIF_undo_push("Add colorband"); - } - } - else { - - /* first, activate new key when mouse is close */ - for(a=0, cbd= coba->data; a<coba->tot; a++, cbd++) { - xco= 12 + (cbd->pos*300.0); - xco= ABS(xco-mvalo[0]); - if(a==coba->cur) xco+= 5; // selected one disadvantage - if(xco<mindist) { - coba->cur= a; - mindist= xco; - } - } - - cbd= coba->data + coba->cur; - - while(get_mbut() & L_MOUSE) { - uiGetMouse(mywinget(), mval); - if(mval[0]!=mvalo[0]) { - dx= mval[0]-mvalo[0]; - dx/= 300.0; - cbd->pos+= dx; - CLAMP(cbd->pos, 0.0, 1.0); - - glDrawBuffer(GL_FRONT); - drawcolorband_cb(); - glDrawBuffer(GL_BACK); - - do_colorbandbuts(coba, B_CALCCBAND2); - cbd= coba->data + coba->cur; /* because qsort */ - - mvalo[0]= mval[0]; - } - BIF_wait_for_statechange(); - } - } - allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); - shade_buttons_change_3d(); - } + if( x1->pos > x2->pos ) return 1; + else if( x1->pos < x2->pos) return -1; + return 0; } void do_texbuts(unsigned short event) { Tex *tex; - Material *ma; ImBuf *ibuf; ScrArea *sa; ID *id; @@ -545,21 +278,21 @@ void do_texbuts(unsigned short event) switch(event) { case B_TEXCHANNEL: scrarea_queue_headredraw(curarea); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); allqueue(REDRAWBUTSSHADING, 0); break; case B_TEXTYPE: if(tex==0) return; tex->stype= 0; allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); break; case B_DEFTEXVAR: if(tex==0) return; default_tex(tex); BIF_undo_push("Default texture vars"); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); break; case B_LOADTEXIMA: if(tex==0) return; @@ -600,13 +333,9 @@ void do_texbuts(unsigned short event) load_tex_image(str); } break; - case B_TEXPRV: - allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); - break; case B_TEXREDR_PRV: allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); shade_buttons_change_3d(); break; case B_TEXIMABROWSE: @@ -625,7 +354,7 @@ void do_texbuts(unsigned short event) BIF_undo_push("Browse image"); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } } } @@ -647,7 +376,7 @@ void do_texbuts(unsigned short event) IMB_freeImBuf(ibuf); tex->ima->ibuf= 0; tex->ima->ok= 1; - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } } } @@ -676,7 +405,7 @@ void do_texbuts(unsigned short event) allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWIMAGE, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } allqueue(REDRAWBUTSSHADING, 0); // redraw buttons @@ -686,7 +415,7 @@ void do_texbuts(unsigned short event) tex->ima->id.us--; tex->ima= NULL; allqueue(REDRAWBUTSSHADING, 0); // redraw buttons - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } break; case B_TEXSETFRAMES: @@ -741,49 +470,29 @@ void do_texbuts(unsigned short event) tex->stype= 0; tex->plugin= add_plugin_tex(str); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); break; case B_COLORBAND: if(tex==0) return; - if(tex->coba==0) tex->coba= add_colorband(); + if(tex->coba==0) tex->coba= add_colorband(0); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); // also ramps, so we do this - break; - - case B_ADDCOLORBAND: - case B_DELCOLORBAND: - case B_CALCCBAND: - case B_CALCCBAND2: - case B_DOCOLORBAND: - /* these events can be called from material subcontext too */ - id= G.buts->lockpoin; - if(id) { - if( GS(id->name)==ID_TE) { - tex= (Tex *)id; - do_colorbandbuts(tex->coba, event); - } - else { - ma= get_active_matlayer((Material *)id); - if(ma->ramp_show==0) do_colorbandbuts(ma->ramp_col, event); - else do_colorbandbuts(ma->ramp_spec, event); - } - } + BIF_preview_changed(ID_TE); // also ramps, so we do this break; - + case B_ENV_DELETE: if(tex->env) { RE_free_envmap(tex->env); tex->env= 0; allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } break; case B_ENV_FREE: if(tex->env) { RE_free_envmapdata(tex->env); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } break; case B_ENV_FREE_ALL: @@ -797,7 +506,7 @@ void do_texbuts(unsigned short event) tex= tex->id.next; } allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); break; case B_ENV_SAVE: if(tex->env && tex->env->ok) { @@ -809,7 +518,7 @@ void do_texbuts(unsigned short event) break; case B_ENV_OB: if(tex->env && tex->env->object) { - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); if ELEM(tex->env->object->type, OB_CAMERA, OB_LAMP) { error("Camera or Lamp not allowed"); tex->env->object= NULL; @@ -822,7 +531,7 @@ void do_texbuts(unsigned short event) PluginTex *pit= tex->plugin; if(pit && pit->callback) { pit->callback(event - B_PLUGBUT); - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); allqueue(REDRAWBUTSSHADING, 0); } } @@ -1353,39 +1062,113 @@ static void texture_panel_image(Tex *tex) } -static void draw_colorband_buts(uiBlock *block, ColorBand *coba, int offs, int redraw) +static void colorband_pos_cb(void *coba_v, void *unused_v) +{ + ColorBand *coba= coba_v; + int a; + + if(coba->tot<2) return; + + for(a=0; a<coba->tot; a++) coba->data[a].cur= a; + qsort(coba->data, coba->tot, sizeof(CBData), vergcband); + for(a=0; a<coba->tot; a++) { + if(coba->data[a].cur==coba->cur) { + if(coba->cur!=a) addqueue(curarea->win, REDRAW, 0); /* button cur */ + coba->cur= a; + break; + } + } +} + +static void colorband_add_cb(void *coba_v, void *unused_v) +{ + ColorBand *coba= coba_v; + + if(coba->tot < MAXCOLORBAND-1) coba->tot++; + coba->cur= coba->tot-1; + + colorband_pos_cb(coba, NULL); + BIF_undo_push("Add colorband"); + +} + +static void colorband_del_cb(void *coba_v, void *unused_v) +{ + ColorBand *coba= coba_v; + int a; + + if(coba->tot<2) return; + + for(a=coba->cur; a<coba->tot; a++) { + coba->data[a]= coba->data[a+1]; + } + if(coba->cur) coba->cur--; + coba->tot--; + + BIF_undo_push("Delete colorband"); + BIF_preview_changed(ID_TE); +} + + +/* offset aligns from bottom, standard width 300, height 115 */ +static void draw_colorband_buts(uiBlock *block, ColorBand *coba, int xoffs, int yoffs, int redraw) { CBData *cbd; uiBut *bt; - + if(coba==NULL) return; - uiDefBut(block, BUT, B_ADDCOLORBAND, "Add", 90,180+offs,37,20, 0, 0, 0, 0, 0, "Adds a new colour position to the colorband"); - uiDefButS(block, NUM, B_REDR, "Cur:", 127,180+offs,81,20, &coba->cur, 0.0, (float)(coba->tot-1), 0, 0, "Displays the active colour from the colorband"); - uiDefBut(block, BUT, B_DELCOLORBAND, "Del", 209,180+offs,37,20, 0, 0, 0, 0, 0, "Deletes the active position"); - uiDefButS(block, ROW, redraw, "E", 246,180+offs,16,20, &coba->ipotype, 5.0, 1.0, 0, 0, "Sets interpolation type 'Ease' (quadratic) "); - uiDefButS(block, ROW, B_TEXREDR_PRV, "C", 262,180+offs,16,20, &coba->ipotype, 5.0, 3.0, 0, 0, "Sets interpolation type Cardinal"); - uiDefButS(block, ROW, B_TEXREDR_PRV, "L", 278,180+offs,16,20, &coba->ipotype, 5.0, 0.0, 0, 0, "Sets interpolation type Linear"); - uiDefButS(block, ROW, B_TEXREDR_PRV, "S", 294,180+offs,16,20, &coba->ipotype, 5.0, 2.0, 0, 0, "Sets interpolation type B-Spline"); - - bt=uiDefBut(block, LABEL, B_DOCOLORBAND, "", 10,150+offs,300,30, 0, 0, 0, 0, 0, "Colorband"); /* only for event! */ - uiButSetFunc(bt, do_colorband_cb, coba, NULL); + bt= uiDefBut(block, BUT, redraw, "Add", 80+xoffs,95+yoffs,37,20, 0, 0, 0, 0, 0, "Adds a new colour position to the colorband"); + uiButSetFunc(bt, colorband_add_cb, coba, NULL); + uiDefButS(block, NUM, redraw, "Cur:", 117+xoffs,95+yoffs,81,20, &coba->cur, 0.0, (float)(coba->tot-1), 0, 0, "Displays the active colour from the colorband"); + bt= uiDefBut(block, BUT, redraw, "Del", 199+xoffs,95+yoffs,37,20, 0, 0, 0, 0, 0, "Deletes the active position"); + uiButSetFunc(bt, colorband_del_cb, coba, NULL); + uiDefButS(block, ROW, redraw, "E", 236+xoffs,95+yoffs,16,20, &coba->ipotype, 5.0, 1.0, 0, 0, "Sets interpolation type 'Ease' (quadratic) "); + uiDefButS(block, ROW, redraw, "C", 252+xoffs,95+yoffs,16,20, &coba->ipotype, 5.0, 3.0, 0, 0, "Sets interpolation type Cardinal"); + uiDefButS(block, ROW, redraw, "L", 268+xoffs,95+yoffs,16,20, &coba->ipotype, 5.0, 0.0, 0, 0, "Sets interpolation type Linear"); + uiDefButS(block, ROW, redraw, "S", 284+xoffs,95+yoffs,16,20, &coba->ipotype, 5.0, 2.0, 0, 0, "Sets interpolation type B-Spline"); - uiBlockSetDrawExtraFunc(block, drawcolorband_cb); + uiDefBut(block, BUT_COLORBAND, redraw, "", xoffs,65+yoffs,300,30, coba, 0, 0, 0, 0, ""); + cbd= coba->data + coba->cur; uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_CALCCBAND, "Pos", 10,125+offs,110,20, &cbd->pos, 0.0, 1.0, 10, 0, "Sets the position of the active colour"); - uiDefButF(block, COL, B_TEXREDR_PRV, "", 10,105+offs,110,20, &(cbd->r), 0, 0, 0, B_BANDCOL, ""); - uiDefButF(block, NUMSLI, B_TEXREDR_PRV, "A ", 10,85+offs,110,20, &cbd->a, 0.0, 1.0, 0, 0, "Sets the alpha value for this position"); + bt= uiDefButF(block, NUM, redraw, "Pos", xoffs,40+yoffs,110,20, &cbd->pos, 0.0, 1.0, 10, 0, "Sets the position of the active colour"); + uiButSetFunc(bt, colorband_pos_cb, coba, NULL); + uiDefButF(block, COL, redraw, "", xoffs,20+yoffs,110,20, &(cbd->r), 0, 0, 0, B_BANDCOL, ""); + uiDefButF(block, NUMSLI, redraw, "A ", xoffs,yoffs,110,20, &cbd->a, 0.0, 1.0, 10, 0, "Sets the alpha value for this position"); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_TEXREDR_PRV, "R ", 125,125+offs,185,20, &cbd->r, 0.0, 1.0, B_BANDCOL, 0, "Sets the red value for the active colour"); - uiDefButF(block, NUMSLI, B_TEXREDR_PRV, "G ", 125,105+offs,185,20, &cbd->g, 0.0, 1.0, B_BANDCOL, 0, "Sets the green value for the active colour"); - uiDefButF(block, NUMSLI, B_TEXREDR_PRV, "B ", 125,85+offs,185,20, &cbd->b, 0.0, 1.0, B_BANDCOL, 0, "Sets the blue value for the active colour"); + uiDefButF(block, NUMSLI, redraw, "R ", 115+xoffs,40+yoffs,185,20, &cbd->r, 0.0, 1.0, B_BANDCOL, 0, "Sets the red value for the active colour"); + uiDefButF(block, NUMSLI, redraw, "G ", 115+xoffs,20+yoffs,185,20, &cbd->g, 0.0, 1.0, B_BANDCOL, 0, "Sets the green value for the active colour"); + uiDefButF(block, NUMSLI, redraw, "B ", 115+xoffs,yoffs,185,20, &cbd->b, 0.0, 1.0, B_BANDCOL, 0, "Sets the blue value for the active colour"); uiBlockEndAlign(block); } +void draw_colorband_buts_small(uiBlock *block, ColorBand *coba, rctf *butr, int event) +{ + CBData *cbd; + uiBut *bt; + float unit= (butr->xmax-butr->xmin)/12.0f; + float xs= butr->xmin; + + cbd= coba->data + coba->cur; + + uiBlockBeginAlign(block); + uiDefButF(block, COL, event, "", xs,butr->ymin+20.0f,2.0f*unit,20, &(cbd->r), 0, 0, 0, B_BANDCOL, ""); + uiDefButF(block, NUM, event, "A:", xs+2.0f*unit,butr->ymin+20.0f,4.0f*unit,20, &(cbd->a), 0.0f, 1.0f, 10, 2, ""); + bt= uiDefBut(block, BUT, event, "Del", xs+6.0f*unit,butr->ymin+20.0f,2.0f*unit,20, NULL, 0, 0, 0, 0, "Deletes the active position"); + uiButSetFunc(bt, colorband_del_cb, coba, NULL); + uiDefButS(block, ROW, event, "E", xs+8.0f*unit,butr->ymin+20.0f,unit,20, &coba->ipotype, 5.0, 1.0, 0, 0, "Sets interpolation type 'Ease' (quadratic) "); + uiDefButS(block, ROW, event, "C", xs+9.0f*unit,butr->ymin+20.0f,unit,20, &coba->ipotype, 5.0, 3.0, 0, 0, "Sets interpolation type Cardinal"); + uiDefButS(block, ROW, event, "L", xs+10.0f*unit,butr->ymin+20.0f,unit,20, &coba->ipotype, 5.0, 0.0, 0, 0, "Sets interpolation type Linear"); + uiDefButS(block, ROW, event, "S", xs+11.0f*unit,butr->ymin+20.0f,unit,20, &coba->ipotype, 5.0, 2.0, 0, 0, "Sets interpolation type B-Spline"); + + uiDefBut(block, BUT_COLORBAND, event, "", xs,butr->ymin,butr->xmax-butr->xmin,20.0f, coba, 0, 0, 0, 0, ""); + uiBlockEndAlign(block); + +} + static void texture_panel_colors(Tex *tex) { uiBlock *block; @@ -1400,7 +1183,7 @@ static void texture_panel_colors(Tex *tex) uiDefButBitS(block, TOG, TEX_COLORBAND, B_COLORBAND, "Colorband",10,180,80,20, &tex->flag, 0, 0, 0, 0, "Toggles colorband operations"); if(tex->flag & TEX_COLORBAND) { - draw_colorband_buts(block, tex->coba, 0, B_TEXREDR_PRV); + draw_colorband_buts(block, tex->coba, 10, 85, B_TEXREDR_PRV); } /* RGB-BRICON */ @@ -1752,7 +1535,7 @@ void do_worldbuts(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWOOPS, 0); BIF_undo_push("Unlink world texture"); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); } break; case B_WMTEXCOPY: @@ -1780,7 +1563,7 @@ void do_worldbuts(unsigned short event) id_us_plus((ID *)mtexcopybuf.tex); BIF_undo_push("Paste mapping settings"); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); scrarea_queue_winredraw(curarea); } break; @@ -1807,35 +1590,35 @@ static void world_panel_mapto(World *wrld) /* TEXTURE OUTPUT */ uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, MTEX_STENCIL, B_MATPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode"); - uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_MATPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect"); - uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_MATPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values"); + uiDefButBitS(block, TOG, MTEX_STENCIL, B_WORLDPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode"); + uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_WORLDPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect"); + uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_WORLDPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values"); uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); - uiDefButF(block, NUMSLI, B_MATPRV, "R ", 10,80,135,19, &(mtex->r), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); - uiDefButF(block, NUMSLI, B_MATPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); - uiDefButF(block, NUMSLI, B_MATPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, COL, B_WORLDPRV, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); + uiDefButF(block, NUMSLI, B_WORLDPRV, "R ", 10,80,135,19, &(mtex->r), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); uiBlockEndAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value for textures to mix with values (not RGB)"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value for textures to mix with values (not RGB)"); /* MAP TO */ uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, WOMAP_BLEND, B_MATPRV, "Blend", 10,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour progression of the background"); - uiDefButBitS(block, TOG, WOMAP_HORIZ, B_MATPRV, "Hori", 85,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the horizon"); - uiDefButBitS(block, TOG, WOMAP_ZENUP, B_MATPRV, "ZenUp", 160,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith above"); - uiDefButBitS(block, TOG, WOMAP_ZENDOWN, B_MATPRV, "ZenDo", 235,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith below"); + uiDefButBitS(block, TOG, WOMAP_BLEND, B_WORLDPRV, "Blend", 10,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour progression of the background"); + uiDefButBitS(block, TOG, WOMAP_HORIZ, B_WORLDPRV, "Hori", 85,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the horizon"); + uiDefButBitS(block, TOG, WOMAP_ZENUP, B_WORLDPRV, "ZenUp", 160,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith above"); + uiDefButBitS(block, TOG, WOMAP_ZENDOWN, B_WORLDPRV, "ZenDo", 235,180,75,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the colour of the zenith below"); uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButS(block, MENU, B_MATPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode"); + uiDefButS(block, MENU, B_WORLDPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode"); uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "Col ", 155,100,155,19, &(mtex->colfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects colour values"); - uiDefButF(block, NUMSLI, B_MATPRV, "Nor ", 155,80,155,19, &(mtex->norfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects normal values"); - uiDefButF(block, NUMSLI, B_MATPRV, "Var ", 155,60,155,19, &(mtex->varfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects other values"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "Col ", 155,100,155,19, &(mtex->colfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects colour values"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "Nor ", 155,80,155,19, &(mtex->norfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects normal values"); + uiDefButF(block, NUMSLI, B_WORLDPRV, "Var ", 155,60,155,19, &(mtex->varfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects other values"); } @@ -1902,24 +1685,24 @@ static void world_panel_texture(World *wrld) /* TEXCO */ uiBlockBeginAlign(block); - uiDefButS(block, ROW, B_MATPRV, "View", 100,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses view vector for the texture coordinates"); - uiDefButS(block, ROW, B_MATPRV, "Global", 200,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates (interior mist)"); + uiDefButS(block, ROW, B_WORLDPRV, "View", 100,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses view vector for the texture coordinates"); + uiDefButS(block, ROW, B_WORLDPRV, "Global", 200,110,100,20, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates (interior mist)"); - uiDefButS(block, ROW, B_MATPRV, "AngMap", 100,90,70,20, &(mtex->texco), 4.0, (float)TEXCO_ANGMAP, 0, 0, "Uses 360 degree angular coordinates, e.g. for spherical light probes"); - uiDefButS(block, ROW, B_MATPRV, "Sphere", 170,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_SPHEREMAP, 0, 0, "For 360 degree panorama sky, spherical mapped, only top half"); - uiDefButS(block, ROW, B_MATPRV, "Tube", 235,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_TUBEMAP, 0, 0, "For 360 degree panorama sky, cylindrical mapped, only top half"); + uiDefButS(block, ROW, B_WORLDPRV, "AngMap", 100,90,70,20, &(mtex->texco), 4.0, (float)TEXCO_ANGMAP, 0, 0, "Uses 360 degree angular coordinates, e.g. for spherical light probes"); + uiDefButS(block, ROW, B_WORLDPRV, "Sphere", 170,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_SPHEREMAP, 0, 0, "For 360 degree panorama sky, spherical mapped, only top half"); + uiDefButS(block, ROW, B_WORLDPRV, "Tube", 235,90,65,20, &(mtex->texco), 4.0, (float)TEXCO_H_TUBEMAP, 0, 0, "For 360 degree panorama sky, cylindrical mapped, only top half"); - uiDefButS(block, ROW, B_MATPRV, "Object", 100,70,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates"); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_MATPRV, "", 170,70,130,20, &(mtex->object), ""); + uiDefButS(block, ROW, B_WORLDPRV, "Object", 100,70,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates"); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_WORLDPRV, "", 170,70,130,20, &(mtex->object), ""); uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_MATPRV, "dX", 100,40,100,19, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate"); - uiDefButF(block, NUM, B_MATPRV, "dY", 100,20,100,19, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate"); - uiDefButF(block, NUM, B_MATPRV, "dZ", 100, 0,100,19, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate"); + uiDefButF(block, NUM, B_WORLDPRV, "dX", 100,40,100,19, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate"); + uiDefButF(block, NUM, B_WORLDPRV, "dY", 100,20,100,19, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate"); + uiDefButF(block, NUM, B_WORLDPRV, "dZ", 100, 0,100,19, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate"); uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_MATPRV, "sizeX", 200,40,100,19, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size"); - uiDefButF(block, NUM, B_MATPRV, "sizeY", 200,20,100,19, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size"); - uiDefButF(block, NUM, B_MATPRV, "sizeZ", 200, 0,100,19, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size"); + uiDefButF(block, NUM, B_WORLDPRV, "sizeX", 200,40,100,19, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size"); + uiDefButF(block, NUM, B_WORLDPRV, "sizeY", 200,20,100,19, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size"); + uiDefButF(block, NUM, B_WORLDPRV, "sizeZ", 200, 0,100,19, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size"); } @@ -2037,28 +1820,28 @@ static void world_panel_world(World *wrld) uiSetButLock(wrld->id.lib!=0, "Can't edit library data"); uiBlockSetCol(block, TH_AUTO); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10,150,145,19, &wrld->horr, 0, 0, 0, B_COLHOR, ""); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 160,150,145,19, &wrld->zenr, 0, 0, 0, B_COLZEN, ""); + uiDefButF(block, COL, B_WORLDPRV, "", 10,150,145,19, &wrld->horr, 0, 0, 0, B_COLHOR, ""); + uiDefButF(block, COL, B_WORLDPRV, "", 160,150,145,19, &wrld->zenr, 0, 0, 0, B_COLZEN, ""); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI,B_MATPRV,"HoR ", 10,130,145,19, &(wrld->horr), 0.0, 1.0, B_COLHOR,0, "Sets the amount of red colour at the horizon"); - uiDefButF(block, NUMSLI,B_MATPRV,"HoG ", 10,110,145,19, &(wrld->horg), 0.0, 1.0, B_COLHOR,0, "Sets the amount of green colour at the horizon"); - uiDefButF(block, NUMSLI,B_MATPRV,"HoB ", 10,90,145,19, &(wrld->horb), 0.0, 1.0, B_COLHOR,0, "Sets the amount of blue colour at the horizon"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"HoR ", 10,130,145,19, &(wrld->horr), 0.0, 1.0, B_COLHOR,0, "Sets the amount of red colour at the horizon"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"HoG ", 10,110,145,19, &(wrld->horg), 0.0, 1.0, B_COLHOR,0, "Sets the amount of green colour at the horizon"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"HoB ", 10,90,145,19, &(wrld->horb), 0.0, 1.0, B_COLHOR,0, "Sets the amount of blue colour at the horizon"); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI,B_MATPRV,"ZeR ", 160,130,145,19, &(wrld->zenr), 0.0, 1.0, B_COLZEN,0, "Sets the amount of red colour at the zenith"); - uiDefButF(block, NUMSLI,B_MATPRV,"ZeG ", 160,110,145,19, &(wrld->zeng), 0.0, 1.0, B_COLZEN,0, "Sets the amount of green colour at the zenith"); - uiDefButF(block, NUMSLI,B_MATPRV,"ZeB ", 160,90,145,19, &(wrld->zenb), 0.0, 1.0, B_COLZEN,0, "Sets the amount of blue colour at the zenith"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeR ", 160,130,145,19, &(wrld->zenr), 0.0, 1.0, B_COLZEN,0, "Sets the amount of red colour at the zenith"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeG ", 160,110,145,19, &(wrld->zeng), 0.0, 1.0, B_COLZEN,0, "Sets the amount of green colour at the zenith"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"ZeB ", 160,90,145,19, &(wrld->zenb), 0.0, 1.0, B_COLZEN,0, "Sets the amount of blue colour at the zenith"); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI,B_MATPRV,"AmbR ", 10,50,145,19, &(wrld->ambr), 0.0, 1.0 ,0,0, "Sets the amount of red ambient colour"); - uiDefButF(block, NUMSLI,B_MATPRV,"AmbG ", 10,30,145,19, &(wrld->ambg), 0.0, 1.0 ,0,0, "Sets the amount of green ambient colour"); - uiDefButF(block, NUMSLI,B_MATPRV,"AmbB ", 10,10,145,19, &(wrld->ambb), 0.0, 1.0 ,0,0, "Sets the amount of blue ambient colour"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbR ", 10,50,145,19, &(wrld->ambr), 0.0, 1.0 ,0,0, "Sets the amount of red ambient colour"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbG ", 10,30,145,19, &(wrld->ambg), 0.0, 1.0 ,0,0, "Sets the amount of green ambient colour"); + uiDefButF(block, NUMSLI,B_WORLDPRV,"AmbB ", 10,10,145,19, &(wrld->ambb), 0.0, 1.0 ,0,0, "Sets the amount of blue ambient colour"); uiBlockBeginAlign(block); uiBlockSetCol(block, TH_BUT_SETTING1); - uiDefButF(block, NUMSLI,B_MATPRV, "Exp ", 160,30,145,19, &(wrld->exp), 0.0, 1.0, 0, 2, "Sets amount of exponential color correction for light"); - uiDefButF(block, NUMSLI,B_MATPRV, "Range ", 160,10,145,19, &(wrld->range), 0.2, 5.0, 0, 2, "Sets the color amount that will be mapped on color 1.0"); + uiDefButF(block, NUMSLI,B_WORLDPRV, "Exp ", 160,30,145,19, &(wrld->exp), 0.0, 1.0, 0, 2, "Sets amount of exponential color correction for light"); + uiDefButF(block, NUMSLI,B_WORLDPRV, "Range ", 160,10,145,19, &(wrld->range), 0.2, 5.0, 0, 2, "Sets the color amount that will be mapped on color 1.0"); } @@ -2081,9 +1864,9 @@ static void world_panel_preview(World *wrld) uiDefBut(block, LABEL, 0, " ", 20,20,10,10, 0, 0, 0, 0, 0, ""); uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, WO_SKYREAL, B_MATPRV,"Real", 200,175,80,25, &wrld->skytype, 0, 0, 0, 0, "Renders background with a real horizon"); - uiDefButBitS(block, TOG, WO_SKYBLEND, B_MATPRV,"Blend",200,150,80,25, &wrld->skytype, 0, 0, 0, 0, "Renders background with natural progression from horizon to zenith"); - uiDefButBitS(block, TOG,WO_SKYPAPER, B_MATPRV,"Paper",200,125,80,25, &wrld->skytype, 0, 0, 0, 0, "Flattens blend or texture coordinates"); + uiDefButBitS(block, TOG, WO_SKYREAL, B_WORLDPRV,"Real", 200,175,80,25, &wrld->skytype, 0, 0, 0, 0, "Renders background with a real horizon"); + uiDefButBitS(block, TOG, WO_SKYBLEND, B_WORLDPRV,"Blend",200,150,80,25, &wrld->skytype, 0, 0, 0, 0, "Renders background with natural progression from horizon to zenith"); + uiDefButBitS(block, TOG,WO_SKYPAPER, B_WORLDPRV,"Paper",200,125,80,25, &wrld->skytype, 0, 0, 0, 0, "Flattens blend or texture coordinates"); uiBlockEndAlign(block); } @@ -2099,7 +1882,7 @@ void do_lampbuts(unsigned short event) switch(event) { case B_LAMPREDRAW: - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWBUTSSHADING, 0); break; @@ -2113,7 +1896,7 @@ void do_lampbuts(unsigned short event) BIF_undo_push("Unlink world texture"); allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); } break; case B_SBUFF: @@ -2162,7 +1945,7 @@ void do_lampbuts(unsigned short event) id_us_plus((ID *)mtexcopybuf.tex); BIF_undo_push("Paste mapping settings"); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); scrarea_queue_winredraw(curarea); } break; @@ -2193,27 +1976,27 @@ static void lamp_panel_mapto(Object *ob, Lamp *la) /* TEXTURE OUTPUT */ uiBlockBeginAlign(block); - uiDefButBitS(block, TOG, MTEX_STENCIL, B_MATPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode"); - uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_MATPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect"); - uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_MATPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values"); + uiDefButBitS(block, TOG, MTEX_STENCIL, B_LAMPPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode"); + uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_LAMPPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect"); + uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_LAMPPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values"); uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); - uiDefButF(block, NUMSLI, B_MATPRV, "R ", 10,80,135,19, &(mtex->r), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); - uiDefButF(block, NUMSLI, B_MATPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); - uiDefButF(block, NUMSLI, B_MATPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, COL, B_LAMPPRV, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); + uiDefButF(block, NUMSLI, B_LAMPPRV, "R ", 10,80,135,19, &(mtex->r), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, NUMSLI, B_LAMPPRV, "G ", 10,60,135,19, &(mtex->g), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); + uiDefButF(block, NUMSLI, B_LAMPPRV, "B ", 10,40,135,19, &(mtex->b), 0.0, 1.0, B_MTEXCOL, 0, "The default color for textures that don't return RGB"); uiBlockEndAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value the textures uses to mix with"); + uiDefButF(block, NUMSLI, B_LAMPPRV, "DVar ", 10,10,135,19, &(mtex->def_var), 0.0, 1.0, 0, 0, "The default value the textures uses to mix with"); /* MAP TO */ - uiDefButBitS(block, TOG, MAP_COL, B_MATPRV, "Col", 10,180,135,19, &(mtex->mapto), 0, 0, 0, 0, "Lets the texture affect the basic colour of the lamp"); + uiDefButBitS(block, TOG, MAP_COL, B_LAMPPRV, "Col", 10,180,135,19, &(mtex->mapto), 0, 0, 0, 0, "Lets the texture affect the basic colour of the lamp"); uiBlockBeginAlign(block); - uiDefButS(block, MENU, B_MATPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode"); + uiDefButS(block, MENU, B_LAMPPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode"); uiBlockEndAlign(block); - uiDefButF(block, NUMSLI, B_MATPRV, "Col ", 155,100,155,19, &(mtex->colfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects colour values"); + uiDefButF(block, NUMSLI, B_LAMPPRV, "Col ", 155,100,155,19, &(mtex->colfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects colour values"); } @@ -2282,19 +2065,19 @@ static void lamp_panel_texture(Object *ob, Lamp *la) /* TEXCO */ uiBlockSetCol(block, TH_AUTO); uiBlockBeginAlign(block); - uiDefButS(block, ROW, B_MATPRV, "Glob", 100,110,60,20, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates"); - uiDefButS(block, ROW, B_MATPRV, "View", 160,110,70,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses view coordinates for the texture coordinates"); - uiDefButS(block, ROW, B_MATPRV, "Object", 230,110,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates"); - uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_MATPRV, "", 100,90,200,20, &(mtex->object), ""); + uiDefButS(block, ROW, B_LAMPPRV, "Glob", 100,110,60,20, &(mtex->texco), 4.0, (float)TEXCO_GLOB, 0, 0, "Uses global coordinates for the texture coordinates"); + uiDefButS(block, ROW, B_LAMPPRV, "View", 160,110,70,20, &(mtex->texco), 4.0, (float)TEXCO_VIEW, 0, 0, "Uses view coordinates for the texture coordinates"); + uiDefButS(block, ROW, B_LAMPPRV, "Object", 230,110,70,20, &(mtex->texco), 4.0, (float)TEXCO_OBJECT, 0, 0, "Uses linked object's coordinates for texture coordinates"); + uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_LAMPPRV, "", 100,90,200,20, &(mtex->object), ""); uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_MATPRV, "dX", 100,50,100,18, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate"); - uiDefButF(block, NUM, B_MATPRV, "dY", 100,30,100,18, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate"); - uiDefButF(block, NUM, B_MATPRV, "dZ", 100,10,100,18, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate"); + uiDefButF(block, NUM, B_LAMPPRV, "dX", 100,50,100,18, mtex->ofs, -20.0, 20.0, 10, 0, "Fine tunes texture mapping X coordinate"); + uiDefButF(block, NUM, B_LAMPPRV, "dY", 100,30,100,18, mtex->ofs+1, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Y coordinate"); + uiDefButF(block, NUM, B_LAMPPRV, "dZ", 100,10,100,18, mtex->ofs+2, -20.0, 20.0, 10, 0, "Fine tunes texture mapping Z coordinate"); uiBlockBeginAlign(block); - uiDefButF(block, NUM, B_MATPRV, "sizeX", 200,50,100,18, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size"); - uiDefButF(block, NUM, B_MATPRV, "sizeY", 200,30,100,18, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size"); - uiDefButF(block, NUM, B_MATPRV, "sizeZ", 200,10,100,18, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size"); + uiDefButF(block, NUM, B_LAMPPRV, "sizeX", 200,50,100,18, mtex->size, -10.0, 10.0, 10, 0, "Sets scaling for the texture's X size"); + uiDefButF(block, NUM, B_LAMPPRV, "sizeY", 200,30,100,18, mtex->size+1, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Y size"); + uiDefButF(block, NUM, B_LAMPPRV, "sizeZ", 200,10,100,18, mtex->size+2, -10.0, 10.0, 10, 0, "Sets scaling for the texture's Z size"); uiBlockEndAlign(block); } @@ -2497,33 +2280,33 @@ static void lamp_panel_lamp(Object *ob, Lamp *la) } else if ELEM(la->type, LA_LOCAL, LA_SPOT) { uiBlockSetCol(block, TH_BUT_SETTING1); - uiDefButBitS(block, TOG, LA_QUAD, B_MATPRV,"Quad", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Uses inverse quadratic proportion for light attenuation"); + uiDefButBitS(block, TOG, LA_QUAD, B_LAMPPRV,"Quad", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Uses inverse quadratic proportion for light attenuation"); uiDefButBitS(block, TOG, LA_SPHERE, REDRAWVIEW3D,"Sphere", 10,130,100,19,&la->mode, 0, 0, 0, 0, "Sets light intensity to zero for objects beyond the distance value"); } uiBlockBeginAlign(block); uiBlockSetCol(block, TH_BUT_SETTING1); uiDefButBitS(block, TOG, LA_LAYER, 0,"Layer", 10,70,100,19,&la->mode, 0, 0, 0, 0, "Illuminates objects in the same layer as the lamp only"); - uiDefButBitS(block, TOG, LA_NEG, B_MATPRV,"Negative", 10,50,100,19,&la->mode, 0, 0, 0, 0, "Sets lamp to cast negative light"); + uiDefButBitS(block, TOG, LA_NEG, B_LAMPPRV,"Negative", 10,50,100,19,&la->mode, 0, 0, 0, 0, "Sets lamp to cast negative light"); uiDefButBitS(block, TOG, LA_NO_DIFF, 0,"No Diffuse", 10,30,100,19,&la->mode, 0, 0, 0, 0, "Disables diffuse shading of material illuminated by this lamp"); uiDefButBitS(block, TOG, LA_NO_SPEC, 0,"No Specular", 10,10,100,19,&la->mode, 0, 0, 0, 0, "Disables specular shading of material illuminated by this lamp"); uiBlockEndAlign(block); uiBlockSetCol(block, TH_AUTO); - uiDefButF(block, NUMSLI,B_MATPRV,"Energy ", 120,150,180,20, &(la->energy), 0.0, 10.0, 0, 0, "Sets the intensity of the light"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"Energy ", 120,150,180,20, &(la->energy), 0.0, 10.0, 0, 0, "Sets the intensity of the light"); uiBlockBeginAlign(block); - uiDefButF(block, NUMSLI,B_MATPRV,"R ", 120,120,180,20,&la->r, 0.0, 1.0, B_COLLAMP, 0, "Sets the red component of the light"); - uiDefButF(block, NUMSLI,B_MATPRV,"G ", 120,100,180,20,&la->g, 0.0, 1.0, B_COLLAMP, 0, "Sets the green component of the light"); - uiDefButF(block, NUMSLI,B_MATPRV,"B ", 120,80,180,20,&la->b, 0.0, 1.0, B_COLLAMP, 0, "Sets the blue component of the light"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"R ", 120,120,180,20,&la->r, 0.0, 1.0, B_COLLAMP, 0, "Sets the red component of the light"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"G ", 120,100,180,20,&la->g, 0.0, 1.0, B_COLLAMP, 0, "Sets the green component of the light"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"B ", 120,80,180,20,&la->b, 0.0, 1.0, B_COLLAMP, 0, "Sets the blue component of the light"); uiBlockEndAlign(block); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 120,52,180,24, &la->r, 0, 0, 0, B_COLLAMP, ""); + uiDefButF(block, COL, B_LAMPPRV, "", 120,52,180,24, &la->r, 0, 0, 0, B_COLLAMP, ""); uiBlockBeginAlign(block); if ELEM(la->type, LA_LOCAL, LA_SPOT) { - uiDefButF(block, NUMSLI,B_MATPRV,"Quad1 ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp"); - uiDefButF(block, NUMSLI,B_MATPRV,"Quad2 ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad1 ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp"); + uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad2 ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp"); } else if(la->type==LA_AREA) { if(la->k==0.0) la->k= 1.0; @@ -2626,7 +2409,7 @@ void do_matbuts(unsigned short event) break; } } - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); allqueue(REDRAWBUTSSHADING, 0); shade_buttons_change_3d(); break; @@ -2636,7 +2419,7 @@ void do_matbuts(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); break; case B_MATFROM: scrarea_queue_headredraw(curarea); @@ -2645,15 +2428,21 @@ void do_matbuts(unsigned short event) // BIF_previewdraw(); push/pop! break; case B_MATPRV: - /* this event also used by lamp, tex and sky */ - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); allqueue(REDRAWBUTSSHADING, 0); shade_buttons_change_3d(); break; - case B_MATPRV_DRAW: - BIF_preview_changed(G.buts); + case B_TEXPRV: + BIF_preview_changed(ID_TE); + allqueue(REDRAWBUTSSHADING, 0); + break; + case B_LAMPPRV: + BIF_preview_changed(ID_LA); + allqueue(REDRAWBUTSSHADING, 0); + break; + case B_WORLDPRV: + BIF_preview_changed(ID_WO); allqueue(REDRAWBUTSSHADING, 0); - shade_buttons_change_3d(); break; case B_MATHALO: /* when halo is disabled, clear star flag, this is the same as MA_FACETEXTURE <blush> */ @@ -2661,7 +2450,7 @@ void do_matbuts(unsigned short event) if((ma->mode & MA_HALO)==0) { ma->mode &= ~(MA_STAR|MA_HALO_XALPHA|MA_ZINV); } - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); allqueue(REDRAWBUTSSHADING, 0); shade_buttons_change_3d(); break; @@ -2674,7 +2463,7 @@ void do_matbuts(unsigned short event) BIF_undo_push("Unlink material texture"); allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } break; case B_MTEXCOPY: @@ -2700,7 +2489,7 @@ void do_matbuts(unsigned short event) id_us_plus((ID *)mtexcopybuf.tex); BIF_undo_push("Paste mapping settings"); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); scrarea_queue_winredraw(curarea); } break; @@ -2714,25 +2503,25 @@ void do_matbuts(unsigned short event) if(ma) { ma->mode &= ~MA_RAYTRANSP; allqueue(REDRAWBUTSSHADING, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } break; case B_MATRAYTRANSP: if(ma) { ma->mode &= ~MA_ZTRA; allqueue(REDRAWBUTSSHADING, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } break; case B_MATCOLORBAND: if(ma) { if(ma->mode & MA_RAMP_COL) - if(ma->ramp_col==NULL) ma->ramp_col= add_colorband(); + if(ma->ramp_col==NULL) ma->ramp_col= add_colorband(0); if(ma->mode & MA_RAMP_SPEC) - if(ma->ramp_spec==NULL) ma->ramp_spec= add_colorband(); + if(ma->ramp_spec==NULL) ma->ramp_spec= add_colorband(0); allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_MA); shade_buttons_change_3d(); } break; @@ -2756,13 +2545,29 @@ void do_matbuts(unsigned short event) ml->mat->id.us++; } allqueue(REDRAWBUTSSHADING, 0); - BIF_all_preview_changed(); + BIF_preview_changed(ID_MA); break; } } } break; + case B_MAT_USENODES: + ma= G.buts->lockpoin; /* use base material instead */ + if(ma) { + if(ma->use_nodes && ma->nodetree==NULL) { + node_shader_default(ma); + } + BIF_preview_changed(ID_MA); + allqueue(REDRAWNODE, 0); + allqueue(REDRAWBUTSSHADING, 0); + } + break; + case B_NODE_EXEC: + BIF_preview_changed(ID_MA); + allqueue(REDRAWNODE, 0); + allqueue(REDRAWBUTSSHADING, 0); + break; } } @@ -2791,7 +2596,7 @@ static void material_panel_map_to(Material *ma) uiBlockEndAlign(block); uiBlockBeginAlign(block); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); + uiDefButF(block, COL, B_MATPRV, "", 10,100,135,19, &(mtex->r), 0, 0, 0, B_MTEXCOL, ""); if(ma->colormodel==MA_HSV) { uiBlockSetCol(block, TH_BUT_SETTING1); @@ -2877,7 +2682,7 @@ static void material_panel_map_input(Object *ob, Material *ma) uiDefButS(block, ROW, B_MATPRV, "Refl", 864,160,44,18, &(mtex->texco), 4.0, (float)TEXCO_REFL, 0, 0, "Uses reflection vector as texture coordinates"); uiDefButS(block, ROW, B_MATPRV, "Stress", 630,140,70,18, &(mtex->texco), 4.0, (float)TEXCO_STRESS, 0, 0, "Uses the difference of edge lengths compared to original coordinates of the mesh"); - uiDefButS(block, ROW, B_MATPRV, "Tangent", 700,140,70,18, &(mtex->texco), 4.0, (float)TEXCO_TANGENT, 0, 0, "Uses te optional tangent vector as texture coordinates"); + uiDefButS(block, ROW, B_MATPRV, "Tangent", 700,140,70,18, &(mtex->texco), 4.0, (float)TEXCO_TANGENT, 0, 0, "Uses the optional tangent vector as texture coordinates"); /* COORDS */ uiBlockBeginAlign(block); @@ -2933,7 +2738,7 @@ static void material_panel_texture(Material *ma) if(mtex && mtex->tex) splitIDname(mtex->tex->id.name+2, str, &loos); else strcpy(str, ""); str[10]= 0; - uiDefButC(block, ROW, B_MATPRV_DRAW, str, 10, 180-18*a, 70, 20, &(ma->texact), 3.0, (float)a, 0, 0, ""); + uiDefButC(block, ROW, B_MATPRV, str, 10, 180-18*a, 70, 20, &(ma->texact), 3.0, (float)a, 0, 0, ""); } uiBlockEndAlign(block); @@ -2944,8 +2749,8 @@ static void material_panel_texture(Material *ma) mtex= ma->mtex[a]; if(mtex && mtex->tex) { if(ma->septex & (1<<a)) - uiDefButBitS(block, TOG, 1<<a, B_MATPRV_DRAW, " ", -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel"); - else uiDefIconButBitS(block, TOG, 1<<a, B_MATPRV_DRAW, ICON_CHECKBOX_HLT, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel"); + uiDefButBitS(block, TOG, 1<<a, B_MATPRV, " ", -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel"); + else uiDefIconButBitS(block, TOG, 1<<a, B_MATPRV, ICON_CHECKBOX_HLT, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel"); } } @@ -3077,7 +2882,7 @@ static void material_panel_tramir_yafray(Material *ma) /* absorption color */ uiDefBut(block, LABEL, 0, "Absorption Color", 10, 98, 150, 18, 0, 0.0, 0.0, 0, 0, ""); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 10, 38, 30, 58, &ma->YF_ar, 0, 0, 0, B_MATCOL, "transmit absorption color, white is no absorption"); + uiDefButF(block, COL, B_MATPRV, "", 10, 38, 30, 58, &ma->YF_ar, 0, 0, 0, B_MATCOL, "transmit absorption color, white is no absorption"); uiDefButF(block, NUMSLI, B_MATPRV, "aR ", 40, 78, 120, 18, &ma->YF_ar, 1e-7f, 1.0, B_MATCOL, 0, ""); uiDefButF(block, NUMSLI, B_MATPRV, "aG ", 40, 58, 120, 18, &ma->YF_ag, 1e-7f, 1.0, B_MATCOL, 0, ""); uiDefButF(block, NUMSLI, B_MATPRV, "aB ", 40, 38, 120, 18, &ma->YF_ab, 1e-7f, 1.0, B_MATCOL, 0, ""); @@ -3123,7 +2928,7 @@ static void material_panel_shading(Material *ma) uiBlockSetCol(block, TH_BUT_SETTING1); uiBlockBeginAlign(block); - uiDefButBitI(block, TOG, MA_HALO_FLARE, B_MATPRV_DRAW, "Flare",245,142,65,28, &(ma->mode), 0, 0, 0, 0, "Renders halo as a lensflare"); + uiDefButBitI(block, TOG, MA_HALO_FLARE, B_MATPRV, "Flare",245,142,65,28, &(ma->mode), 0, 0, 0, 0, "Renders halo as a lensflare"); uiDefButBitI(block, TOG, MA_HALO_RINGS, B_MATPRV, "Rings", 245,123,65, 18, &(ma->mode), 0, 0, 0, 0, "Renders rings over halo"); uiDefButBitI(block, TOG, MA_HALO_LINES, B_MATPRV, "Lines", 245,104,65, 18, &(ma->mode), 0, 0, 0, 0, "Renders star shaped lines over halo"); uiDefButBitI(block, TOG, MA_STAR, B_MATPRV, "Star", 245,85,65, 18, &(ma->mode), 0, 0, 0, 0, "Renders halo as a star"); @@ -3138,7 +2943,7 @@ static void material_panel_shading(Material *ma) char *str2= "Specular Shader%t|CookTorr %x0|Phong %x1|Blinn %x2|Toon %x3|WardIso %x4"; /* diff shader buttons */ - uiDefButS(block, MENU, B_MATPRV_DRAW, str1, 9, 180,78,19, &(ma->diff_shader), 0.0, 0.0, 0, 0, "Creates a diffuse shader"); + uiDefButS(block, MENU, B_MATPRV, str1, 9, 180,78,19, &(ma->diff_shader), 0.0, 0.0, 0, 0, "Creates a diffuse shader"); uiBlockBeginAlign(block); uiDefButF(block, NUMSLI, B_MATPRV, "Ref ", 90,180,150,19, &(ma->ref), 0.0, 1.0, 0, 0, "Sets the amount of reflection"); @@ -3157,7 +2962,7 @@ static void material_panel_shading(Material *ma) uiBlockEndAlign(block); /* spec shader buttons */ - uiDefButS(block, MENU, B_MATPRV_DRAW, str2, 9,120,77,19, &(ma->spec_shader), 0.0, 0.0, 0, 0, "Creates a specular shader"); + uiDefButS(block, MENU, B_MATPRV, str2, 9,120,77,19, &(ma->spec_shader), 0.0, 0.0, 0, 0, "Creates a specular shader"); uiBlockBeginAlign(block); uiDefButF(block, NUMSLI, B_MATPRV, "Spec ", 90,120,150,19, &(ma->spec), 0.0, 2.0, 0, 0, "Sets the degree of specularity"); @@ -3302,13 +3107,13 @@ static void material_panel_layers(Material *ma) if(ml->flag & ML_ACTIVE) break; if(ml==NULL) - but=uiDefIconBut(block, BUT, B_MATPRV_DRAW, ICON_MATERIAL, 10, 180, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate base Material"); - else but=uiDefBut(block, BUT, B_MATPRV_DRAW, " ", 10, 180, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate base Material"); + but=uiDefIconBut(block, BUT, B_MATPRV, ICON_MATERIAL, 10, 180, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate base Material"); + else but=uiDefBut(block, BUT, B_MATPRV, " ", 10, 180, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate base Material"); uiButSetFunc(but, matlayer_active, ma, NULL); /* Enable/disable for current material */ if(ma->ml_flag & ML_RENDER) - uiDefIconButBitS(block, TOG, ML_RENDER, B_MATPRV_DRAW, ICON_CHECKBOX_HLT, 30, 180, 20, 20, &ma->ml_flag, 0.0, 0.0, 0, 0, "Enable or disable base Material"); + uiDefIconButBitS(block, TOG, ML_RENDER, B_MATPRV, ICON_CHECKBOX_HLT, 30, 180, 20, 20, &ma->ml_flag, 0.0, 0.0, 0, 0, "Enable or disable base Material"); else uiDefButBitS(block, TOG, ML_RENDER, B_MATPRV, " ", 30, 180, 20, 20, &ma->ml_flag, 0.0, 0.0, 0, 0, "Enable or disable base Material"); uiBlockEndAlign(block); @@ -3328,13 +3133,13 @@ static void material_panel_layers(Material *ma) /* Active button */ uiBlockBeginAlign(block); if(ml->flag & ML_ACTIVE) - but=uiDefIconBut(block, BUT, B_MATPRV_DRAW, ICON_MATERIAL, 10, yco, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate this layer"); - else but=uiDefBut(block, BUT, B_MATPRV_DRAW, " ", 10, yco, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate this layer"); + but=uiDefIconBut(block, BUT, B_MATPRV, ICON_MATERIAL, 10, yco, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate this layer"); + else but=uiDefBut(block, BUT, B_MATPRV, " ", 10, yco, 20, 20, NULL, 0.0, 0.0, 0, 0, "Activate this layer"); uiButSetFunc(but, matlayer_active, ma, ml); /* enable/disable button */ if(ml->flag & ML_RENDER) - uiDefIconButBitS(block, TOG, ML_RENDER, B_MATPRV_DRAW, ICON_CHECKBOX_HLT, 30, yco, 20, 20, &ml->flag, 0.0, 0.0, 0, 0, "Enable or disable this layer"); + uiDefIconButBitS(block, TOG, ML_RENDER, B_MATPRV, ICON_CHECKBOX_HLT, 30, yco, 20, 20, &ml->flag, 0.0, 0.0, 0, 0, "Enable or disable this layer"); else uiDefButBitS(block, TOG, ML_RENDER, B_MATPRV, " ", 30, yco, 20, 20, &ml->flag, 0.0, 0.0, 0, 0, "Enable or disable this layer"); uiBlockBeginAlign(block); @@ -3369,13 +3174,13 @@ static void material_panel_layers(Material *ma) uiButSetFunc(but, matlayer_add, ma, ml); /* move up/down/delete */ - but = uiDefIconBut(block, BUT, B_MATPRV_DRAW, VICON_MOVE_UP, 250, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move layer up"); + but = uiDefIconBut(block, BUT, B_MATPRV, VICON_MOVE_UP, 250, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move layer up"); uiButSetFunc(but, matlayer_moveUp, ma, ml); - but = uiDefIconBut(block, BUT, B_MATPRV_DRAW, VICON_MOVE_DOWN, 270, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move layer down"); + but = uiDefIconBut(block, BUT, B_MATPRV, VICON_MOVE_DOWN, 270, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move layer down"); uiButSetFunc(but, matlayer_moveDown, ma, ml); - but = uiDefIconBut(block, BUT, B_MATPRV_DRAW, VICON_X, 290, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete material layer"); + but = uiDefIconBut(block, BUT, B_MATPRV, VICON_X, 290, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete material layer"); uiButSetFunc(but, matlayer_del, ma, ml); /* blend slider and operation */ @@ -3401,6 +3206,36 @@ static void material_panel_layers(Material *ma) } +static void material_panel_nodes(Material *ma) +{ + Material *nodema; + bNode *node; + uiBlock *block; + char str[64]; + + block= uiNewBlock(&curarea->uiblocks, "material_panel_nodes", UI_EMBOSS, UI_HELV, curarea->win); + uiNewPanelTabbed("Preview", "Material"); + if(uiNewPanel(curarea, block, "Nodes", "Material", 0, 0, 318, 204)==0) return; + + uiDefButC(block, TOG, B_MAT_USENODES, "Use Nodes", 10,180,150,20, &ma->use_nodes, 0.0f, 0.0f, 0, 0, ""); + nodema= get_active_matlayer(ma); + if(nodema) { + sprintf(str, "Active: %s", nodema->id.name+2); + uiDefBut(block, LABEL, B_NOP, str, 160,180,150,20, NULL, 0.0f, 0.0f, 0, 0, ""); + } + node= nodeGetActive(ma->nodetree); + if(node==NULL) return; + + if(node->typeinfo->butfunc) { + rctf rct; + rct.xmin= 10.0f; + rct.xmax= rct.xmin+node->typeinfo->width; + rct.ymax= 155.0; + rct.ymin= rct.ymax - (float)node->typeinfo->butfunc(NULL, node, NULL); + node->typeinfo->butfunc(block, node, &rct); + } +} + static void material_panel_ramps(Material *ma) { @@ -3436,7 +3271,7 @@ static void material_panel_ramps(Material *ma) methodc= &ma->rampblend_spec; facp= &ma->rampfac_spec; } - draw_colorband_buts(block, coba, -35, B_MATPRV); // aligns with previous button + draw_colorband_buts(block, coba, 10, 50, B_MATPRV); // aligns with previous button uiDefBut(block, LABEL, 0, "Input",10,30,90,20, NULL, 0, 0, 0, 0, ""); uiDefBut(block, LABEL, 0, "Method",100,30,90,20, NULL, 0, 0, 0, 0, ""); @@ -3554,9 +3389,9 @@ static void material_panel_material(Object *ob, Material *ma) } uiBlockSetCol(block, TH_AUTO); uiBlockBeginAlign(block); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 8,97,72,20, &(ma->r), 0, 0, 0, B_MATCOL, ""); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 8,77,72,20, &(ma->specr), 0, 0, 0, B_SPECCOL, ""); - uiDefButF(block, COL, B_MATPRV_DRAW, "", 8,57,72,20, &(ma->mirr), 0, 0, 0, B_MIRCOL, ""); + uiDefButF(block, COL, B_MATPRV, "", 8,97,72,20, &(ma->r), 0, 0, 0, B_MATCOL, ""); + uiDefButF(block, COL, B_MATPRV, "", 8,77,72,20, &(ma->specr), 0, 0, 0, B_SPECCOL, ""); + uiDefButF(block, COL, B_MATPRV, "", 8,57,72,20, &(ma->mirr), 0, 0, 0, B_MIRCOL, ""); uiBlockBeginAlign(block); if(ma->mode & MA_HALO) { @@ -3609,6 +3444,8 @@ static void material_panel_preview(Material *ma) if(uiNewPanel(curarea, block, "Preview", "Material", 0, 0, 318, 204)==0) return; if(ma) { + G.buts->lockpoin= ma; /* BIF_previewdraw callback will read it */ + uiBlockSetDrawExtraFunc(block, BIF_previewdraw); // label to force a boundbox for buttons not to be centered @@ -3646,6 +3483,7 @@ void material_panels() if(ma) { material_panel_layers(ma); + material_panel_nodes(ma); ma= get_active_matlayer(ma); if(ma) { @@ -3827,7 +3665,7 @@ void clever_numbuts_buts() la->r = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ; la->g = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ; la->b = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ; - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } break; case TAB_SHADING_WORLD: @@ -3847,7 +3685,7 @@ void clever_numbuts_buts() wo->zenr = (rgb[0]/255.0 >= 0.0 && rgb[0]/255.0 <= 1.0 ? rgb[0]/255.0 : 0.0) ; wo->zeng = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ; wo->zenb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ; - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); } break; @@ -3880,7 +3718,7 @@ void clever_numbuts_buts() ma->mirg = (rgb[1]/255.0 >= 0.0 && rgb[1]/255.0 <= 1.0 ? rgb[1]/255.0 : 0.0) ; ma->mirb = (rgb[2]/255.0 >= 0.0 && rgb[2]/255.0 <= 1.0 ? rgb[2]/255.0 : 0.0) ; - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } break; } diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c index 8364424674b..d9a85da601e 100644 --- a/source/blender/src/drawimage.c +++ b/source/blender/src/drawimage.c @@ -1034,7 +1034,7 @@ void drawimagespace(ScrArea *sa, void *spacedata) glPixelZoom((float)sima->zoom, (float)sima->zoom); if(sima->flag & SI_EDITTILE) { - glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->rect); + glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); glPixelZoom(1.0, 1.0); @@ -1079,14 +1079,14 @@ void drawimagespace(ScrArea *sa, void *spacedata) /* rect= ibuf->rect; */ for(sy= 0; sy+dy<=ibuf->y; sy+= dy) { for(sx= 0; sx+dx<=ibuf->x; sx+= dx) { - glaDrawPixelsSafe(x1+sx*sima->zoom, y1+sy*sima->zoom, dx, dy, rect); + glaDrawPixelsSafe(x1+sx*sima->zoom, y1+sy*sima->zoom, dx, dy, GL_UNSIGNED_BYTE, rect); } } MEM_freeN(rect); } else - glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->rect); + glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); if(Gip.current == IMAGEPAINT_CLONE) { int w, h; @@ -1103,7 +1103,7 @@ void drawimagespace(ScrArea *sa, void *spacedata) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glaDrawPixelsSafe(x1 + offx, y1 + offy, w, h, clonerect); + glaDrawPixelsSafe(x1 + offx, y1 + offy, w, h, GL_UNSIGNED_BYTE, clonerect); glDisable(GL_BLEND); MEM_freeN(clonerect); diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 1c933ed6743..1ca7c1f82c8 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -42,6 +42,7 @@ #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_screen_types.h" +#include "DNA_texture_types.h" #include "DNA_userdef_types.h" #include "BKE_global.h" @@ -51,7 +52,9 @@ #include "BKE_utildefines.h" #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_interface.h" +#include "BIF_interface_icons.h" #include "BIF_language.h" #include "BIF_mywindow.h" #include "BIF_resources.h" @@ -64,147 +67,324 @@ #include "BMF_Api.h" #include "blendef.h" +#include "butspace.h" #include "interface.h" /* urm... for rasterpos_safe, roundbox */ +#include "mydevice.h" #include "MEM_guardedalloc.h" -/* ************** Draw callbacks *********** */ +static void snode_drawstring(SpaceNode *snode, char *str, int okwidth) +{ + char drawstr[NODE_MAXSTR]; + int width; + + if(str[0]==0) return; + + BLI_strncpy(drawstr, str, NODE_MAXSTR); + width= snode->aspect*BIF_GetStringWidth(snode->curfont, drawstr, 0); + if(width > okwidth) { + int len= strlen(drawstr)-1; + + while(width > okwidth && len>=0) { + drawstr[len]= 0; + + width= snode->aspect*BIF_GetStringWidth(snode->curfont, drawstr, 0); + len--; + } + if(len==0) return; + } + BIF_DrawString(snode->curfont, drawstr, 0); + +} + +/* ************** Socket callbacks *********** */ + +/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ +static uiBlock *socket_value_menu(void *sock_v) +{ + bNodeSocket *sock= sock_v; + uiBlock *block; + char name[NODE_MAXSTR]; + + /* don't add new block to a listbase if caller is LABEL button */ + block= uiNewBlock(NULL, "socket menu", UI_EMBOSS, UI_HELV, curarea->win); + + /* use this for a fake extra empy space around the buttons */ + uiDefBut(block, LABEL, 0, "", -4, -4, 188, 28, NULL, 0, 0, 0, 0, ""); + + BLI_strncpy(name, sock->name, NODE_MAXSTR-1); + strcat(name, " "); + uiDefButF(block, NUMSLI, 0, name, 0,0,180,20, sock->ns.vec, 0.0, 1.0, 10, 0, ""); + + uiBlockSetDirection(block, UI_TOP); + + return block; +} +/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ +static uiBlock *socket_vector_menu(void *sock_v) +{ + bNodeSocket *sock= sock_v; + uiBlock *block; + + /* don't add new block to a listbase if caller is LABEL button */ + block= uiNewBlock(NULL, "socket menu", UI_EMBOSS, UI_HELV, curarea->win); + + /* use this for a fake extra empy space around the buttons */ + uiDefBut(block, LABEL, 0, "", -4, -4, 188, 68, NULL, 0, 0, 0, 0, ""); + + uiBlockBeginAlign(block); + uiDefButF(block, NUMSLI, 0, "X ", 0,40,180,20, sock->ns.vec, -1.0, 1.0, 10, 0, ""); + uiDefButF(block, NUMSLI, 0, "Y ", 0,20,180,20, sock->ns.vec+1, -1.0, 1.0, 10, 0, ""); + uiDefButF(block, NUMSLI, 0, "Z ", 0,0,180,20, sock->ns.vec+2, -1.0, 1.0, 10, 0, ""); + + uiBlockSetDirection(block, UI_TOP); + + return block; +} -static void node_shader_draw_value(SpaceNode *snode, bNode *node) +static uiBlock *socket_color_menu(void *sock_v) { + bNodeSocket *sock= sock_v; + uiBlock *block; + + /* don't add new block to a listbase if caller is LABEL button */ + block= uiNewBlock(NULL, "socket menu", UI_EMBOSS, UI_HELV, curarea->win); + + /* use this for a fake extra empy space around the buttons */ + uiDefBut(block, LABEL, 0, "", -4, -4, 188, 68, NULL, 0, 0, 0, 0, ""); + + uiBlockBeginAlign(block); + uiDefButF(block, NUMSLI, 0, "R ", 0,40,180,20, sock->ns.vec, 0.0, 1.0, 10, 0, ""); + uiDefButF(block, NUMSLI, 0, "G ", 0,20,180,20, sock->ns.vec+1, 0.0, 1.0, 10, 0, ""); + uiDefButF(block, NUMSLI, 0, "B ", 0,0,180,20, sock->ns.vec+2, 0.0, 1.0, 10, 0, ""); + + uiBlockSetDirection(block, UI_TOP); - if(snode->block) { + return block; +} + +static void node_ID_title_cb(void *node_v, void *unused_v) +{ + bNode *node= node_v; + + if(node->id) + BLI_strncpy(node->name, node->id->name+2, 21); +} + +/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */ + +static int node_shader_buts_material(uiBlock *block, bNode *node, rctf *butr) +{ + if(block) { uiBut *bt; + float dx= (butr->xmax-butr->xmin)/3.0f; - bt= uiDefButF(snode->block, NUM, B_NODE_EXEC, "", - node->prv.xmin, node->prv.ymin, node->prv.xmax-node->prv.xmin, node->prv.ymax-node->prv.ymin, - node->ns.vec, 0.0f, 1.0f, 100, 2, ""); + uiBlockBeginAlign(block); + bt= uiDefIDPoinBut(block, test_matpoin_but, ID_MA, B_NODE_EXEC, "", + butr->xmin, butr->ymin+19.0f, butr->xmax-butr->xmin, 19.0f, + &node->id, ""); + uiButSetFunc(bt, node_ID_title_cb, node, NULL); - } + uiDefButBitS(block, TOG, SH_NODE_MAT_DIFF, B_NODE_EXEC, "Diff", + butr->xmin, butr->ymin, dx, 19.0f, + &node->custom1, 0, 0, 0, 0, "Material Node outputs Diffuse"); + uiDefButBitS(block, TOG, SH_NODE_MAT_SPEC, B_NODE_EXEC, "Spec", + butr->xmin+dx, butr->ymin, dx, 19.0f, + &node->custom1, 0, 0, 0, 0, "Material Node outputs Specular"); + uiDefButBitS(block, TOG, SH_NODE_MAT_NEG, B_NODE_EXEC, "Neg Normal", + butr->xmin+2.0f*dx, butr->ymin, dx, 19.0f, + &node->custom1, 0, 0, 0, 0, "Material Node uses inverted Normal"); + uiBlockEndAlign(block); + + } + return 38; } -static void node_shader_draw_rgb(SpaceNode *snode, bNode *node) +static int node_shader_buts_texture(uiBlock *block, bNode *node, rctf *butr) { - - if(snode->block) { + if(block) { + uiBut *bt; - /* enforce square box drawing */ - uiBlockSetEmboss(snode->block, UI_EMBOSSP); + bt= uiDefIDPoinBut(block, test_texpoin_but, ID_TE, B_NODE_EXEC, "", + butr->xmin, butr->ymin, butr->xmax-butr->xmin, 19.0f, + &node->id, ""); + uiButSetFunc(bt, node_ID_title_cb, node, NULL); - uiDefButF(snode->block, HSVCUBE, B_NODE_EXEC, "", - node->prv.xmin, node->prv.ymin, node->prv.xmax-node->prv.xmin, 10.0f, - node->ns.vec, 0.0f, 1.0f, 3, 0, ""); - uiDefButF(snode->block, HSVCUBE, B_NODE_EXEC, "", - node->prv.xmin, node->prv.ymin+14.0f, node->prv.xmax-node->prv.xmin, node->prv.ymax-node->prv.ymin-14.0f, - node->ns.vec, 0.0f, 1.0f, 2, 0, ""); + } + return 19; +} + +static int node_shader_buts_value(uiBlock *block, bNode *node, rctf *butr) +{ + if(block) { + bNodeSocket *sock= node->outputs.first; /* first socket stores value */ - uiDefButF(snode->block, COL, B_NOP, "", - node->prv.xmin, node->prv.ymax+10.0f, node->prv.xmax-node->prv.xmin, 15.0f, - node->ns.vec, 0.0, 0.0, -1, 0, ""); - /* the -1 above prevents col button to popup a color picker */ + uiDefButF(block, NUM, B_NODE_EXEC, "", + butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20.0f, + sock->ns.vec, 0.0f, 1.0f, 10, 2, ""); - uiBlockSetEmboss(snode->block, UI_EMBOSS); } + return 20; } -static void node_shader_draw_show_rgb(SpaceNode *snode, bNode *node) +static int node_shader_buts_rgb(uiBlock *block, bNode *node, rctf *butr) { - - if(snode->block) { - + if(block) { + bNodeSocket *sock= node->outputs.first; /* first socket stores value */ + /* enforce square box drawing */ - uiBlockSetEmboss(snode->block, UI_EMBOSSP); + uiBlockSetEmboss(block, UI_EMBOSSP); + + uiDefButF(block, HSVCUBE, B_NODE_EXEC, "", + butr->xmin, butr->ymin, butr->xmax-butr->xmin, 12.0f, + sock->ns.vec, 0.0f, 1.0f, 3, 0, ""); + uiDefButF(block, HSVCUBE, B_NODE_EXEC, "", + butr->xmin, butr->ymin+15.0f, butr->xmax-butr->xmin, butr->ymax-butr->ymin -15.0f -15.0f, + sock->ns.vec, 0.0f, 1.0f, 2, 0, ""); + uiDefButF(block, COL, B_NOP, "", + butr->xmin, butr->ymax-12.0f, butr->xmax-butr->xmin, 12.0f, + sock->ns.vec, 0.0, 0.0, -1, 0, ""); + /* the -1 above prevents col button to popup a color picker */ + + uiBlockSetEmboss(block, UI_EMBOSS); + } + return 30 + (int)(node->width-NODE_DY); +} + +static void node_but_title_cb(void *node_v, void *but_v) +{ + bNode *node= node_v; + uiBut *bt= but_v; + BLI_strncpy(node->name, bt->drawstr, NODE_MAXSTR); +} + +static int node_shader_buts_mix_rgb(uiBlock *block, bNode *node, rctf *butr) +{ + if(block) { + uiBut *bt; + bNodeSocket *sock= node->inputs.first; /* first socket stores "fac" */ - uiDefButF(snode->block, COL, B_NOP, "", - node->prv.xmin, node->prv.ymin-NODE_DY, node->prv.xmax-node->prv.xmin, NODE_DY, - node->ns.vec, 0.0f, 0.0f, -1, 0, ""); - /* the -1 above prevents col button to popup a color picker */ - uiBlockSetEmboss(snode->block, UI_EMBOSS); + uiBlockBeginAlign(block); + /* blend type */ + bt=uiDefButS(block, MENU, B_NODE_EXEC, "Mix %x0|Add %x1|Subtract %x3|Multiply %x2|Screen %x4|Divide %x5|Difference %x6|Darken %x7|Lighten %x8", + butr->xmin, butr->ymin+20.0f, butr->xmax-butr->xmin, 20.0f, + &node->custom1, 0, 0, 0, 0, ""); + uiButSetFunc(bt, node_but_title_cb, node, bt); + /* value */ + uiDefButF(block, NUM, B_NODE_EXEC, "", + butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20.0f, + sock->ns.vec, 0.0f, 1.0f, 10, 2, ""); + uiBlockEndAlign(block); } + return 40; } +static int node_shader_buts_valtorgb(uiBlock *block, bNode *node, rctf *butr) +{ + if(block && (node->flag & NODE_OPTIONS)) { + if(node->storage) { + draw_colorband_buts_small(block, node->storage, butr, B_NODE_EXEC); + } + } + return 40; +} -/* exported to editnode.c */ -void node_shader_set_drawfunc(bNode *node) +/* only once called */ +static void node_shader_set_butfunc(bNodeType *ntype) { - switch(node->type) { - case SH_NODE_TEST: - node->drawfunc= NULL; + switch(ntype->type) { + case SH_NODE_MATERIAL: + ntype->butfunc= node_shader_buts_material; + break; + case SH_NODE_TEXTURE: + ntype->butfunc= node_shader_buts_texture; break; case SH_NODE_VALUE: - node->drawfunc= node_shader_draw_value; + ntype->butfunc= node_shader_buts_value; break; case SH_NODE_RGB: - node->drawfunc= node_shader_draw_rgb; - break; - case SH_NODE_SHOW_RGB: - node->drawfunc= node_shader_draw_show_rgb; + ntype->butfunc= node_shader_buts_rgb; break; case SH_NODE_MIX_RGB: - node->drawfunc= NULL; + ntype->butfunc= node_shader_buts_mix_rgb; + break; + case SH_NODE_VALTORGB: + ntype->butfunc= node_shader_buts_valtorgb; break; + default: + ntype->butfunc= NULL; } } -/* ******* init draw callbacks for all tree types ************* */ +/* ******* init draw callbacks for all tree types, only called in usiblender.c, once ************* */ -static void ntree_init_callbacks(bNodeTree *ntree) +void init_node_butfuncs(void) { - bNode *node; + bNodeType **typedefs; - for(node= ntree->nodes.first; node; node= node->next) { - if(ntree->type==NTREE_SHADER) - node_shader_set_drawfunc(node); + /* shader nodes */ + typedefs= node_all_shaders; /* BKE_node.h */ + while( *typedefs) { + node_shader_set_butfunc(*typedefs); + typedefs++; } - ntree->init |= NTREE_DRAW_SET; -} +} /* ************** Generic drawing ************** */ static void draw_nodespace_grid(SpaceNode *snode) { -// float fac, step= 20.0f; - + float start, step= 25.0f; + /* window is 'pixel size', like buttons */ - BIF_ThemeColorShade(TH_BACK, 10); + BIF_ThemeColorShade(TH_BACK, -10); - glRectf(0.0f, 0.0f, curarea->winx, curarea->winy); -} - + start= snode->v2d.cur.xmin -fmod(snode->v2d.cur.xmin, step); + + glBegin(GL_LINES); + for(; start<snode->v2d.cur.xmax; start+=step) { + glVertex2f(start, snode->v2d.cur.ymin); + glVertex2f(start, snode->v2d.cur.ymax); + } -/* get from assigned ID */ -static void get_nodetree(SpaceNode *snode) -{ - /* note: once proper coded, remove free from freespacelist() */ - if(snode->nodetree==NULL) { - snode->nodetree= MEM_callocN(sizeof(bNodeTree), "new node tree"); - } + start= snode->v2d.cur.ymin -fmod(snode->v2d.cur.ymin, step); + for(; start<snode->v2d.cur.ymax; start+=step) { + glVertex2f(snode->v2d.cur.xmin, start); + glVertex2f(snode->v2d.cur.xmax, start); + } + glEnd(); } -static void nodeshadow(rctf *rct, int select) + +static void nodeshadow(rctf *rct, float radius, int select) { - int a; + float rad; + float a; char alpha= 2; - uiSetRoundBox(15); glEnable(GL_BLEND); - if(select) a= 10; else a=7; - for(; a>0; a-=1) { + if(radius > (rct->ymax-rct->ymin-10.0f)/2.0f) + rad= (rct->ymax-rct->ymin-10.0f)/2.0f; + else + rad= radius; + + if(select) a= 10.0f; else a= 7.0f; + for(; a>0.0f; a-=1.0f) { /* alpha ranges from 2 to 20 or so */ glColor4ub(0, 0, 0, alpha); alpha+= 2; - gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, 8.0f+a); + gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a); } /* outline emphasis */ glEnable( GL_LINE_SMOOTH ); glColor4ub(0, 0, 0, 100); - gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, 8.0f); + gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius); glDisable( GL_LINE_SMOOTH ); glDisable(GL_BLEND); @@ -230,7 +410,9 @@ static void socket_circle_draw(float x, float y, float size, int type, int selec int a; if(select==0) { - if(type==SOCK_VALUE) + if(type==-1) + glColor3ub(0, 0, 0); + else if(type==SOCK_VALUE) glColor3ub(160, 160, 160); else if(type==SOCK_VECTOR) glColor3ub(100, 100, 200); @@ -266,54 +448,288 @@ static void socket_circle_draw(float x, float y, float size, int type, int selec glDisable(GL_BLEND); } -static int node_basis_draw(SpaceNode *snode, bNode *node) +/* not a callback */ +static void node_draw_preview(bNodePreview *preview, rctf *prv) +{ + float scale= (prv->xmax-prv->xmin)/((float)preview->xsize); + + glPixelZoom(scale, scale); + glEnable(GL_BLEND); + + glaDrawPixelsTex(prv->xmin, prv->ymin, preview->xsize, preview->ysize, GL_FLOAT, preview->rect); + + glDisable(GL_BLEND); + glPixelZoom(1.0f, 1.0f); + +} + +/* based on settings in node, sets drawing rect info */ +static void node_update(bNode *node) +{ + bNodeSocket *nsock; + float dy= node->locy; + + if(node->flag & NODE_HIDDEN) { + float rad, drad; + + node->totr.xmin= node->locx; + node->totr.xmax= node->locx + 3*HIDDEN_RAD; + node->totr.ymax= node->locy; + node->totr.ymin= node->locy - 2*HIDDEN_RAD; + + /* output connectors */ + rad=drad= M_PI/(1.0f + (float)BLI_countlist(&node->outputs)); + + for(nsock= node->outputs.first; nsock; nsock= nsock->next, rad+= drad) { + nsock->locx= node->totr.xmax - HIDDEN_RAD + sin(rad)*HIDDEN_RAD; + nsock->locy= node->totr.ymin + HIDDEN_RAD + cos(rad)*HIDDEN_RAD; + } + + /* input connectors */ + rad=drad= - M_PI/(1.0f + (float)BLI_countlist(&node->inputs)); + + for(nsock= node->inputs.first; nsock; nsock= nsock->next, rad+= drad) { + nsock->locx= node->totr.xmin + HIDDEN_RAD + sin(rad)*HIDDEN_RAD; + nsock->locy= node->totr.ymin + HIDDEN_RAD + cos(rad)*HIDDEN_RAD; + } + } + else { + /* header */ + dy-= NODE_DY; + + /* output connectors */ + for(nsock= node->outputs.first; nsock; nsock= nsock->next) { + nsock->locx= node->locx + node->width; + nsock->locy= dy - NODE_DYS; + dy-= NODE_DY; + } + + node->prvr.xmin= node->butr.xmin= node->locx + NODE_DYS; + node->prvr.xmax= node->butr.xmax= node->locx + node->width- NODE_DYS; + + /* preview rect? */ + if(node->flag & NODE_PREVIEW) { + dy-= NODE_DYS/2; + node->prvr.ymax= dy; + node->prvr.ymin= dy-(node->width-NODE_DY); + dy= node->prvr.ymin - NODE_DYS/2; + } + + /* buttons rect? */ + if((node->flag & NODE_OPTIONS) && node->typeinfo->butfunc) { + dy-= NODE_DYS/2; + node->butr.ymax= dy; + node->butr.ymin= dy - (float)node->typeinfo->butfunc(NULL, node, NULL); + dy= node->butr.ymin - NODE_DYS/2; + } + + /* input connectors */ + for(nsock= node->inputs.first; nsock; nsock= nsock->next) { + nsock->locx= node->locx; + nsock->locy= dy - NODE_DYS; + dy-= NODE_DY; + } + + node->totr.xmin= node->locx; + node->totr.xmax= node->locx + node->width; + node->totr.ymax= node->locy; + node->totr.ymin= dy; + } +} + +static void node_scaling_widget(int color_id, float aspect, float xmin, float ymin, float xmax, float ymax) +{ + float dx; + float dy; + + dx= 0.5f*(xmax-xmin); + dy= 0.5f*(ymax-ymin); + + BIF_ThemeColorShade(color_id, +30); + fdrawline(xmin, ymin, xmax, ymax); + fdrawline(xmin+dx, ymin, xmax, ymax-dy); + + BIF_ThemeColorShade(color_id, -10); + fdrawline(xmin, ymin+aspect, xmax, ymax+aspect); + fdrawline(xmin+dx, ymin+aspect, xmax, ymax-dy+aspect); +} + +static int node_get_colorid(bNode *node) +{ + if(node->typeinfo->nclass==NODE_CLASS_INPUT) + return TH_NODE_IN_OUT; + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + if(node->flag & NODE_DO_OUTPUT) + return TH_NODE_IN_OUT; + else + return TH_NODE; + } + if(node->typeinfo->nclass==NODE_CLASS_GENERATOR) + return TH_NODE_GENERATOR; + if(node->typeinfo->nclass==NODE_CLASS_OPERATOR) + return TH_NODE_OPERATOR; + return TH_NODE; +} + +static void node_basis_draw(SpaceNode *snode, bNode *node) { bNodeSocket *sock; - rctf *rct= &node->tot; - float slen; - int trans= (U.transopts & USER_TR_BUTTONS); + rctf *rct= &node->totr; + float slen, iconofs; + int ofs, color_id= node_get_colorid(node); - nodeshadow(rct, node->flag & SELECT); + uiSetRoundBox(15-4); + nodeshadow(rct, BASIS_RAD, node->flag & SELECT); - BIF_ThemeColorShade(TH_HEADER, 0); + /* header */ + BIF_ThemeColorShade(color_id, 0); uiSetRoundBox(3); - uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, 8); + uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD); - BIF_ThemeColorShade(TH_HEADER, 20); - uiSetRoundBox(12); - uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, 8); + /* open/close entirely? */ +// ui_draw_tria_icon(rct->xmin+6.0f, rct->ymax-NODE_DY+5.0f, snode->aspect, 'h'); - ui_rasterpos_safe(rct->xmin+4.0f, rct->ymax-NODE_DY+5.0f, snode->aspect); + /* show/hide icons */ + iconofs= rct->xmax; + if(node->typeinfo->flag & NODE_PREVIEW) { + int icon_id; + + if(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT)) + icon_id= ICON_MATERIAL; + else + icon_id= ICON_MATERIAL_DEHLT; + iconofs-= 18.0f; + glEnable(GL_BLEND); + BIF_icon_set_aspect(icon_id, snode->aspect); + BIF_icon_draw_blended(iconofs, rct->ymax-NODE_DY+2, icon_id, 0, -50); + glDisable(GL_BLEND); + } + if(node->typeinfo->flag & NODE_OPTIONS) { + iconofs-= 18.0f; + glEnable(GL_BLEND); + BIF_icon_set_aspect(ICON_BUTS, snode->aspect); + BIF_icon_draw_blended(iconofs, rct->ymax-NODE_DY+2, ICON_BUTS, 0, -50); + glDisable(GL_BLEND); + } + + /* title */ if(node->flag & SELECT) BIF_ThemeColor(TH_TEXT_HI); else BIF_ThemeColor(TH_TEXT); - BIF_DrawString(snode->curfont, node->name, trans); + ui_rasterpos_safe(rct->xmin+6.0f, rct->ymax-NODE_DY+5.0f, snode->aspect); + snode_drawstring(snode, node->name, (int)(iconofs - rct->xmin-6.0f)); + + /* body */ + BIF_ThemeColorShade(color_id, 20); + uiSetRoundBox(8); + uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, BASIS_RAD); + /* scaling indicator */ + node_scaling_widget(color_id, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect); + + /* outline active emphasis */ + if(node->flag & NODE_ACTIVE) { + glEnable(GL_BLEND); + glColor4ub(200, 200, 200, 140); + uiSetRoundBox(15-4); + gl_round_box(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD); + glDisable(GL_BLEND); + } + + /* socket inputs, label buttons */ for(sock= node->inputs.first; sock; sock= sock->next) { - socket_circle_draw(sock->locx, sock->locy, NODE_SOCK, sock->type, sock->flag & SELECT); + socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT); - BIF_ThemeColor(TH_TEXT); - ui_rasterpos_safe(sock->locx+8.0f, sock->locy-5.0f, snode->aspect); - BIF_DrawString(snode->curfont, sock->name, trans); + if(sock->type==SOCK_VALUE) { + uiBut *bt= uiDefBut(snode->block, LABEL, B_NODE_EXEC, sock->name, sock->locx+5.0f, sock->locy-10.0f, node->width-NODE_DY, NODE_DY, sock, 0, 0, 0, 0, ""); + bt->block_func= socket_value_menu; + } + else if(sock->type==SOCK_VECTOR) { + uiBut *bt= uiDefBut(snode->block, LABEL, B_NODE_EXEC, sock->name, sock->locx+5.0f, sock->locy-10.0f, node->width-NODE_DY, NODE_DY, sock, 0, 0, 0, 0, ""); + bt->block_func= socket_vector_menu; + } + else if(sock->type==SOCK_RGBA) { + uiBut *bt= uiDefBut(snode->block, LABEL, B_NODE_EXEC, sock->name, sock->locx+5.0f, sock->locy-10.0f, node->width-NODE_DY, NODE_DY, sock, 0, 0, 0, 0, ""); + bt->block_func= socket_color_menu; + } + else { + BIF_ThemeColor(TH_TEXT); + ui_rasterpos_safe(sock->locx+8.0f, sock->locy-5.0f, snode->aspect); + BIF_DrawString(snode->curfont, sock->name, 0); + } } + /* socket outputs */ for(sock= node->outputs.first; sock; sock= sock->next) { - socket_circle_draw(sock->locx, sock->locy, NODE_SOCK, sock->type, sock->flag & SELECT); + socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT); BIF_ThemeColor(TH_TEXT); - slen= snode->aspect*BIF_GetStringWidth(snode->curfont, sock->name, trans); + ofs= 0; + slen= snode->aspect*BIF_GetStringWidth(snode->curfont, sock->name, 0); + while(slen > node->width) { + ofs++; + slen= snode->aspect*BIF_GetStringWidth(snode->curfont, sock->name+ofs, 0); + } ui_rasterpos_safe(sock->locx-8.0f-slen, sock->locy-5.0f, snode->aspect); - BIF_DrawString(snode->curfont, sock->name, trans); + BIF_DrawString(snode->curfont, sock->name+ofs, 0); } - return 0; + /* preview */ + if(node->flag & NODE_PREVIEW) + if(node->preview) + node_draw_preview(node->preview, &node->prvr); + + /* buttons */ + if(node->flag & NODE_OPTIONS) + if(node->typeinfo->butfunc) + node->typeinfo->butfunc(snode->block, node, &node->butr); + } +void node_hidden_draw(SpaceNode *snode, bNode *node) +{ + bNodeSocket *sock; + rctf *rct= &node->totr; + int color_id= node_get_colorid(node); + + /* shadow */ + uiSetRoundBox(15); + nodeshadow(rct, HIDDEN_RAD, node->flag & SELECT); -static void node_draw_link(SpaceNode *snode, bNodeLink *link) + /* body */ + BIF_ThemeColorShade(color_id, 20); + uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, HIDDEN_RAD); + + /* outline active emphasis */ + if(node->flag & NODE_ACTIVE) { + glEnable(GL_BLEND); + glColor4ub(200, 200, 200, 140); + gl_round_box(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, HIDDEN_RAD); + glDisable(GL_BLEND); + } + + /* icon */ + if(node->id) { + glEnable(GL_BLEND); + BIF_icon_set_aspect(node->id->icon_id, snode->aspect); + BIF_icon_draw(rct->xmin+HIDDEN_RAD, -1.0f+rct->ymin+HIDDEN_RAD/2, node->id->icon_id); + glDisable(GL_BLEND); + } + + /* sockets */ + for(sock= node->inputs.first; sock; sock= sock->next) { + socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT); + } + + for(sock= node->outputs.first; sock; sock= sock->next) { + socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT); + } +} + +void node_draw_link(SpaceNode *snode, bNodeLink *link) { float vec[4][3]; float dist, spline_step, mx=0.0f, my=0.0f; @@ -358,7 +774,7 @@ static void node_draw_link(SpaceNode *snode, bNodeLink *link) vec[3][1]= my; } - dist= 0.5*VecLenf(vec[0], vec[3]); + dist= 0.5f*ABS(vec[0][0] - vec[3][0]); /* check direction later, for top sockets */ vec[1][0]= vec[0][0]+dist; @@ -414,15 +830,17 @@ void drawnodespace(ScrArea *sa, void *spacedata) draw_nodespace_grid(snode); /* nodes */ - get_nodetree(snode); /* editor context */ + + snode_set_context(snode); if(snode->nodetree) { bNode *node; bNodeLink *link; - if((snode->nodetree->init & NTREE_DRAW_SET)==0) - ntree_init_callbacks(snode->nodetree); - + /* for now, we set drawing coordinates on each redraw */ + for(node= snode->nodetree->nodes.first; node; node= node->next) + node_update(node); + /* node lines */ glEnable(GL_BLEND); glEnable( GL_LINE_SMOOTH ); @@ -437,8 +855,10 @@ void drawnodespace(ScrArea *sa, void *spacedata) for(node= snode->nodetree->nodes.first; node; node= node->next) { if(!(node->flag & SELECT)) { - node_basis_draw(snode, node); - if(node->drawfunc) node->drawfunc(snode, node); + if(node->flag & NODE_HIDDEN) + node_hidden_draw(snode, node); + else + node_basis_draw(snode, node); } } uiDrawBlock(snode->block); @@ -449,8 +869,10 @@ void drawnodespace(ScrArea *sa, void *spacedata) for(node= snode->nodetree->nodes.first; node; node= node->next) { if(node->flag & SELECT) { - node_basis_draw(snode, node); - if(node->drawfunc) node->drawfunc(snode, node); + if(node->flag & NODE_HIDDEN) + node_hidden_draw(snode, node); + else + node_basis_draw(snode, node); } } @@ -465,4 +887,10 @@ void drawnodespace(ScrArea *sa, void *spacedata) draw_area_emboss(sa); curarea->win_swap= WIN_BACK_OK; + + /* in the end, this is a delayed previewrender test, to allow buttons to be first */ + if(snode->flag & SNODE_DO_PREVIEW) { + addafterqueue(sa->win, RENDERPREVIEW, 1); + snode->flag &= ~SNODE_DO_PREVIEW; + } } diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c index c215a256b4e..ea39e172d7e 100644 --- a/source/blender/src/drawseq.c +++ b/source/blender/src/drawseq.c @@ -503,7 +503,7 @@ static void draw_image_seq(ScrArea *sa) glaDefine2DArea(&curarea->winrct); glPixelZoom(zoom, zoom); - glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->rect); + glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); glPixelZoom(1.0, 1.0); diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c index 03c8d62b25d..74e68ba5cb1 100644 --- a/source/blender/src/drawview.c +++ b/source/blender/src/drawview.c @@ -435,7 +435,7 @@ static void draw_bgpic(void) glaDefine2DArea(&curarea->winrct); glPixelZoom(zoomx, zoomy); - glaDrawPixelsSafe(x1, y1, ima->ibuf->x, ima->ibuf->y, bgpic->rect); + glaDrawPixelsSafe(x1, y1, ima->ibuf->x, ima->ibuf->y, GL_UNSIGNED_BYTE, bgpic->rect); glPixelZoom(1.0, 1.0); glMatrixMode(GL_PROJECTION); diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c index 58edc4a817b..3d0bee6f080 100644 --- a/source/blender/src/edit.c +++ b/source/blender/src/edit.c @@ -129,12 +129,12 @@ void circle_selectCB(select_CBfunc func); /* local protos ---------------*/ void snap_curs_to_firstsel(void); - -int get_border(rcti *rect, short col) +/* flag==2 only border, flag==3 cross+border */ +int get_border(rcti *rect, short flag) { float dvec[4], fac1, fac2; int retval=1; - unsigned short event; + unsigned short event= 0; short mval[2], mvalo[4], val, x1, y1; char str[64]; @@ -153,56 +153,59 @@ int get_border(rcti *rect, short col) persp(PERSP_WIN); initgrabz(0.0, 0.0, 0.0); - getmouseco_areawin(mvalo); - - /* draws the selection initial cross */ - sdrawXORline4(0, 0, mvalo[1], curarea->winx, mvalo[1]); - sdrawXORline4(1, mvalo[0], 0, mvalo[0], curarea->winy); - glFlush(); - - while(TRUE) { - - /* selection loop while mouse pressed */ - getmouseco_areawin(mval); + if(flag & 1) { + getmouseco_areawin(mvalo); - if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) { + /* draws the selection initial cross */ + sdrawXORline4(0, 0, mvalo[1], curarea->winx, mvalo[1]); + sdrawXORline4(1, mvalo[0], 0, mvalo[0], curarea->winy); + glFlush(); + + while(TRUE) { + + /* selection loop while mouse pressed */ + getmouseco_areawin(mval); + + if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) { - /* aiming cross */ - sdrawXORline4(0, 0, mval[1], curarea->winx, mval[1]); - sdrawXORline4(1, mval[0], 0, mval[0], curarea->winy); - glFlush(); + /* aiming cross */ + sdrawXORline4(0, 0, mval[1], curarea->winx, mval[1]); + sdrawXORline4(1, mval[0], 0, mval[0], curarea->winy); + glFlush(); - mvalo[0]= mval[0]; - mvalo[1]= mval[1]; - } - event= extern_qread(&val); + mvalo[0]= mval[0]; + mvalo[1]= mval[1]; + } + event= extern_qread(&val); - if(event && val) { + if(event && val) { - /* for when a renderwindow is open, and a mouse cursor activates it */ - persp(PERSP_VIEW); - mywinset(curarea->win); - persp(PERSP_WIN); - - if(event==ESCKEY) { - retval= 0; - break; - } - else if(event==BKEY) { - /* b has been pressed twice: proceed with circle select */ - retval= 0; - break; + /* for when a renderwindow is open, and a mouse cursor activates it */ + persp(PERSP_VIEW); + mywinset(curarea->win); + persp(PERSP_WIN); + + if(event==ESCKEY) { + retval= 0; + break; + } + else if(event==BKEY) { + /* b has been pressed twice: proceed with circle select */ + retval= 0; + break; + } + else if(event==LEFTMOUSE) break; + else if(event==MIDDLEMOUSE) break; + else if(event==RIGHTMOUSE) break; } - else if(event==LEFTMOUSE) break; - else if(event==MIDDLEMOUSE) break; - else if(event==RIGHTMOUSE) break; - } - else PIL_sleep_ms(10); - - } /* end while (TRUE) */ + else PIL_sleep_ms(10); + + } /* end while (TRUE) */ - /* erase XORed lines */ - sdrawXORline4(-1, 0, 0, 0, 0); + /* erase XORed lines */ + sdrawXORline4(-1, 0, 0, 0, 0); + } + else getmouseco_areawin(mval); if(retval) { /* box select */ diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c index 8416a9d1304..89a0ee35fbe 100644 --- a/source/blender/src/editnode.c +++ b/source/blender/src/editnode.c @@ -43,19 +43,20 @@ #include "DNA_screen_types.h" #include "DNA_scene_types.h" - #include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" #include "BKE_material.h" +#include "BKE_texture.h" #include "BKE_utildefines.h" #include "BIF_editview.h" #include "BIF_gl.h" +#include "BIF_graphics.h" #include "BIF_interface.h" - #include "BIF_mywindow.h" +#include "BIF_previewrender.h" #include "BIF_resources.h" #include "BIF_space.h" #include "BIF_screen.h" @@ -72,58 +73,148 @@ #include "BDR_editobject.h" #include "blendef.h" +#include "butspace.h" #include "PIL_time.h" #include "mydevice.h" +/* currently called from BIF_preview_changed */ +void snode_tag_dirty(SpaceNode *snode) +{ + bNode *node; + + if(snode->treetype==NTREE_SHADER) { + if(snode->nodetree) { + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(node->type==SH_NODE_OUTPUT) + node->lasty= 0; + } + snode->flag |= SNODE_DO_PREVIEW; /* this adds an afterqueue on a redraw, to allow button previews to work first */ + } + } + allqueue(REDRAWNODE, 1); +} + +static void shader_node_previewrender(ScrArea *sa, SpaceNode *snode) +{ + bNode *node; + + if(snode->id==NULL) return; + if( ((Material *)snode->id )->use_nodes==0 ) return; -/* ************************** Node generic ************** */ + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(node->type==SH_NODE_OUTPUT) { + if(node->flag & NODE_DO_OUTPUT) { + if(node->lasty<PREVIEW_RENDERSIZE-2) { + RenderInfo ri; + int test= node->lasty; + + ri.cury = node->lasty; + ri.rect = NULL; + ri.pr_rectx = PREVIEW_RENDERSIZE; + ri.pr_recty = PREVIEW_RENDERSIZE; + + BIF_previewrender(snode->id, &ri, NULL, PR_DO_RENDER); /* sends redraw event */ + if(ri.rect) MEM_freeN(ri.rect); + + if(node->lasty<PREVIEW_RENDERSIZE-2) + addafterqueue(sa->win, RENDERPREVIEW, 1); +// if(test!=node->lasty) +// printf("node rendered y %d to %d\n", test, node->lasty); -/* based on settings in tree and node, - - it fills it with appropriate callbacks - - sets drawing rect info */ -void node_update(bNodeTree *ntree, bNode *node) + break; + } + } + } + } +} + + +static void snode_handle_recalc(SpaceNode *snode) { - bNodeSocket *nsock; - float dy= node->locy; + if(snode->treetype==NTREE_SHADER) { + BIF_preview_changed(ID_MA); /* signals buttons windows and node editors */ + } + else + allqueue(REDRAWNODE, 1); +} + +/* assumes nothing being done in ntree yet, sets the default in/out node */ +/* called from shading buttons or header */ +void node_shader_default(Material *ma) +{ + bNode *in, *out; + bNodeSocket *fromsock, *tosock; - /* input connectors */ - for(nsock= node->inputs.last; nsock; nsock= nsock->prev) { - nsock->locx= node->locx; - nsock->locy= dy + NODE_DYS; - dy+= NODE_DY; + /* but lets check it anyway */ + if(ma->nodetree) { + printf("error in shader initialize\n"); + return; } - /* spacer */ - dy+= NODE_DYS; + ma->nodetree= ntreeAddTree(NTREE_SHADER); - /* preview rect? */ - node->prv.xmin= node->locx + NODE_DYS; - node->prv.xmax= node->locx + node->width- NODE_DYS; - node->prv.ymin= dy; - node->prv.ymax= dy+=node->prv_h; + in= nodeAddNodeType(ma->nodetree, SH_NODE_INPUT); + in->locx= 10.0f; in->locy= 200.0f; + out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT); + out->locx= 200.0f; out->locy= 200.0f; - /* spacer */ - dy+= NODE_DYS; + /* only a link from color to color */ + fromsock= in->outputs.first; + tosock= out->inputs.first; + nodeAddLink(ma->nodetree, in, fromsock, out, tosock); - /* output connectors */ - for(nsock= node->outputs.last; nsock; nsock= nsock->prev) { - nsock->locx= node->locx + node->width; - nsock->locy= dy + NODE_DYS; - dy+= NODE_DY; - } + ntreeSolveOrder(ma->nodetree); /* needed for pointers */ +} + +/* even called for each redraw now, so keep it fast :) */ +void snode_set_context(SpaceNode *snode) +{ + Object *ob= OBACT; - /* header */ - dy+= NODE_DY; + snode->nodetree= NULL; + snode->id= snode->from= NULL; + + if(snode->treetype==NTREE_SHADER) { + /* need active object, or we allow pinning... */ + if(ob) { + Material *ma= give_current_material(ob, ob->actcol); + if(ma) { + snode->from= &ob->id; + snode->id= &ma->id; + snode->nodetree= ma->nodetree; + } + } + } +} + +/* ************************** Node generic ************** */ - node->tot.xmin= node->locx; - node->tot.xmax= node->locx + node->width; - node->tot.ymin= node->locy; - node->tot.ymax= dy; +static void snode_home(ScrArea *sa, SpaceNode *snode) +{ + bNode *node; + int first= 1; + + snode->v2d.cur.xmin= snode->v2d.cur.ymin= 0.0f; + snode->v2d.cur.xmax= sa->winx; + snode->v2d.cur.xmax= sa->winy; + + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(first) { + first= 0; + snode->v2d.cur= node->totr; + } + else { + BLI_union_rctf(&snode->v2d.cur, &node->totr); + } + } + snode->v2d.tot= snode->v2d.cur; + test_view2d(G.v2d, sa->winx, sa->winy); + } /* checks mouse position, and returns found node/socket */ /* type is SOCK_IN and/or SOCK_OUT */ -static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, int type, int in_out) +static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket **sockp, int in_out) { bNode *node; bNodeSocket *sock; @@ -133,32 +224,28 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** getmouseco_areawin(mval); areamouseco_to_ipoco(G.v2d, mval, &rect.xmin, &rect.ymin); - rect.xmin -= NODE_SOCK+3; - rect.ymin -= NODE_SOCK+3; - rect.xmax = rect.xmin + 2*NODE_SOCK+6; - rect.ymax = rect.ymin + 2*NODE_SOCK+6; + rect.xmin -= NODE_SOCKSIZE+3; + rect.ymin -= NODE_SOCKSIZE+3; + rect.xmax = rect.xmin + 2*NODE_SOCKSIZE+6; + rect.ymax = rect.ymin + 2*NODE_SOCKSIZE+6; /* check if we click in a socket */ for(node= snode->nodetree->nodes.first; node; node= node->next) { if(in_out & SOCK_IN) { for(sock= node->inputs.first; sock; sock= sock->next) { - if(type==-1 || type==sock->type) { - if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { - *nodep= node; - *sockp= sock; - return 1; - } + if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { + *nodep= node; + *sockp= sock; + return 1; } } } if(in_out & SOCK_OUT) { for(sock= node->outputs.first; sock; sock= sock->next) { - if(type==-1 || type==sock->type) { - if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { - *nodep= node; - *sockp= sock; - return 1; - } + if(BLI_in_rctf(&rect, sock->locx, sock->locy)) { + *nodep= node; + *sockp= sock; + return 1; } } } @@ -169,13 +256,12 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket ** /* ********************* transform ****************** */ /* releases on event, only intern (for extern see below) */ -static void transform_nodes(SpaceNode *snode, char *undostr) +static void transform_nodes(SpaceNode *snode, char mode, char *undostr) { bNode *node; float mxstart, mystart, mx, my, *oldlocs, *ol; int cont=1, tot=0, cancel=0, firsttime=1; short mval[2], mvalo[2]; - char str[64]; /* count total */ for(node= snode->nodetree->nodes.first; node; node= node->next) @@ -199,6 +285,8 @@ static void transform_nodes(SpaceNode *snode, char *undostr) getmouseco_areawin(mval); if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || firsttime) { +// char str[64]; + firsttime= 0; areamouseco_to_ipoco(G.v2d, mval, &mx, &my); @@ -209,13 +297,12 @@ static void transform_nodes(SpaceNode *snode, char *undostr) if(node->flag & SELECT) { node->locx= ol[0] + mx-mxstart; node->locy= ol[1] + my-mystart; - node_update(snode->nodetree, node); ol+= 2; } } - sprintf(str, "X: %.1f Y: %.1f", mx-mxstart, my-mystart); - headerprint(str); +// sprintf(str, "X: %.1f Y: %.1f", mx-mxstart, my-mystart); +// headerprint(str); force_draw(0); } else @@ -252,7 +339,6 @@ static void transform_nodes(SpaceNode *snode, char *undostr) node->locx= ol[0]; node->locy= ol[1]; ol+= 2; - node_update(snode->nodetree, node); } } @@ -267,9 +353,73 @@ static void transform_nodes(SpaceNode *snode, char *undostr) /* external call, also for callback */ void node_transform_ext(int mode, int unused) { - transform_nodes(curarea->spacedata.first, "Translate node"); + transform_nodes(curarea->spacedata.first, 'g', "Translate node"); } + +/* releases on event, only 1 node */ +static void scale_node(SpaceNode *snode, bNode *node) +{ + float mxstart, mystart, mx, my, oldwidth; + int cont=1, cancel=0; + short mval[2], mvalo[2]; + + /* store old */ + oldwidth= node->width; + + getmouseco_areawin(mvalo); + areamouseco_to_ipoco(G.v2d, mvalo, &mxstart, &mystart); + + while(cont) { + + getmouseco_areawin(mval); + if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) { + + areamouseco_to_ipoco(G.v2d, mval, &mx, &my); + mvalo[0]= mval[0]; + mvalo[1]= mval[1]; + + node->width= oldwidth + mx-mxstart; + CLAMP(node->width, node->typeinfo->minwidth, node->typeinfo->maxwidth); + + force_draw(0); + } + else + PIL_sleep_ms(10); + + while (qtest()) { + short val; + unsigned short event= extern_qread(&val); + + switch (event) { + case LEFTMOUSE: + case SPACEKEY: + case RETKEY: + cont=0; + break; + case ESCKEY: + case RIGHTMOUSE: + if(val) { + cancel=1; + cont=0; + } + break; + } + } + + } + + if(cancel) { + node->width= oldwidth; + } + else + BIF_undo_push("Scale Node"); + + allqueue(REDRAWNODE, 1); +} + + + /* ********************** select ******************** */ /* no undo here! */ @@ -296,8 +446,37 @@ void node_deselectall(SpaceNode *snode, int swap) allqueue(REDRAWNODE, 0); } +/* two active flags, ID nodes have special flag for buttons display */ +static void node_set_active(SpaceNode *snode, bNode *node) +{ + bNode *tnode; + + /* make sure only one node is active, and only one per ID type */ + for(tnode= snode->nodetree->nodes.first; tnode; tnode= tnode->next) { + tnode->flag &= ~NODE_ACTIVE; + + /* activate input/output will de-active all node-id types */ + if(node->typeinfo->nclass==NODE_CLASS_INPUT || node->typeinfo->nclass==NODE_CLASS_OUTPUT) + tnode->flag &= ~NODE_ACTIVE_ID; + + if(node->id && tnode->id) { + if(GS(node->id->name) == GS(tnode->id->name)) + tnode->flag &= ~NODE_ACTIVE_ID; + } + } + + node->flag |= NODE_ACTIVE; + if(node->id) + node->flag |= NODE_ACTIVE_ID; + + /* tree specific activate calls */ + if(snode->treetype==NTREE_SHADER) { + allqueue(REDRAWBUTSSHADING, 1); + } +} -static void node_mouse_select(SpaceNode *snode) +/* return 0: nothing done */ +static int node_mouse_select(SpaceNode *snode, unsigned short event) { bNode *node; float mx, my; @@ -306,37 +485,77 @@ static void node_mouse_select(SpaceNode *snode) getmouseco_areawin(mval); areamouseco_to_ipoco(G.v2d, mval, &mx, &my); - if((G.qual & LR_SHIFTKEY)==0) - node_deselectall(snode, 0); - + /* first check for the headers or scaling widget */ for(node= snode->nodetree->nodes.first; node; node= node->next) { - if(BLI_in_rctf(&node->tot, mx, my)) { - if(G.qual & LR_SHIFTKEY) { - if(node->flag & SELECT) - node->flag &= ~SELECT; - else - node->flag |= SELECT; + if((node->flag & NODE_HIDDEN)==0) { + rctf totr= node->totr; + totr.ymin= totr.ymax-20.0f; + totr.xmin= totr.xmax-18.0f; + + if(node->typeinfo->flag & NODE_PREVIEW) { + if(BLI_in_rctf(&totr, mx, my)) { + node->flag ^= NODE_PREVIEW; + allqueue(REDRAWNODE, 0); + return 1; + } + totr.xmin-=18.0f; + } + if(node->typeinfo->flag & NODE_OPTIONS) { + if(BLI_in_rctf(&totr, mx, my)) { + node->flag ^= NODE_OPTIONS; + allqueue(REDRAWNODE, 0); + return 1; + } } - else - node->flag |= SELECT; - break; + totr= node->totr; + totr.xmin= totr.xmax-10.0f; + totr.ymax= totr.ymin+10.0f; + if(BLI_in_rctf(&totr, mx, my)) { + scale_node(snode, node); + return 1; + } } } - /* not so nice (no event), but function below delays redraw otherwise */ - force_draw(0); - - std_rmouse_transform(node_transform_ext); /* does undo push for select */ + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(BLI_in_rctf(&node->totr, mx, my)) + break; + } + if(node) { + if((G.qual & LR_SHIFTKEY)==0) + node_deselectall(snode, 0); + + if(G.qual & LR_SHIFTKEY) { + if(node->flag & SELECT) + node->flag &= ~SELECT; + else + node->flag |= SELECT; + } + else + node->flag |= SELECT; + + node_set_active(snode, node); + + /* not so nice (no event), but function below delays redraw otherwise */ + force_draw(0); + + std_rmouse_transform(node_transform_ext); /* does undo push for select */ + + return 1; + } + return 0; } -static int node_socket_hilights(SpaceNode *snode, int type, int in_out) +static int node_socket_hilights(SpaceNode *snode, int in_out) { bNode *node; bNodeSocket *sock, *tsock, *socksel= NULL; float mx, my; short mval[2], redraw= 0; + if(snode->nodetree==NULL) return 0; + getmouseco_areawin(mval); areamouseco_to_ipoco(G.v2d, mval, &mx, &my); @@ -358,7 +577,7 @@ static int node_socket_hilights(SpaceNode *snode, int type, int in_out) } } - if(find_indicated_socket(snode, &node, &tsock, type, in_out)) { + if(find_indicated_socket(snode, &node, &tsock, in_out)) { tsock->flag |= SELECT; if(redraw==1 && tsock==socksel) redraw= 0; else redraw= 1; @@ -384,7 +603,7 @@ void node_border_select(SpaceNode *snode) areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax); for(node= snode->nodetree->nodes.first; node; node= node->next) { - if(BLI_isect_rctf(&rectf, &node->tot, NULL)) { + if(BLI_isect_rctf(&rectf, &node->totr, NULL)) { if(val==LEFTMOUSE) node->flag |= SELECT; else @@ -398,14 +617,14 @@ void node_border_select(SpaceNode *snode) /* ****************** Add *********************** */ -/* can be called from menus too */ -void node_add_shader_node(SpaceNode *snode, int type, float locx, float locy) +/* can be called from menus too, but they should do own undopush and redraws */ +bNode *node_add_shadernode(SpaceNode *snode, int type, float locx, float locy) { bNode *node= NULL; node_deselectall(snode, 0); - node= node_shader_add(snode->nodetree, type); + node= nodeAddNodeType(snode->nodetree, type); /* generics */ if(node) { @@ -413,12 +632,15 @@ void node_add_shader_node(SpaceNode *snode, int type, float locx, float locy) node->locy= locy; node->flag |= SELECT; - node_shader_set_execfunc(node); - node_shader_set_drawfunc(node); - /* update calculates all coords for usage */ - node_update(snode->nodetree, node); + /* custom storage, will become handlerized.. */ + if(node->type==SH_NODE_VALTORGB) + node->storage= add_colorband(1); + else if(node->type==SH_NODE_MATERIAL) + node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC; + + node_set_active(snode, node); } - + return node; } /* hotkey context */ @@ -427,66 +649,63 @@ static void node_add_menu(SpaceNode *snode) float locx, locy; short event, mval[2]; - /* shader menu */ - event= pupmenu("Add Node%t|Testnode%x0|Value %x2|Color %x1|Mix Color %x3|Show Color %x4"); - if(event<0) return; + /* shader menu, still hardcoded defines... solve */ + event= pupmenu("Add Node%t|Input%x0|Output%x1|Material%x100|Texture%x106|Value %x102|Color %x101|Mix Color %x103|ColorRamp %x104|Color to BW %x105"); + if(event<1) return; getmouseco_areawin(mval); areamouseco_to_ipoco(G.v2d, mval, &locx, &locy); - node_add_shader_node(snode, event, locx, locy); + node_add_shadernode(snode, event, locx, locy+40.0f); + + snode_handle_recalc(snode); - allqueue(REDRAWNODE, 0); BIF_undo_push("Add Node"); } void node_adduplicate(SpaceNode *snode) { - bNode *node, *nnode; - bNodeLink *link, *nlink; - bNodeSocket *sock; - int a; - /* backwards, we add to list end */ - for(node= snode->nodetree->nodes.last; node; node= node->prev) { - node->new= NULL; - if(node->flag & SELECT) { - nnode= nodeCopyNode(snode->nodetree, node); - node->flag &= ~SELECT; - nnode->flag |= SELECT; - node->new= nnode; - } - } + ntreeCopyTree(snode->nodetree, 1); /* 1 == internally selected nodes */ + ntreeSolveOrder(snode->nodetree); + snode_handle_recalc(snode); + + transform_nodes(snode, 'g', "Duplicate"); +} + +static void node_insert_convertor(SpaceNode *snode, bNodeLink *link) +{ + bNode *newnode= NULL; - /* check for copying links */ - for(link= snode->nodetree->links.first; link; link= link->next) { - if(link->fromnode->new && link->tonode->new) { - nlink= nodeAddLink(snode->nodetree, link->fromnode->new, NULL, link->tonode->new, NULL); - /* sockets were copied in order */ - for(a=0, sock= link->fromnode->outputs.first; sock; sock= sock->next, a++) { - if(sock==link->fromsock) - break; - } - nlink->fromsock= BLI_findlink(&link->fromnode->new->outputs, a); + if(snode->nodetree->type==NTREE_SHADER) { + if(link->fromsock->type==SOCK_RGBA && link->tosock->type==SOCK_VALUE) { + newnode= node_add_shadernode(snode, SH_NODE_RGBTOBW, 0.0f, 0.0f); + } + else if(link->fromsock->type==SOCK_VALUE && link->tosock->type==SOCK_RGBA) { + newnode= node_add_shadernode(snode, SH_NODE_VALTORGB, 0.0f, 0.0f); + } + + if(newnode) { + /* dangerous assumption to use first in/out socks, but thats fine for now */ + newnode->flag |= NODE_HIDDEN; + newnode->locx= 0.5f*(link->fromsock->locx + link->tosock->locx); + newnode->locy= 0.5f*(link->fromsock->locy + link->tosock->locy) + HIDDEN_RAD; - for(a=0, sock= link->tonode->inputs.first; sock; sock= sock->next, a++) { - if(sock==link->tosock) - break; - } - nlink->tosock= BLI_findlink(&link->tonode->new->inputs, a); + nodeAddLink(snode->nodetree, newnode, newnode->outputs.first, link->tonode, link->tosock); + link->tonode= newnode; + link->tosock= newnode->inputs.first; } } - - transform_nodes(snode, "Duplicate"); } + /* loop that adds a nodelink, called by function below */ -/* type = starting socket */ -static int node_draw_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, int in_out) +/* in_out = starting socket */ +static int node_add_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, int in_out) { bNode *tnode; bNodeSocket *tsock; bNodeLink *link= NULL; - short mval[2], mvalo[2]; + short mval[2], mvalo[2], firsttime=1; /* firsttime reconnects a link broken by caller */ /* we make a temporal link */ if(in_out==SOCK_OUT) @@ -498,21 +717,20 @@ static int node_draw_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, while (get_mbut() & L_MOUSE) { getmouseco_areawin(mval); - if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) { - + if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || firsttime) { + firsttime= 0; + mvalo[0]= mval[0]; mvalo[1]= mval[1]; if(in_out==SOCK_OUT) { - if(find_indicated_socket(snode, &tnode, &tsock, sock->type, SOCK_IN)) { + if(find_indicated_socket(snode, &tnode, &tsock, SOCK_IN)) { if(nodeFindLink(snode->nodetree, sock, tsock)==NULL) { - if(nodeCountSocketLinks(snode->nodetree, tsock) < tsock->limit) { if(tnode!=node && link->tonode!=tnode && link->tosock!= tsock) { link->tonode= tnode; link->tosock= tsock; - nodeSolveOrder(snode->nodetree); /* for interactive red line warning */ + ntreeSolveOrder(snode->nodetree); /* for interactive red line warning */ } - } } } else { @@ -521,13 +739,13 @@ static int node_draw_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, } } else { - if(find_indicated_socket(snode, &tnode, &tsock, sock->type, SOCK_OUT)) { + if(find_indicated_socket(snode, &tnode, &tsock, SOCK_OUT)) { if(nodeFindLink(snode->nodetree, sock, tsock)==NULL) { if(nodeCountSocketLinks(snode->nodetree, tsock) < tsock->limit) { if(tnode!=node && link->fromnode!=tnode && link->fromsock!= tsock) { link->fromnode= tnode; link->fromsock= tsock; - nodeSolveOrder(snode->nodetree); /* for interactive red line warning */ + ntreeSolveOrder(snode->nodetree); /* for interactive red line warning */ } } } @@ -538,7 +756,7 @@ static int node_draw_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, } } /* hilight target sockets only */ - node_socket_hilights(snode, sock->type, in_out==SOCK_OUT?SOCK_IN:SOCK_OUT); + node_socket_hilights(snode, in_out==SOCK_OUT?SOCK_IN:SOCK_OUT); force_draw(0); } @@ -546,27 +764,60 @@ static int node_draw_link_drag(SpaceNode *snode, bNode *node, bNodeSocket *sock, } if(link->tonode==NULL || link->fromnode==NULL) { - BLI_remlink(&snode->nodetree->links, link); - MEM_freeN(link); + nodeRemLink(snode->nodetree, link); + } + else { + bNodeLink *tlink; + /* we might need to remove a link */ + if(in_out==SOCK_OUT) { + if(nodeCountSocketLinks(snode->nodetree, link->tosock) > tsock->limit) { + + for(tlink= snode->nodetree->links.first; tlink; tlink= tlink->next) { + if(link!=tlink && tlink->tosock==link->tosock) + break; + } + if(tlink) { + /* is there a free input socket with same type? */ + for(tsock= tlink->tonode->inputs.first; tsock; tsock= tsock->next) { + if(tsock->type==sock->type) + if(nodeCountSocketLinks(snode->nodetree, tsock) < tsock->limit) + break; + } + if(tsock) + tlink->tosock= tsock; + else { + nodeRemLink(snode->nodetree, tlink); + } + } + } + } + + /* and last trick: insert a convertor when types dont match */ + if(link->tosock->type!=link->fromsock->type) { + node_insert_convertor(snode, link); + ntreeSolveOrder(snode->nodetree); /* so nice do it twice! well, the sort-order can only handle 1 added link at a time */ + } } - nodeSolveOrder(snode->nodetree); - nodeExecTree(snode->nodetree); + ntreeSolveOrder(snode->nodetree); + snode_handle_recalc(snode); allqueue(REDRAWNODE, 0); - + BIF_undo_push("Add link"); + return 1; } -static int node_draw_link(SpaceNode *snode) +/* return 1 when socket clicked */ +static int node_add_link(SpaceNode *snode) { bNode *node; bNodeLink *link; bNodeSocket *sock; /* output indicated? */ - if(find_indicated_socket(snode, &node, &sock, -1, SOCK_OUT)) { + if(find_indicated_socket(snode, &node, &sock, SOCK_OUT)) { if(nodeCountSocketLinks(snode->nodetree, sock)<sock->limit) - return node_draw_link_drag(snode, node, sock, SOCK_OUT); + return node_add_link_drag(snode, node, sock, SOCK_OUT); else { /* find if we break a link */ for(link= snode->nodetree->links.first; link; link= link->next) { @@ -576,16 +827,15 @@ static int node_draw_link(SpaceNode *snode) if(link) { node= link->tonode; sock= link->tosock; - BLI_remlink(&snode->nodetree->links, link); - MEM_freeN(link); - return node_draw_link_drag(snode, node, sock, SOCK_IN); + nodeRemLink(snode->nodetree, link); + return node_add_link_drag(snode, node, sock, SOCK_IN); } } } /* or an input? */ - else if(find_indicated_socket(snode, &node, &sock, -1, SOCK_IN)) { + else if(find_indicated_socket(snode, &node, &sock, SOCK_IN)) { if(nodeCountSocketLinks(snode->nodetree, sock)<sock->limit) - return node_draw_link_drag(snode, node, sock, SOCK_IN); + return node_add_link_drag(snode, node, sock, SOCK_IN); else { /* find if we break a link */ for(link= snode->nodetree->links.first; link; link= link->next) { @@ -595,9 +845,8 @@ static int node_draw_link(SpaceNode *snode) if(link) { node= link->fromnode; sock= link->fromsock; - BLI_remlink(&snode->nodetree->links, link); - MEM_freeN(link); - return node_draw_link_drag(snode, node, sock, SOCK_OUT); + nodeRemLink(snode->nodetree, link); + return node_add_link_drag(snode, node, sock, SOCK_OUT); } } } @@ -615,10 +864,147 @@ static void node_delete(SpaceNode *snode) nodeFreeNode(snode->nodetree, node); } + snode_handle_recalc(snode); BIF_undo_push("Delete nodes"); + allqueue(REDRAWNODE, 1); +} + +static void node_hide(SpaceNode *snode) +{ + bNode *node; + int nothidden=0, ishidden=0; + + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + if(node->flag & NODE_HIDDEN) + ishidden++; + else + nothidden++; + } + } + for(node= snode->nodetree->nodes.first; node; node= node->next) { + if(node->flag & SELECT) { + if( (ishidden && nothidden) || ishidden==0) + node->flag |= NODE_HIDDEN; + else + node->flag &= ~NODE_HIDDEN; + } + } + BIF_undo_push("Hide nodes"); + allqueue(REDRAWNODE, 1); +} + + +static void node_border_link_delete(SpaceNode *snode) +{ + rcti rect; + short val, mval[2]; + + setcursor_space(SPACE_NODE, CURSOR_VPAINT); + + if ( (val = get_border(&rect, 2)) ) { + if(rect.xmin<rect.xmax && rect.ymin<rect.ymax) { + //#define NODE_MAXPICKBUF 256 + bNodeLink *link, *next; + GLuint buffer[256]; + rctf rectf; + int code=0, hits; + + mval[0]= rect.xmin; + mval[1]= rect.ymin; + areamouseco_to_ipoco(&snode->v2d, mval, &rectf.xmin, &rectf.ymin); + mval[0]= rect.xmax; + mval[1]= rect.ymax; + areamouseco_to_ipoco(&snode->v2d, mval, &rectf.xmax, &rectf.ymax); + + myortho2(rectf.xmin, rectf.xmax, rectf.ymin, rectf.ymax); + + glSelectBuffer(256, buffer); + glRenderMode(GL_SELECT); + glInitNames(); + glPushName(-1); + + /* draw links */ + for(link= snode->nodetree->links.first; link; link= link->next) { + glLoadName(code++); + node_draw_link(snode, link); + } + + hits= glRenderMode(GL_RENDER); + glPopName(); + if(hits>0) { + int a; + for(a=0; a<hits; a++) { + bNodeLink *link= BLI_findlink(&snode->nodetree->links, buffer[ (4 * a) + 3]); + if(link) + link->tonode= NULL; /* first tag for delete, otherwise indices are wrong */ + } + for(link= snode->nodetree->links.first; link; link= next) { + next= link->next; + if(link->tonode==NULL) { + nodeRemLink(snode->nodetree, link); + } + } + ntreeSolveOrder(snode->nodetree); + snode_handle_recalc(snode); + } + allqueue(REDRAWNODE, 0); + BIF_undo_push("Erase links"); + } + } + + setcursor_space(SPACE_NODE, CURSOR_STD); + +} +/* ********************** */ + +static void convert_nodes(SpaceNode *snode) +{ + bNode *node, *bnode, *prevnode; + bNodeSocket *fromsock, *tosock; + Material *mat= (Material *)snode->id; + MaterialLayer *ml; + float locx= 200; + + if(GS(mat->id.name)!=ID_MA) return; + + prevnode= snode->nodetree->nodes.first; + + for(ml= mat->layers.first; ml; ml= ml->next) { + if(ml->mat) { + node= nodeAddNodeType(snode->nodetree, SH_NODE_MATERIAL); + node->id= (ID *)ml->mat; + node->locx= locx; locx+= 100; + node->locy= 300; + + bnode= nodeAddNodeType(snode->nodetree, SH_NODE_MIX_RGB); + bnode->custom1= ml->blendmethod; + bnode->locx= locx; locx+= 100; + bnode->locy= 200; + + fromsock= bnode->inputs.first; + fromsock->ns.vec[0]= ml->blendfac; + + if(prevnode) { + fromsock= prevnode->outputs.first; + tosock= bnode->inputs.last; + nodeAddLink(snode->nodetree, prevnode, fromsock, bnode, tosock); + } + + fromsock= node->outputs.first; + tosock= bnode->inputs.first; tosock= tosock->next; + nodeAddLink(snode->nodetree, node, fromsock, bnode, tosock); + + prevnode= bnode; + + } + } + + ntreeSolveOrder(snode->nodetree); allqueue(REDRAWNODE, 0); } + /* ******************** main event loop ****************** */ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) @@ -629,19 +1015,21 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) short val= evt->val, doredraw=0; if(sa->win==0) return; - + if(snode->nodetree==NULL) return; + if(val) { if( uiDoBlocks(&sa->uiblocks, event)!=UI_NOTHING ) event= 0; switch(event) { case LEFTMOUSE: - if(node_draw_link(snode)==0) - node_mouse_select(snode); + if(node_add_link(snode)==0) + if(node_mouse_select(snode, event)==0) + node_border_link_delete(snode); break; case RIGHTMOUSE: - node_mouse_select(snode); + node_mouse_select(snode, event); break; case MIDDLEMOUSE: @@ -651,16 +1039,19 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) break; case MOUSEY: - doredraw= node_socket_hilights(snode, -1, SOCK_IN|SOCK_OUT); + doredraw= node_socket_hilights(snode, SOCK_IN|SOCK_OUT); break; case UI_BUT_EVENT: if(val==B_NODE_EXEC) { - nodeExecTree(snode->nodetree); - doredraw= 1; + snode_handle_recalc(snode); /* sets redraw events too */ } break; + case RENDERPREVIEW: + shader_node_previewrender(sa, snode); + break; + case PADPLUSKEY: dx= (float)(0.1154*(G.v2d->cur.xmax-G.v2d->cur.xmin)); G.v2d->cur.xmin+= dx; @@ -676,6 +1067,7 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) doredraw= 1; break; case HOMEKEY: + snode_home(sa, snode); doredraw= 1; break; @@ -692,19 +1084,22 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) node_border_select(snode); break; case CKEY: /* sort again, showing cyclics */ - nodeSolveOrder(snode->nodetree); + if(G.qual==LR_ALTKEY) + convert_nodes(snode); /* temporal for layers */ + ntreeSolveOrder(snode->nodetree); doredraw= 1; break; case DKEY: if(G.qual==LR_SHIFTKEY) node_adduplicate(snode); break; - case EKEY: - nodeExecTree(snode->nodetree); - break; case GKEY: - transform_nodes(snode, "Translate Node"); + transform_nodes(snode, 'g', "Translate Node"); + break; + case HKEY: + node_hide(snode); break; + case DELKEY: case XKEY: if( okee("Erase selected")==0 ) break; @@ -715,6 +1110,8 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt) if(doredraw) scrarea_queue_winredraw(sa); + if(doredraw==2) + scrarea_queue_headredraw(sa); } diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index 73fff83f98d..ea640897963 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -1039,8 +1039,10 @@ void set_active_base(Base *base) /* signal to ipo */ allqueue(REDRAWIPO, base->object->ipowin); + allqueue(REDRAWACTION, 0); allqueue(REDRAWNLA, 0); + allqueue(REDRAWNODE, 0); /* signal to action */ select_actionchannel_by_name(base->object->action, "Object", 1); @@ -1957,7 +1959,7 @@ void set_render_border(void) if(G.vd->persp!=2) return; - val= get_border(&rect, 2); + val= get_border(&rect, 3); if(val) { rcti vb; diff --git a/source/blender/src/glutil.c b/source/blender/src/glutil.c index 16571fbec95..ae7cf300844 100644 --- a/source/blender/src/glutil.c +++ b/source/blender/src/glutil.c @@ -220,9 +220,9 @@ static int get_cached_work_texture(int *w_r, int *h_r) glBindTexture(GL_TEXTURE_2D, texid); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); tbuf= MEM_callocN(tex_w*tex_h*4, "tbuf"); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, tex_w, tex_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, tbuf); @@ -236,9 +236,10 @@ static int get_cached_work_texture(int *w_r, int *h_r) return texid; } -void glaDrawPixelsTex(float x, float y, int img_w, int img_h, void *rect) +void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *rect) { unsigned char *uc_rect= (unsigned char*) rect; + float *f_rect= (float *)rect; float xzoom= glaGetOneFloat(GL_ZOOM_X), yzoom= glaGetOneFloat(GL_ZOOM_Y); int ltexid= glaGetOneInteger(GL_TEXTURE_2D); int lrowlength= glaGetOneInteger(GL_UNPACK_ROW_LENGTH); @@ -256,9 +257,12 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, void *rect) int subpart_h= (subpart_y==nsubparts_y-1)?(img_h-subpart_y*tex_h):tex_h; float rast_x= x+subpart_x*tex_w*xzoom; float rast_y= y+subpart_y*tex_h*yzoom; - - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_UNSIGNED_BYTE, &uc_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]); - + + if(format==GL_FLOAT) + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_FLOAT, &f_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]); + else + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_UNSIGNED_BYTE, &uc_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]); + glColor3ub(255, 255, 255); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); @@ -282,10 +286,8 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, void *rect) glPixelStorei(GL_UNPACK_ROW_LENGTH, lrowlength); } -void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, void *rect) +void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, int format, void *rect) { - unsigned char *uc_rect= (unsigned char*) rect; - float xzoom= glaGetOneFloat(GL_ZOOM_X); float yzoom= glaGetOneFloat(GL_ZOOM_Y); @@ -337,7 +339,15 @@ void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, void *rect) } glPixelStorei(GL_UNPACK_ROW_LENGTH, img_w); - glDrawPixels(draw_w, draw_h, GL_RGBA, GL_UNSIGNED_BYTE, uc_rect + (off_y*img_w + off_x)*4); + if(format==GL_FLOAT) { + float *f_rect= (float *)rect; + glDrawPixels(draw_w, draw_h, GL_RGBA, GL_FLOAT, f_rect + (off_y*img_w + off_x)*4); + } + else { + unsigned char *uc_rect= (unsigned char *) rect; + glDrawPixels(draw_w, draw_h, GL_RGBA, GL_UNSIGNED_BYTE, uc_rect + (off_y*img_w + off_x)*4); + } + glPixelStorei(GL_UNPACK_ROW_LENGTH, old_row_length); } } diff --git a/source/blender/src/header_buttonswin.c b/source/blender/src/header_buttonswin.c index 02c79f43b8f..e6869256402 100644 --- a/source/blender/src/header_buttonswin.c +++ b/source/blender/src/header_buttonswin.c @@ -137,7 +137,7 @@ void do_buts_buttons(short event) scrarea_queue_winredraw(curarea); break; case B_BUTSPREVIEW: - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_TE); G.buts->oldkeypress = 0; scrarea_queue_headredraw(curarea); scrarea_queue_winredraw(curarea); @@ -203,7 +203,7 @@ void do_buts_buttons(short event) for(ml= ma->layers.first; ml; ml= ml->next) if(ml->mat) ml->mat->id.us++; - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); BIF_undo_push("Paste material settings"); scrarea_queue_winredraw(curarea); } diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c index b4e8a19d94d..78490172d2c 100644 --- a/source/blender/src/header_info.c +++ b/source/blender/src/header_info.c @@ -471,7 +471,7 @@ void do_info_buttons(unsigned short event) set_scene(sce); } - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_TE); break; case B_INFODELSCE: diff --git a/source/blender/src/header_ipo.c b/source/blender/src/header_ipo.c index 1bfef7a6567..edd7602a3ea 100644 --- a/source/blender/src/header_ipo.c +++ b/source/blender/src/header_ipo.c @@ -886,7 +886,7 @@ void do_ipo_buttons(short event) scrarea_queue_winredraw(curarea); break; case B_IPOBORDER: - val= get_border(&rect, 2); + val= get_border(&rect, 3); if(val) { mval[0]= rect.xmin; mval[1]= rect.ymin; diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c index ca5cacedac6..2d60825730b 100644 --- a/source/blender/src/header_node.c +++ b/source/blender/src/header_node.c @@ -33,6 +33,9 @@ #include <stdio.h> #include "DNA_ID.h" +#include "DNA_material_types.h" +#include "DNA_node_types.h" +#include "DNA_object_types.h" #include "DNA_screen_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" @@ -41,6 +44,7 @@ #include "BIF_gl.h" #include "BIF_interface.h" +#include "BIF_previewrender.h" #include "BIF_resources.h" #include "BIF_screen.h" #include "BIF_space.h" @@ -49,8 +53,10 @@ #include "BKE_global.h" #include "BKE_main.h" +#include "BKE_material.h" #include "BSE_headerbuttons.h" +#include "BSE_node.h" #include "blendef.h" #include "butspace.h" @@ -58,17 +64,29 @@ void do_node_buttons(ScrArea *sa, unsigned short event) { -// SpaceNode *snode= sa->spacedata.first; + SpaceNode *snode= sa->spacedata.first; + Material *ma; switch(event) { - ; + case B_NODE_USEMAT: + ma= (Material *)snode->id; + if(ma) { + if(ma->use_nodes && ma->nodetree==NULL) { + node_shader_default(ma); + snode_set_context(snode); + } + BIF_preview_changed(ID_MA); + allqueue(REDRAWNODE, 0); + allqueue(REDRAWBUTSSHADING, 0); + } + break; } } void node_buttons(ScrArea *sa) { -// SpaceNode *snode= sa->spacedata.first; + SpaceNode *snode= sa->spacedata.first; uiBlock *block; short xco; char name[256]; @@ -106,7 +124,6 @@ void node_buttons(ScrArea *sa) &(sa->flag), 0, 0, 0, 0, "Hide pulldown menus"); } - uiBlockSetEmboss(block, UI_EMBOSS); xco+=XIC; if((sa->flag & HEADER_NO_PULLDOWN)==0) { @@ -119,6 +136,25 @@ void node_buttons(ScrArea *sa) // xco+= xmax; } + uiBlockSetEmboss(block, UI_EMBOSS); + + /* find and set the context */ + snode_set_context(snode); + + if(snode->treetype==NTREE_SHADER) { + if(snode->from) { + /* 0, NULL -> pin */ + xco= std_libbuttons(block, xco, 0, 0, NULL, B_MATBROWSE, snode->id, snode->from, &(snode->menunr), + B_MATALONE, B_MATLOCAL, B_MATDELETE, B_AUTOMATNAME, B_KEEPDATA); + + if(snode->id) { + Material *ma= (Material *)snode->id; + uiDefButC(block, TOG, B_NODE_USEMAT, "Use Nodes", xco+5,0,70,19, &ma->use_nodes, 0.0f, 0.0f, 0, 0, ""); + xco+=80; + } + } + } + /* always as last */ sa->headbutlen= xco+2*XIC; diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c index c2551bd265a..38b0e604a01 100644 --- a/source/blender/src/headerbuttons.c +++ b/source/blender/src/headerbuttons.c @@ -782,7 +782,8 @@ void do_global_buttons(unsigned short event) BIF_undo_push("Browse Material"); allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); - BIF_preview_changed(G.buts); + allqueue(REDRAWNODE, 0); + BIF_preview_changed(ID_MA); } } @@ -799,7 +800,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } } break; @@ -819,7 +820,7 @@ void do_global_buttons(unsigned short event) ma->mtex[ ma->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } } } @@ -833,7 +834,7 @@ void do_global_buttons(unsigned short event) wrld->mtex[ wrld->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); } } } @@ -847,7 +848,7 @@ void do_global_buttons(unsigned short event) la->mtex[ la->texact ]= NULL; allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); } } } @@ -913,7 +914,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_MA); } } break; @@ -1101,7 +1102,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); } break; case B_WORLDDELETE: @@ -1169,7 +1170,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_WO); } } break; @@ -1209,7 +1210,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); } break; @@ -1266,7 +1267,7 @@ void do_global_buttons(unsigned short event) allqueue(REDRAWBUTSSHADING, 0); allqueue(REDRAWIPO, 0); allqueue(REDRAWOOPS, 0); - BIF_preview_changed(G.buts); + BIF_preview_changed(ID_LA); } } break; diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c index 26784712b0c..351deab0e4b 100644 --- a/source/blender/src/interface.c +++ b/source/blender/src/interface.c @@ -69,11 +69,13 @@ #include "DNA_userdef_types.h" #include "DNA_vec_types.h" #include "DNA_object_types.h" +#include "DNA_texture_types.h" #include "DNA_vfont_types.h" #include "BKE_blender.h" #include "BKE_global.h" #include "BKE_library.h" +#include "BKE_texture.h" #include "BKE_utildefines.h" #include "BIF_gl.h" @@ -908,6 +910,9 @@ void uiDrawBlock(uiBlock *block) uiBut *but; short testmouse=0, mouse[2]; + /* we set this only once */ + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + /* handle pending stuff */ if(block->autofill) ui_autofill(block); if(block->minx==0.0 && block->maxx==0.0) uiBoundsBlock(block, 0); @@ -2453,7 +2458,7 @@ static int ui_do_but_NUMSLI(uiBut *but) } /* event denotes if we make first item active or not */ -static int ui_do_but_BLOCK(uiBut *but, int event) +static uiBlock *ui_do_but_BLOCK(uiBut *but, int event) { uiBlock *block; uiBut *bt; @@ -2494,7 +2499,7 @@ static int ui_do_but_BLOCK(uiBut *but, int event) but->flag &= ~UI_SELECT; uibut_do_func(but); - return 0; + return block; } static int ui_do_but_BUTM(uiBut *but) @@ -2510,9 +2515,25 @@ static int ui_do_but_BUTM(uiBut *but) static int ui_do_but_LABEL(uiBut *but) { - - uibut_do_func(but); - return but->retval; + /* new label type, for nodes, ctrl+clock on text gives options */ + if(but->block_func) { + if(G.qual & LR_CTRLKEY) { + ListBase listb={NULL, NULL}; + uiBlock *block= ui_do_but_BLOCK(but, 0); + + BLI_addtail(&listb, block); + block->parent= NULL; /* we abused ui_do_but_BLOCK */ + uiDoBlocks(&listb, 0); + + uibut_do_func(but); + return but->retval; + } + return 0; + } + else { + uibut_do_func(but); + return but->retval; + } } static uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval) @@ -3147,6 +3168,104 @@ static int ui_do_but_CHARTAB(uiBut *but) #endif +static int vergcband(const void *a1, const void *a2) +{ + const CBData *x1=a1, *x2=a2; + + if( x1->pos > x2->pos ) return 1; + else if( x1->pos < x2->pos) return -1; + return 0; +} + + +static void do_colorband_evt(ColorBand *coba) +{ + int a; + + if(coba==NULL) return; + + if(coba->tot<2) return; + + for(a=0; a<coba->tot; a++) coba->data[a].cur= a; + qsort(coba->data, coba->tot, sizeof(CBData), vergcband); + for(a=0; a<coba->tot; a++) { + if(coba->data[a].cur==coba->cur) { + if(coba->cur!=a) addqueue(curarea->win, REDRAW, 0); /* button cur */ + coba->cur= a; + break; + } + } +} + + +static int ui_do_but_COLORBAND(uiBut *but) +{ + ColorBand *coba= (ColorBand *)but->poin; + CBData *cbd; + float dx, width= but->x2-but->x1; + int a; + int mindist= 12, xco; + short mval[2], mvalo[2]; + + uiGetMouse(mywinget(), mvalo); + + if(G.qual & LR_CTRLKEY) { + /* insert new key on mouse location */ + if(coba->tot < MAXCOLORBAND-1) { + float pos= ((float)(mvalo[0] - but->x1))/width; + float col[4]; + + do_colorband(coba, pos, col); /* executes it */ + + coba->tot++; + coba->cur= coba->tot-1; + + coba->data[coba->cur].r= col[0]; + coba->data[coba->cur].g= col[1]; + coba->data[coba->cur].b= col[2]; + coba->data[coba->cur].a= col[3]; + coba->data[coba->cur].pos= pos; + + do_colorband_evt(coba); + } + } + else { + + /* first, activate new key when mouse is close */ + for(a=0, cbd= coba->data; a<coba->tot; a++, cbd++) { + xco= but->x1 + (cbd->pos*width); + xco= ABS(xco-mvalo[0]); + if(a==coba->cur) xco+= 5; // selected one disadvantage + if(xco<mindist) { + coba->cur= a; + mindist= xco; + } + } + + cbd= coba->data + coba->cur; + + while(get_mbut() & L_MOUSE) { + uiGetMouse(mywinget(), mval); + if(mval[0]!=mvalo[0]) { + dx= mval[0]-mvalo[0]; + dx/= width; + cbd->pos+= dx; + CLAMP(cbd->pos, 0.0, 1.0); + + ui_draw_but(but); + ui_block_flush_back(but->block); + + do_colorband_evt(coba); + cbd= coba->data + coba->cur; /* because qsort */ + + mvalo[0]= mval[0]; + } + BIF_wait_for_statechange(); + } + } + + return but->retval; +} /* ************************************************ */ @@ -3320,7 +3439,8 @@ static int ui_do_button(uiBlock *block, uiBut *but, uiEvent *uevent) case BLOCK: case PULLDOWN: if(uevent->val) { - retval= ui_do_but_BLOCK(but, uevent->event); + ui_do_but_BLOCK(but, uevent->event); + retval= 0; if(block->auto_open==0) block->auto_open= 1; } break; @@ -3341,6 +3461,9 @@ static int ui_do_button(uiBlock *block, uiBut *but, uiEvent *uevent) case HSVCUBE: retval= ui_do_but_HSVCUBE(but); break; + case BUT_COLORBAND: + retval= ui_do_but_COLORBAND(but); + break; #ifdef INTERNATIONAL case CHARTAB: @@ -4869,36 +4992,31 @@ void ui_check_but(uiBut *but) /* calc but->ofs, to draw the string shorter if too long */ but->ofs= 0; while(but->strwidth > (int)okwidth ) { - but->ofs++; - if(but->drawstr[but->ofs]) + if ELEM(but->type, NUM, TEX) { // only these cut off left + but->ofs++; but->strwidth= but->aspect*BIF_GetStringWidth(but->font, but->drawstr+but->ofs, transopts); - else but->strwidth= 0; - - /* textbut exception */ - if(but->pos != -1) { - pos= but->pos+strlen(but->str); - if(pos-1 < but->ofs) { - pos= but->ofs-pos+1; - but->ofs -= pos; - if(but->ofs<0) { - but->ofs= 0; - pos--; + + /* textbut exception */ + if(but->pos != -1) { + pos= but->pos+strlen(but->str); + if(pos-1 < but->ofs) { + pos= but->ofs-pos+1; + but->ofs -= pos; + if(but->ofs<0) { + but->ofs= 0; + pos--; + } + but->drawstr[ strlen(but->drawstr)-pos ]= 0; } - but->drawstr[ strlen(but->drawstr)-pos ]= 0; } } - - if(but->strwidth < 10) break; - } - - /* fix for buttons that better not have text cut off to the right */ - if(but->ofs) { - if ELEM(but->type, NUM, TEX); // only these cut off left else { - but->drawstr[ strlen(but->drawstr)-but->ofs ]= 0; - but->ofs= 0; + but->drawstr[ strlen(but->drawstr)-1 ]= 0; + but->strwidth= but->aspect*BIF_GetStringWidth(but->font, but->drawstr, transopts); } + + if(but->strwidth < 10) break; } } } diff --git a/source/blender/src/interface_draw.c b/source/blender/src/interface_draw.c index 44da2c488c5..a0a0afcb728 100644 --- a/source/blender/src/interface_draw.c +++ b/source/blender/src/interface_draw.c @@ -55,17 +55,19 @@ #include "BLI_blenlib.h" #include "BLI_arithb.h" +#include "DNA_packedFile_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_texture_types.h" #include "DNA_userdef_types.h" #include "DNA_vec_types.h" #include "DNA_vfont_types.h" -#include "DNA_packedFile_types.h" #include "BKE_blender.h" -#include "BKE_utildefines.h" #include "BKE_font.h" #include "BKE_global.h" +#include "BKE_utildefines.h" + #include "datatoc.h" /* std font */ #include "BIF_gl.h" @@ -151,15 +153,24 @@ void uiEmboss(float x1, float y1, float x2, float y2, int sel) /* ************** GENERIC ICON DRAW, NO THEME HERE ************* */ +/* icons have been standardized... and this call draws in untransformed coordinates */ +#define ICON_HEIGHT 16.0f + static void ui_draw_icon(uiBut *but, BIFIconID icon) { - // void BIF_icon_pos(float xs, float ys); + float xs=0, ys=0, aspect, height; int blend= 0; - float xs=0, ys=0; - // this icon doesn't need draw... + /* this icon doesn't need draw... */ if(icon==ICON_BLANK1) return; - + + /* we need aspect from block, for menus... these buttons are scaled in uiPositionBlock() */ + aspect= but->block->aspect; + if(aspect != but->aspect) + height= ICON_HEIGHT/aspect; + else + height= ICON_HEIGHT; + if(but->flag & UI_ICON_LEFT) { if (but->type==BUTM) { xs= but->x1+1.0; @@ -170,22 +181,21 @@ static void ui_draw_icon(uiBut *but, BIFIconID icon) else { xs= but->x1+6.0; } - ys= (but->y1+but->y2- BIF_icon_get_height(icon))/2.0; + ys= (but->y1+but->y2- height)/2.0; } if(but->flag & UI_ICON_RIGHT) { xs= but->x2-17.0; - ys= (but->y1+but->y2- BIF_icon_get_height(icon))/2.0; + ys= (but->y1+but->y2- height)/2.0; } if (!((but->flag & UI_ICON_RIGHT) || (but->flag & UI_ICON_LEFT))) { - xs= (but->x1+but->x2- BIF_icon_get_width(icon))/2.0; - ys= (but->y1+but->y2- BIF_icon_get_height(icon))/2.0; + xs= (but->x1+but->x2- height)/2.0; + ys= (but->y1+but->y2- height)/2.0; } - if(but->aspect>1.1) glPixelZoom(1.0/but->aspect, 1.0/but->aspect); - else if(but->aspect<0.9) glPixelZoom(1.0/but->aspect, 1.0/but->aspect); + /* aspect for the icon has to be stored */ + BIF_icon_set_aspect(icon, aspect); glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* calculate blend color */ if ELEM4(but->type, ICONTOG, TOG, ROW, TOGN) { @@ -193,12 +203,10 @@ static void ui_draw_icon(uiBut *but, BIFIconID icon) else if(but->flag & UI_ACTIVE); else blend= -60; } - BIF_icon_draw_blended(xs, ys, icon, but->themecol, blend); + BIF_icon_draw_blended((int)(xs+0.5f), (int)(ys+0.5f), icon, but->themecol, blend); - glBlendFunc(GL_ONE, GL_ZERO); glDisable(GL_BLEND); - glPixelZoom(1.0, 1.0); } @@ -406,7 +414,6 @@ static void ui_default_iconrow_arrows(float x1, float y1, float x2, float y2) { glEnable( GL_POLYGON_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glShadeModel(GL_FLAT); glBegin(GL_TRIANGLES); @@ -430,7 +437,6 @@ static void ui_default_menu_arrows(float x1, float y1, float x2, float y2) { glEnable( GL_POLYGON_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glShadeModel(GL_FLAT); glBegin(GL_TRIANGLES); @@ -456,7 +462,6 @@ static void ui_default_num_arrows(float x1, float y1, float x2, float y2) glEnable( GL_POLYGON_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glShadeModel(GL_FLAT); glBegin(GL_TRIANGLES); @@ -486,7 +491,6 @@ static void ui_tog3_invert(float x1, float y1, float x2, float y2, int seltype) short alpha = 30; if (seltype == 0) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4ub(0, 0, 0, alpha); @@ -497,7 +501,6 @@ static void ui_tog3_invert(float x1, float y1, float x2, float y2, int seltype) glDisable(GL_BLEND); } else { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4ub(255, 255, 255, alpha); @@ -521,7 +524,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float if (!((align == UI_BUT_ALIGN_DOWN) || (align == (UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT)) || (align == (UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT)))) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); MM_WHITE_OP; fdrawline(x1, y1-1, x2, y1-1); @@ -547,7 +549,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float case UI_BUT_ALIGN_LEFT: /* RIGHT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -564,7 +565,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float case UI_BUT_ALIGN_RIGHT: /* LEFT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -590,7 +590,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT: /* LEFT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -607,7 +606,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT: /* RIGHT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -628,7 +626,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float } } else { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); @@ -663,7 +660,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float case ICONROW: case ICONTEXTROW: /* DARKENED AREA */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4ub(0, 0, 0, 30); @@ -679,7 +675,6 @@ static void ui_default_button(int type, int colorid, float asp, float x1, float break; case MENU: /* DARKENED AREA */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glColor4ub(0, 0, 0, 30); @@ -708,7 +703,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 if (!((align == UI_BUT_ALIGN_DOWN) || (align == (UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT)) || (align == (UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT)))) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); MM_WHITE_OP; fdrawline(x1, y1-1, x2, y1-1); @@ -734,7 +728,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 case UI_BUT_ALIGN_LEFT: /* RIGHT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -751,7 +744,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 case UI_BUT_ALIGN_RIGHT: /* LEFT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -777,7 +769,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT: /* LEFT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -794,7 +785,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT: /* RIGHT OUTER SUNKEN EFFECT */ - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); glBegin(GL_LINES); @@ -816,7 +806,6 @@ static void ui_default_flat(int type, int colorid, float asp, float x1, float y1 } else { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); @@ -1079,7 +1068,6 @@ static void round_button(float x1, float y1, float x2, float y2, float asp, /* fake AA */ uiSetRoundBox(round); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); BIF_GetThemeColor3ubv(colorid, col); @@ -1318,7 +1306,6 @@ static void ui_draw_slider(int colorid, float fac, float aspect, float x1, float static void ui_shadowbox(float minx, float miny, float maxx, float maxy, float shadsize, unsigned char alpha) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glShadeModel(GL_SMOOTH); @@ -1399,7 +1386,6 @@ static void ui_draw_pulldown_item(int type, int colorid, float asp, float x1, fl BIF_GetThemeColor4ubv(TH_MENU_BACK, col); if(col[3]!=255) { glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } if((flag & UI_ACTIVE) && type!=LABEL) { @@ -1427,7 +1413,6 @@ static void ui_draw_pulldown_round(int type, int colorid, float asp, float x1, f glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); gl_round_box(GL_LINE_LOOP, x1, y1+3, x2, y2-3, 7.0); glDisable( GL_LINE_SMOOTH ); glDisable( GL_BLEND ); @@ -1873,9 +1858,120 @@ static void ui_draw_but_CHARTAB(uiBut *but) #endif // INTERNATIONAL +static void ui_draw_but_COLORBAND(uiBut *but) +{ + ColorBand *coba= (ColorBand *)but->poin; + CBData *cbd; + float x1, y1, sizex, sizey; + float dx, v3[2], v1[2], v2[2]; + int a; + + if(coba==NULL) return; + + x1= but->x1; + y1= but->y1; + sizex= but->x2-x1; + sizey= but->y2-y1; + + /* first background, to show tranparency */ + dx= sizex/12.0; + v1[0]= x1; + for(a=0; a<12; a++) { + if(a & 1) glColor3f(0.3, 0.3, 0.3); else glColor3f(0.8, 0.8, 0.8); + glRectf(v1[0], y1, v1[0]+dx, y1+0.5*sizey); + if(a & 1) glColor3f(0.8, 0.8, 0.8); else glColor3f(0.3, 0.3, 0.3); + glRectf(v1[0], y1+0.5*sizey, v1[0]+dx, y1+sizey); + v1[0]+= dx; + } + + glShadeModel(GL_SMOOTH); + glEnable(GL_BLEND); + + cbd= coba->data; + + v1[0]= v2[0]= x1; + v1[1]= y1; + v2[1]= y1+sizey; + + glBegin(GL_QUAD_STRIP); + + glColor4fv( &cbd->r ); + glVertex2fv(v1); glVertex2fv(v2); + + for(a=0; a<coba->tot; a++, cbd++) { + + v1[0]=v2[0]= x1+ cbd->pos*sizex; + + glColor4fv( &cbd->r ); + glVertex2fv(v1); glVertex2fv(v2); + } + + v1[0]=v2[0]= x1+ sizex; + glVertex2fv(v1); glVertex2fv(v2); + + glEnd(); + glShadeModel(GL_FLAT); + glDisable(GL_BLEND); + + /* outline */ + v1[0]= x1; v1[1]= y1; + + cpack(0x0); + glBegin(GL_LINE_LOOP); + glVertex2fv(v1); + v1[0]+= sizex; + glVertex2fv(v1); + v1[1]+= sizey; + glVertex2fv(v1); + v1[0]-= sizex; + glVertex2fv(v1); + glEnd(); + + + /* help lines */ + v1[0]= v2[0]=v3[0]= x1; + v1[1]= y1; + v2[1]= y1+0.5*sizey; + v3[1]= y1+sizey; + + cbd= coba->data; + glBegin(GL_LINES); + for(a=0; a<coba->tot; a++, cbd++) { + v1[0]=v2[0]=v3[0]= x1+ cbd->pos*sizex; + + glColor3ub(0, 0, 0); + glVertex2fv(v1); + glVertex2fv(v2); + + if(a==coba->cur) { + glVertex2f(v1[0]-1, v1[1]); + glVertex2f(v2[0]-1, v2[1]); + glVertex2f(v1[0]+1, v1[1]); + glVertex2f(v2[0]+1, v2[1]); + } + + glColor3ub(255, 255, 255); + glVertex2fv(v2); + glVertex2fv(v3); + + if(a==coba->cur) { + if(cbd->pos>0.01) { + glVertex2f(v2[0]-1, v2[1]); + glVertex2f(v3[0]-1, v3[1]); + } + if(cbd->pos<0.99) { + glVertex2f(v2[0]+1, v2[1]); + glVertex2f(v3[0]+1, v3[1]); + } + } + } + glEnd(); +} + + + static void ui_draw_roundbox(uiBut *but) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); BIF_ThemeColorShadeAlpha(TH_PANEL, but->a2, but->a2); @@ -1988,7 +2084,12 @@ void ui_draw_but(uiBut *but) case ROUNDBOX: ui_draw_roundbox(but); - + break; + + case BUT_COLORBAND: + ui_draw_but_COLORBAND(but); + break; + default: but->embossfunc(but->type, but->themecol, but->aspect, but->x1, but->y1, but->x2, but->y2, but->flag); ui_draw_text_icon(but); diff --git a/source/blender/src/interface_icons.c b/source/blender/src/interface_icons.c index 84ed6f8f29e..686c70295c8 100644 --- a/source/blender/src/interface_icons.c +++ b/source/blender/src/interface_icons.c @@ -470,13 +470,18 @@ static void clear_transp_rect(unsigned char *transp, unsigned char *rect, int w, static void prepare_internal_icons(ImBuf* bbuf) { int x, y; - + int rowstride= bbuf->x*4; + char *back= (char *)bbuf->rect; + unsigned char transp[4]; + + /* this sets blueish outside of icon to zero alpha */ + QUATCOPY(transp, back); + clear_transp_rect(transp, back, bbuf->x, bbuf->y, rowstride); + /* hack! */ for (y=0; y<12; y++) { for (x=0; x<21; x++) { - int rowstride= bbuf->x*4; unsigned char *start= ((unsigned char*) bbuf->rect) + (y*21 + 3)*rowstride + (x*20 + 3)*4; - unsigned char transp[4]; /* this sets backdrop of icon to zero alpha */ transp[0]= start[0]; transp[1]= start[1]; @@ -485,10 +490,6 @@ static void prepare_internal_icons(ImBuf* bbuf) clear_transp_rect(transp, start, 20, 21, rowstride); clear_transp_rect_soft(transp, start, 20, 21, rowstride); - /* this sets outside of icon to zero alpha */ - start= ((unsigned char*) bbuf->rect) + (y*21)*rowstride + (x*20)*4; - QUATCOPY(transp, start); - clear_transp_rect(transp, start, 20, 21, rowstride); } } } @@ -503,13 +504,7 @@ static void init_internal_icons() for (y=0; y<12; y++) { for (x=0; x<21; x++) { - if (x==11 && y==6) { - def_internal_icon(bbuf, ICON_BEVELBUT_HLT, (x*20 + 3 + 4), (y*21 + 3 + 2), 7, 13); - } else if (x==12 && y==6) { - def_internal_icon(bbuf, ICON_BEVELBUT_DEHLT, (x*20 + 3 + 4), (y*21 + 3 + 2), 7, 13); - } else { - def_internal_icon(bbuf, BIFICONID_FIRST + y*21 + x, x*20+3, y*21+3, 15, 16); - } + def_internal_icon(bbuf, BIFICONID_FIRST + y*21 + x, x*20+3, y*21+3, 16, 16); } } @@ -617,6 +612,51 @@ void BIF_icons_init(int first_dyn_id) init_internal_icons(); } +/* create single icon from jpg, png etc. */ +static void icon_from_image(Image* img, RenderInfo* ri, unsigned int w, unsigned int h) +{ + struct ImBuf *ima; + float scaledx, scaledy; + int pr_size = w*h*sizeof(unsigned int); + short ex, ey, dx, dy; + + if (!img) + return; + + if (!ri->rect) { + ri->rect= MEM_callocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "butsrect"); + memset(ri->rect, 0xFF, w*h*sizeof(unsigned int)); + } + + if(img->ibuf==NULL) { + load_image(img, IB_rect, G.sce, G.scene->r.cfra); + } + ima = IMB_dupImBuf(img->ibuf); + + if (!ima) + return; + + if (ima->x > ima->y) { + scaledx = (float)w; + scaledy = ( (float)ima->y/(float)ima->x )*(float)w; + } + else { + scaledx = ( (float)ima->x/(float)ima->y )*(float)h; + scaledy = (float)h; + } + + ex = (short)scaledx; + ey = (short)scaledy; + + dx = (w - ex) / 2; + dy = (h - ey) / 2; + + IMB_scaleImBuf(ima, ex, ey); + memcpy(ri->rect, ima->rect, pr_size); + IMB_freeImBuf(ima); +} + + /* only called when icon has changed */ /* only call with valid pointer from BIF_icon_draw */ static void icon_set_image(ID* id, DrawInfo* di) @@ -636,16 +676,9 @@ static void icon_set_image(ID* id, DrawInfo* di) /* no drawing (see last parameter doDraw, just calculate preview image - hopefully small enough to be fast */ if (GS(id->name) == ID_IM) - BIF_calcpreview_image((struct Image*)id, &ri, ri.pr_rectx, ri.pr_recty); + icon_from_image((struct Image*)id, &ri, ri.pr_rectx, ri.pr_recty); else { - BIF_previewrender(id, &ri, NULL, 0); - - /* need to correct alpha */ - /* - for( it = 0; it < ri.pr_rectx*ri.pr_recty; ++it) { - ri.rect[it] |= 0xFF000000; - } - */ + BIF_previewrender(id, &ri, NULL, PR_ICON_RENDER); } /* and copy the image into the icon */ @@ -657,13 +690,11 @@ static void icon_set_image(ID* id, DrawInfo* di) } -void BIF_icon_draw( int x, int y, int icon_id) +void BIF_icon_draw(float x, float y, int icon_id) { Icon* icon = 0; DrawInfo* di = 0; - ImBuf *ima; - icon = BKE_icon_get(icon_id); if (!icon) { @@ -694,24 +725,28 @@ void BIF_icon_draw( int x, int y, int icon_id) if (!di->rect) return; /* something has gone wrong! */ - /* di->rect contains image in 'rendersize' */ - - /* first allocate imbuf for scaling and copy preview into it */ - ima = IMB_allocImBuf(di->rw, di->rh, 32, IB_rect, 0); - memcpy(ima->rect, di->rect,di->rw*di->rh*sizeof(unsigned int)); - - /* scale it */ - IMB_scaleImBuf(ima, di->w, di->h); - glRasterPos2f(x, y); - glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect); - - IMB_freeImBuf(ima); + + /* di->rect contains image in 'rendersize', we only scale if needed */ + if(di->rw!=di->w && di->rh!=di->h) { + ImBuf *ima; + /* first allocate imbuf for scaling and copy preview into it */ + ima = IMB_allocImBuf(di->rw, di->rh, 32, IB_rect, 0); + memcpy(ima->rect, di->rect, di->rw*di->rh*sizeof(unsigned int)); + + /* scale it */ + IMB_scaleImBuf(ima, di->w, di->h); + glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect); + + IMB_freeImBuf(ima); + } + else + glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, di->rect); } } -void BIF_icon_draw_blended(int x, int y, int icon_id, int colorid, int shade) +void BIF_icon_draw_blended(float x, float y, int icon_id, int colorid, int shade) { if(shade < 0) { @@ -724,7 +759,8 @@ void BIF_icon_draw_blended(int x, int y, int icon_id, int colorid, int shade) glPixelTransferf(GL_ALPHA_SCALE, 1.0); } -void BIF_icon_set_aspect(int icon_id, float aspect) { +void BIF_icon_set_aspect(int icon_id, float aspect) +{ Icon* icon = 0; DrawInfo* di = 0; @@ -746,8 +782,8 @@ void BIF_icon_set_aspect(int icon_id, float aspect) { } di->aspect = aspect; /* scale width and height according to aspect */ - di->w = 16.0 / di->aspect; - di->h = 16.0 / di->aspect; + di->w = (int)(16.0f/di->aspect + 0.5f); + di->h = (int)(16.0f/di->aspect + 0.5f); } diff --git a/source/blender/src/interface_panel.c b/source/blender/src/interface_panel.c index 74cb87a5bbf..09a50faeff9 100644 --- a/source/blender/src/interface_panel.c +++ b/source/blender/src/interface_panel.c @@ -344,7 +344,6 @@ void uiRoundBoxEmboss(float minx, float miny, float maxx, float maxy, float rad, color[3]= 0.5; glColor4fv(color); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } /* solid part */ @@ -357,7 +356,6 @@ void uiRoundBoxEmboss(float minx, float miny, float maxx, float maxy, float rad, /* set antialias line */ glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); /* top shade */ gl_round_box_topshade(minx+1, miny+1, maxx-1, maxy-1, rad); @@ -387,13 +385,11 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad) color[3]= 0.5; glColor4fv(color); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } /* set antialias line */ glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); gl_round_box(GL_LINE_LOOP, minx, miny, maxx, maxy, rad); @@ -413,7 +409,6 @@ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad) color[3]= 0.5; glColor4fv(color); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); } /* solid part */ @@ -422,7 +417,6 @@ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad) /* set antialias line */ glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); gl_round_box(GL_LINE_LOOP, minx, miny, maxx, maxy, rad); @@ -764,7 +758,6 @@ static void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, /* set antialias line */ glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glBegin(GL_LINE_LOOP); glVertex2f(x1, y1); @@ -778,7 +771,7 @@ static void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, } /* triangle 'icon' for panel header */ -static void ui_draw_tria_icon(float x, float y, float aspect, char dir) +void ui_draw_tria_icon(float x, float y, float aspect, char dir) { BIF_ThemeColor(TH_TEXT_HI); @@ -790,13 +783,12 @@ static void ui_draw_tria_icon(float x, float y, float aspect, char dir) } } -static void ui_draw_anti_x(float x1, float y1, float x2, float y2) +void ui_draw_anti_x(float x1, float y1, float x2, float y2) { /* set antialias line */ glEnable( GL_LINE_SMOOTH ); glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glLineWidth(2.0); @@ -1039,7 +1031,6 @@ void ui_draw_panel(uiBlock *block) uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8); // blend now for panels in 3d window, test... - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable(GL_BLEND); BIF_ThemeColor4(TH_PANEL); @@ -1070,7 +1061,6 @@ void ui_draw_panel(uiBlock *block) uiSetRoundBox(3); uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable(GL_BLEND); BIF_ThemeColor4(TH_PANEL); glRectf(block->minx, block->miny, block->maxx, block->maxy); @@ -1100,7 +1090,6 @@ void ui_draw_panel(uiBlock *block) /* and a soft shadow-line for now */ /* glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glColor4ub(0, 0, 0, 50); fdrawline(block->maxx, block->miny, block->maxx, block->maxy+PNL_HEADER/2); fdrawline(block->minx, block->miny, block->maxx, block->miny); diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c index 2eb71014e0f..1f6c94cf5b0 100644 --- a/source/blender/src/outliner.c +++ b/source/blender/src/outliner.c @@ -1033,8 +1033,9 @@ static int tree_element_active_material(SpaceOops *soops, TreeElement *te, int s } if(set) { extern_set_butspace(F5KEY); // force shading buttons - BIF_all_preview_changed(); + BIF_preview_changed(ID_MA); allqueue(REDRAWBUTSSHADING, 1); + allqueue(REDRAWNODE, 0); allqueue(REDRAWOOPS, 0); allqueue(REDRAWIPO, 0); } @@ -1128,7 +1129,7 @@ static int tree_element_active_lamp(SpaceOops *soops, TreeElement *te, int set) if(set) { extern_set_butspace(F5KEY); - BIF_all_preview_changed(); + BIF_preview_changed(ID_LA); allqueue(REDRAWBUTSSHADING, 1); allqueue(REDRAWOOPS, 0); allqueue(REDRAWIPO, 0); diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 650f4c87a58..5d58d19bad2 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -47,7 +47,6 @@ #endif #include "MEM_guardedalloc.h" #include "BLI_arithb.h" -#include "BKE_utildefines.h" #include "MTC_matrixops.h" @@ -60,6 +59,7 @@ #include "DNA_camera_types.h" #include "DNA_image_types.h" #include "DNA_material_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_lamp_types.h" #include "DNA_space_types.h" @@ -71,13 +71,16 @@ #include "BKE_icons.h" #include "BKE_texture.h" #include "BKE_material.h" +#include "BKE_node.h" #include "BKE_world.h" #include "BKE_texture.h" +#include "BKE_utildefines.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" #include "BSE_headerbuttons.h" +#include "BSE_node.h" #include "BIF_gl.h" #include "BIF_screen.h" @@ -101,8 +104,6 @@ #define PR_XMAX 200 #define PR_YMAX 195 -#define PREVIEW_RENDERSIZE 141; - #define PR_FACY (PR_YMAX-PR_YMIN-4)/(PR_RECTY) static rctf prerect; @@ -111,7 +112,7 @@ static float pr_facx, pr_facy; /* implementation */ -static short snijpunt(float *v1, float *v2, float *v3, float *rtlabda, float *ray1, float *ray2) +static short intersect(float *v1, float *v2, float *v3, float *rtlabda, float *ray1, float *ray2) { float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22; float m0,m1,m2,deeldet,det1,det2,det3; @@ -192,13 +193,13 @@ static int ray_previewrender(int x, int y, float *vec, float *vn, short pr_rec minlabda= 1.0f; for(a=0; a<totface; a++) { - if(snijpunt( rcubev[rcubi[a][0]], rcubev[rcubi[a][1]], rcubev[rcubi[a][2]], &labda, ray1, ray2)) { + if(intersect( rcubev[rcubi[a][0]], rcubev[rcubi[a][1]], rcubev[rcubi[a][2]], &labda, ray1, ray2)) { if( labda < minlabda) { minlabda= labda; hitface= a; } } - if(snijpunt( rcubev[rcubi[a][0]], rcubev[rcubi[a][2]], rcubev[rcubi[a][3]], &labda, ray1, ray2)) { + if(intersect( rcubev[rcubi[a][0]], rcubev[rcubi[a][2]], rcubev[rcubi[a][3]], &labda, ray1, ray2)) { if( labda < minlabda) { minlabda= labda; hitface= a; @@ -219,14 +220,13 @@ static int ray_previewrender(int x, int y, float *vec, float *vn, short pr_rec return 0; } - static unsigned int previewback(int type, int x, int y) { unsigned int col; char* pcol; /* checkerboard, for later - x+= PR_RECTX/2; + x+= PR_RECTX/2; y+= PR_RECTX/2; if( ((x/24) + (y/24)) & 1) return 0x40404040; else return 0xa0a0a0a0; @@ -246,7 +246,22 @@ static unsigned int previewback(int type, int x, int y) return col; } -void BIF_set_previewrect(int win, int xmin, int ymin, int xmax, int ymax, short pr_rectx, short pr_recty) +static float previewbackf(int type, int x, int y) +{ + float col; + + if(type & MA_DARK) { + if(abs(x)>abs(y)) col= 0.0f; + else col= 0.25f; + } + else { + if(abs(x)>abs(y)) col= 0.25f; + else col= 0.625f; + } + return col; +} + +void set_previewrect(int win, int xmin, int ymin, int xmax, int ymax, short pr_rectx, short pr_recty) { float pr_sizex, pr_sizey; @@ -279,7 +294,7 @@ void BIF_set_previewrect(int win, int xmin, int ymin, int xmax, int ymax, short } -void BIF_end_previewrect(void) +static void end_previewrect(void) { glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -301,11 +316,11 @@ static void display_pr_scanline(unsigned int *rect, int recty, short pr_rectx) if( (recty & 3)==3) { if(recty == 3) { - glaDrawPixelsSafe(prerect.xmin, prerect.ymin, pr_rectx, 4, rect); + glaDrawPixelsSafe(prerect.xmin, prerect.ymin, pr_rectx, 4, GL_UNSIGNED_BYTE, rect); } else { rect+= (recty-4)*pr_rectx; - glaDrawPixelsSafe(prerect.xmin, prerect.ymin + (((float)recty-4.0)*pr_facy), pr_rectx, 5, rect); + glaDrawPixelsSafe(prerect.xmin, prerect.ymin + (((float)recty-4.0)*pr_facy), pr_rectx, 5, GL_UNSIGNED_BYTE, rect); } } } @@ -342,47 +357,43 @@ static void draw_tex_crop(Tex *tex) } -void BIF_all_preview_changed(void) +void BIF_preview_changed(short id_code) { ScrArea *sa; - SpaceButs *sbuts; - sa= G.curscreen->areabase.first; - while(sa) { + for(sa= G.curscreen->areabase.first; sa; sa= sa->next) { if(sa->spacetype==SPACE_BUTS) { - sbuts= sa->spacedata.first; - if (sbuts->ri) sbuts->ri->cury= 0; - addafterqueue(sa->win, RENDERPREVIEW, 1); - } - sa= sa->next; - } -} - -/* signal all previews in current screen of current type */ -void BIF_preview_changed(SpaceButs *sbuts) -{ - - /* can be called when no buttonswindow visible */ - if(sbuts) { - ScrArea *sa; - short mainb= sbuts->mainb; - short tab= sbuts->tab[mainb]; - - sa= G.curscreen->areabase.first; - while(sa) { - if(sa->spacetype==SPACE_BUTS) { - sbuts= sa->spacedata.first; - if(sbuts->mainb==mainb && sbuts->tab[mainb]==tab) { + SpaceButs *sbuts= sa->spacedata.first; + if(sbuts->mainb==CONTEXT_SHADING) { + int tab= sbuts->tab[CONTEXT_SHADING]; + if(tab==TAB_SHADING_MAT && (id_code==ID_MA || id_code==ID_TE)) { + if (sbuts->ri) sbuts->ri->cury= 0; + addafterqueue(sa->win, RENDERPREVIEW, 1); + } + else if(tab==TAB_SHADING_TEX && (id_code==ID_TE)) { + if (sbuts->ri) sbuts->ri->cury= 0; + addafterqueue(sa->win, RENDERPREVIEW, 1); + } + else if(tab==TAB_SHADING_LAMP && (id_code==ID_LA || id_code==ID_TE)) { if (sbuts->ri) sbuts->ri->cury= 0; - addafterqueue(sbuts->area->win, RENDERPREVIEW, 1); + addafterqueue(sa->win, RENDERPREVIEW, 1); } + else if(tab==TAB_SHADING_WORLD && (id_code==ID_WO || id_code==ID_TE)) { + if (sbuts->ri) sbuts->ri->cury= 0; + addafterqueue(sa->win, RENDERPREVIEW, 1); + } + } + } + else if(sa->spacetype==SPACE_NODE) { + SpaceNode *snode= sa->spacedata.first; + if(snode->treetype==NTREE_SHADER && (id_code==ID_MA || id_code==ID_TE)) { + snode_tag_dirty(snode); } - sa= sa->next; } } } -void BIF_previewdraw_render(struct RenderInfo* ri, ScrArea* area) +static void previewdraw_render(struct RenderInfo* ri, ScrArea* area) { int y; @@ -395,28 +406,6 @@ void BIF_previewdraw_render(struct RenderInfo* ri, ScrArea* area) } } -/* is panel callback, supposed to be called with correct panel offset matrix */ -void BIF_previewdraw(void) -{ - SpaceButs *sbuts= curarea->spacedata.first; - - if (!sbuts->ri) { - sbuts->ri= MEM_callocN(sizeof(RenderInfo), "butsrenderinfo"); - sbuts->ri->cury = 0; - sbuts->ri->rect = 0; - sbuts->ri->pr_rectx = PREVIEW_RENDERSIZE; - sbuts->ri->pr_recty = PREVIEW_RENDERSIZE; - } - - if (sbuts->ri->rect==0) BIF_preview_changed(sbuts); - else { - BIF_set_previewrect(sbuts->area->win, PR_XMIN, PR_YMIN, PR_XMAX, PR_YMAX, sbuts->ri->pr_rectx, sbuts->ri->pr_recty); - BIF_previewdraw_render(sbuts->ri, sbuts->area); - BIF_end_previewrect(); - } - if(sbuts->ri->cury==0) BIF_preview_changed(sbuts); - -} static void sky_preview_pixel(float lens, int x, int y, char *rect, short pr_rectx, short pr_recty) { @@ -479,16 +468,16 @@ static void sky_preview_pixel(float lens, int x, int y, char *rect, short pr_rec the preview, because this only works for the current selected lamp. */ - static LampRen* create_preview_render_lamp(Lamp* la) - { +static LampRen* create_preview_render_lamp(Lamp* la) +{ LampRen *lar; int c; - + lar= (LampRen *)MEM_callocN(sizeof(LampRen),"lampren"); - + MTC_Mat3One(lar->mat); MTC_Mat3One(lar->imat); - + lar->type= la->type; lar->mode= la->mode; lar->energy= la->energy; @@ -500,25 +489,25 @@ static void sky_preview_pixel(float lens, int x, int y, char *rect, short pr_rec lar->dist= la->dist; lar->ld1= la->att1; lar->ld2= la->att2; - + /* exceptions: */ lar->spottexfac= 1.0; lar->spotsi= cos( M_PI/3.0 ); lar->spotbl= (1.0-lar->spotsi)*la->spotblend; MTC_Mat3One(lar->imat); - + if(lar->type==LA_SPOT) { if(lar->mode & LA_ONLYSHADOW) { if((lar->mode & (LA_SHAD|LA_SHAD_RAY))==0) lar->mode -= LA_ONLYSHADOW; } } memcpy(lar->mtex, la->mtex, MAX_MTEX*sizeof(void *)); - + for(c=0; c<MAX_MTEX; c++) { if(la->mtex[c] && la->mtex[c]->tex) { lar->mode |= LA_TEXTURE; - + if(R.flag & R_RENDERING) { if(R.osa) { if(la->mtex[c]->tex->type==TEX_IMAGE) lar->mode |= LA_OSATEX; @@ -526,7 +515,7 @@ static void sky_preview_pixel(float lens, int x, int y, char *rect, short pr_rec } } } - + return lar; } @@ -670,13 +659,13 @@ static void halo_preview_pixel(HaloRen *har, int startx, int endx, int y, char * if(dist<har->radsq) { RE_shadehalo(har, front, colf, 0, dist, xn, yn, har->flarec); RE_addalphaAddfac(rect, front, har->add); - rect[3] = 0xFF; + rect[3] = 0xFF; /* makes icon display all pixels */ } rect+= 4; } } -static void previewflare(RenderInfo *ri, HaloRen *har, short pr_rectx, short pr_recty, int doDraw) +static void previewflare(RenderInfo *ri, HaloRen *har, short pr_rectx, short pr_recty, int pr_method) { float ycor; unsigned int *rectot; @@ -707,8 +696,8 @@ static void previewflare(RenderInfo *ri, HaloRen *har, short pr_rectx, short pr_ // not sure why, either waitcursor or renderflare screws up (disabled then) //areawinset(curarea->win); - /* draw can just be this way, all settings are OK */ - if (doDraw) { + /* draw can just be called this way, all settings are OK */ + if (pr_method==PR_DRAW_RENDER) { for (y=0; y<pr_recty; y++) { display_pr_scanline(ri->rect, y, pr_rectx); } @@ -851,7 +840,7 @@ static void refraction_prv(int *x, int *y, float *n, float index) *y= (int)(len*(index*view[1] + fac*n[1])); } -static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_lamp) +static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr) { extern float fresnel_fac(float *view, float *vn, float ior, float fac); Material *mat= shi->mat; @@ -889,9 +878,19 @@ static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_la } else { + if(mat->texco & TEXCO_REFL) { + inp= -2.0*(shi->vn[0]*shi->view[0]+shi->vn[1]*shi->view[1]+shi->vn[2]*shi->view[2]); + shi->ref[0]= (shi->view[0]+inp*shi->vn[0]); + shi->ref[1]= (shi->view[1]+inp*shi->vn[1]); + shi->ref[2]= (shi->view[2]+inp*shi->vn[2]); + /* normals in render are pointing different... rhm */ + if(shi->pr_type==MA_SPHERE) + shi->ref[1]= -shi->ref[1]; + } + for(a=0; a<2; a++) { - if((pr_lamp & (1<<a))==0) continue; + if((mat->pr_lamp & (1<<a))==0) continue; if(a==0) la= pr1_lamp; else la= pr2_lamp; @@ -1000,6 +999,8 @@ static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_la shi->refcol[3]= shi->refcol[0]*0.8f*div; } } + else + shi->refcol[0]= 0.0f; shr->diff[0]+= shi->ambr; shr->diff[1]+= shi->ambg; @@ -1025,14 +1026,13 @@ static void shade_lamp_loop_preview(ShadeInput *shi, ShadeResult *shr, int pr_la } } -static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char *rect, int smooth, short pr_rectx, short pr_recty) +static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char *rect, short pr_rectx, short pr_recty) { Material *mat; MaterialLayer *ml; ShadeResult shr; - float v1, inp; - float eul[3], tmat[3][3], imat[3][3], col[3]; - char tracol; + float v1; + float eul[3], tmat[3][3], imat[3][3], col[4]; mat= shi->mat; @@ -1042,8 +1042,8 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char shi->view[2]= 1.0f; Normalise(shi->view); - shi->xs= (float)x; - shi->ys= (float)y; + shi->xs= x + pr_rectx/2; + shi->ys= y + pr_recty/2; shi->refcol[0]= shi->refcol[1]= shi->refcol[2]= shi->refcol[3]= 0.0f; VECCOPY(shi->co, vec); @@ -1092,22 +1092,10 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char shi->orn[1]= shi->vn[1]; shi->orn[2]= shi->vn[2]; } - if(mat->texco & TEXCO_REFL) { - - inp= -2.0*(shi->vn[0]*shi->view[0]+shi->vn[1]*shi->view[1]+shi->vn[2]*shi->view[2]); - shi->ref[0]= (shi->view[0]+inp*shi->vn[0]); - shi->ref[1]= (shi->view[1]+inp*shi->vn[1]); - shi->ref[2]= (shi->view[2]+inp*shi->vn[2]); - } /* Clear displase vec for preview */ shi->displace[0]= shi->displace[1]= shi->displace[2]= 0.0; - if(mat->texco & TEXCO_REFL) { - /* normals in render are pointing different... rhm */ - if(smooth) shi->ref[1]= -shi->ref[1]; - } - if(mat->pr_type==MA_CUBE) { /* rotate normal back for normals texture */ SWAP(float, shi->vn[0], shi->vn[1]); @@ -1127,24 +1115,29 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char /* ------ main shading loop with material layers */ VECCOPY(shi->vno, shi->vn); if(mat->ml_flag & ML_RENDER) - shade_lamp_loop_preview(shi, &shr, mat->pr_lamp); + shade_lamp_loop_preview(shi, &shr); else { memset(&shr, 0, sizeof(ShadeResult)); shr.alpha= 1.0f; } - for(ml= mat->layers.first; ml; ml= ml->next) { - if(ml->mat && (ml->flag & ML_RENDER)) { - ShadeResult shrlay; - - shi->mat= ml->mat; - shi->layerfac= ml->blendfac; - VECCOPY(shi->vn, shi->vno); - if(ml->flag & ML_NEG_NORMAL) - VecMulf(shi->vn, -1.0); - - shade_lamp_loop_preview(shi, &shrlay, mat->pr_lamp); - matlayer_blend(ml, shi->layerfac, &shr, &shrlay); + if(mat->nodetree && mat->use_nodes) { + ntreeShaderExecTree(mat->nodetree, shi, &shr); + } + else { + for(ml= mat->layers.first; ml; ml= ml->next) { + if(ml->mat && (ml->flag & ML_RENDER)) { + ShadeResult shrlay; + + shi->mat= ml->mat; + shi->layerfac= ml->blendfac; + VECCOPY(shi->vn, shi->vno); + if(ml->flag & ML_NEG_NORMAL) + VecMulf(shi->vn, -1.0); + + shade_lamp_loop_preview(shi, &shrlay); + matlayer_blend(ml, shi->layerfac, &shr, &shrlay); + } } } @@ -1160,34 +1153,40 @@ static void shade_preview_pixel(ShadeInput *shi, float *vec, int x, int y, char if(shr.diff[2]<0.0f) shr.diff[2]= 0.0f; VECADD(col, shr.diff, shr.spec); - if(col[0]<=0.0f) rect[0]= 0; else if(col[0]>=1.0f) rect[0]= 255; else rect[0]= (char)(255.0*col[0]); - if(col[1]<=0.0f) rect[1]= 0; else if(col[1]>=1.0f) rect[1]= 255; else rect[1]= (char)(255.0*col[1]); - if(col[2]<=0.0f) rect[2]= 0; else if(col[2]>=1.0f) rect[2]= 255; else rect[2]= (char)(255.0*col[2]); + col[3]= shr.alpha; - if(shr.alpha!=1.0f) { + /* handle backdrop now */ + + if(col[3]!=1.0f) { + float back, backm; + + /* distorts x and y */ if(mat->mode & MA_RAYTRANSP) { refraction_prv(&x, &y, shi->vn, shi->ang); } - tracol= previewback(mat->pr_back, x, y) & 255; - - tracol= (1.0f-shr.alpha)*tracol; + back= previewbackf(mat->pr_back, x, y); + backm= (1.0f-shr.alpha)*back; if((mat->mode & MA_RAYTRANSP) && mat->filter!=0.0) { float fr= 1.0f+ mat->filter*(shr.diff[0]-1.0f); - rect[0]= fr*tracol+ (rect[0]*shr.alpha) ; - fr= 1.0f+ mat->filter*(shr.diff[0]-1.0f); - rect[1]= fr*tracol+ (rect[1]*shr.alpha) ; - fr= 1.0f+ mat->filter*(shr.diff[0]-1.0f); - rect[2]= fr*tracol+ (rect[2]*shr.alpha) ; + col[0]= fr*backm+ (col[3]*col[0]); + fr= 1.0f+ mat->filter*(shr.diff[1]-1.0f); + col[1]= fr*backm+ (col[3]*col[1]); + fr= 1.0f+ mat->filter*(shr.diff[2]-1.0f); + col[2]= fr*backm+ (col[3]*col[2]); } else { - rect[0]= tracol+ (rect[0]*shr.alpha) ; - rect[1]= tracol+ (rect[1]*shr.alpha) ; - rect[2]= tracol+ (rect[2]*shr.alpha) ; + col[0]= backm + (col[3]*col[0]); + col[1]= backm + (col[3]*col[1]); + col[2]= backm + (col[3]*col[2]); } } - rect[3] = 0xFF; + + if(col[0]<=0.0f) rect[0]= 0; else if(col[0]>=1.0f) rect[0]= 255; else rect[0]= (char)(255.0f*col[0]); + if(col[1]<=0.0f) rect[1]= 0; else if(col[1]>=1.0f) rect[1]= 255; else rect[1]= (char)(255.0f*col[1]); + if(col[2]<=0.0f) rect[2]= 0; else if(col[2]>=1.0f) rect[2]= 255; else rect[2]= (char)(255.0f*col[2]); + if(col[3]<=0.0f) rect[3]= 0; else if(col[3]>=1.0f) rect[3]= 255; else rect[3]= (char)(255.0f*col[3]); } static void preview_init_render_textures(MTex **mtex) @@ -1210,65 +1209,8 @@ static void preview_init_render_textures(MTex **mtex) } -void BIF_previewrender_buts(SpaceButs *sbuts) -{ - uiBlock *block; - struct ID* id = 0; - struct ID* idfrom = 0; - struct ID* idshow = 0; - Object *ob; - - if (!sbuts->ri) return; - - /* we safely assume curarea has panel "preview" */ - /* quick hack for now, later on preview should become uiBlock itself */ - - block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Preview"); - if(block==NULL) return; - - ob= ((G.scene->basact)? (G.scene->basact)->object: 0); - - /* we cant trust this global lockpoin.. for example with headerless window */ - buttons_active_id(&id, &idfrom); - G.buts->lockpoin= id; - - if(sbuts->mainb==CONTEXT_SHADING) { - int tab= sbuts->tab[CONTEXT_SHADING]; - - if(tab==TAB_SHADING_MAT) - idshow = sbuts->lockpoin; - else if(tab==TAB_SHADING_TEX) - idshow = sbuts->lockpoin; - else if(tab==TAB_SHADING_LAMP) { - if(ob && ob->type==OB_LAMP) idshow= ob->data; - } - else if(tab==TAB_SHADING_WORLD) - idshow = sbuts->lockpoin; - } - else if(sbuts->mainb==CONTEXT_OBJECT) { - if(ob && ob->type==OB_LAMP) idshow = ob->data; - } - - if (idshow) { - BKE_icon_changed(BKE_icon_getid(idshow)); - uiPanelPush(block); - BIF_set_previewrect(sbuts->area->win, PR_XMIN, PR_YMIN, PR_XMAX, PR_YMAX, sbuts->ri->pr_rectx, sbuts->ri->pr_recty); // uses UImat - BIF_previewrender(idshow, sbuts->ri, sbuts->area, 1); - uiPanelPop(block); - BIF_end_previewrect(); - } - else { - /* no active block to draw. But we do draw black if possible */ - if(sbuts->ri->rect) { - memset(sbuts->ri->rect, 0, sizeof(int)*sbuts->ri->pr_rectx*sbuts->ri->pr_recty); - sbuts->ri->cury= sbuts->ri->pr_recty; - addqueue(curarea->win, REDRAW, 1); - } - return; - } -} - -void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *area, int doDraw) +/* main previewrender loop */ +void BIF_previewrender(struct ID *id, struct RenderInfo *ri, struct ScrArea *area, int pr_method) { static double lasttime= 0; Material *mat= NULL; @@ -1303,9 +1245,9 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are } har.flarec= 0; /* below is a test for postrender flare */ - - if(doDraw && qtest()) { + /* no event escape for icon render */ + if(pr_method!=PR_ICON_RENDER && qtest()) { addafterqueue(curarea->win, RENDERPREVIEW, 1); return; } @@ -1331,11 +1273,33 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are mat->texco |= ml->mat->texco; } } - + if(mat->nodetree && mat->use_nodes) { + bNode *node; + for(node=mat->nodetree->nodes.first; node; node= node->next) { + if(node->id && GS(node->id->name)==ID_MA) { + Material *ma= (Material *)node->id; + init_render_material(ma); + preview_init_render_textures(ma->mtex); + mat->texco |= ma->texco; + } + } + /* signal to node editor to store previews or not */ + if(pr_method==PR_ICON_RENDER) { + ntreeBeginExecTree(mat->nodetree, 0, 0); + shi.do_preview= 0; + } + else { + ntreeBeginExecTree(mat->nodetree, ri->pr_rectx, ri->pr_recty); + shi.do_preview= 1; + } + } shi.vlr= NULL; shi.mat= mat; - + shi.pr_type= mat->pr_type; + if(mat->mode & MA_HALO) init_previewhalo(&har, mat, ri->pr_rectx, ri->pr_recty); + + set_node_shader_lamp_loop(shade_lamp_loop_preview); } else if(tex) { @@ -1384,39 +1348,18 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are preview_init_render_textures(wrld->mtex); } - if (doDraw) { - /* BIF_set_previewrect(area->win, PR_XMIN, PR_YMIN, PR_XMAX, PR_YMAX, ri->pr_rectx, ri->pr_recty); // uses UImat */ - } - if(ri->rect==NULL) { ri->rect= MEM_callocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "butsrect"); - - /* built in emboss */ - if (doDraw) { - rect= ri->rect; - for(y=0; y<ri->pr_recty; y++, rect++) *rect= 0xFFFFFFFF; - - rect= ri->rect + ri->pr_rectx-1; - for(y=0; y<ri->pr_recty; y++, rect+=ri->pr_rectx) *rect= 0xFFFFFFFF; - } } starty= -ri->pr_recty/2; endy= starty+ri->pr_recty; starty+= ri->cury; - if (doDraw) { - /* offset +1 for emboss */ - startx= -ri->pr_rectx/2 +1; - endx= startx+ri->pr_rectx -2; - } - else { - /* offset +1 for emboss */ - startx= -ri->pr_rectx/2; - endx= startx+ri->pr_rectx-1; - } + startx= -ri->pr_rectx/2; + endx= startx+ri->pr_rectx; - radsq= (ri->pr_rectx/2-1)*(ri->pr_recty/2-1); /* -1 to make sure sphere fits into preview rect completely */ + radsq= (ri->pr_rectx/2)*(ri->pr_recty/2); if(mat) { if(mat->pr_type==MA_SPHERE) { @@ -1429,24 +1372,23 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are } } - /* here it starts! */ - if (doDraw) glDrawBuffer(GL_FRONT); + if (pr_method==PR_DRAW_RENDER) + glDrawBuffer(GL_FRONT); + /* here it starts! */ for(y=starty; y<endy; y++) { - rect= ri->rect + 1 + ri->pr_rectx*ri->cury; + rect= ri->rect + ri->pr_rectx*ri->cury; - if(y== -ri->pr_recty/2 || y==endy-1); /* emboss */ - else if(mat) { + if(mat) { if(mat->mode & MA_HALO) { for(x=startx; x<endx; x++, rect++) { rect[0]= previewback(mat->pr_back, x, y); - rect[0] |= 0xFF000000; } if(har.flarec) { - if(y==endy-2) previewflare(ri, &har, ri->pr_rectx, ri->pr_recty, doDraw); + if(y==endy-2) previewflare(ri, &har, ri->pr_rectx, ri->pr_recty, pr_method); } else { halo_preview_pixel(&har, startx, endx, y, (char *) (rect-ri->pr_rectx), ri->pr_rectx); @@ -1476,19 +1418,25 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are Normalise(shi.tang); } - shade_preview_pixel(&shi, vec, x, y, (char *)rect, 1, ri->pr_rectx, ri->pr_recty); + shade_preview_pixel(&shi, vec, x, y, (char *)rect, ri->pr_rectx, ri->pr_recty); } else { rect[0]= previewback(mat->pr_back, x, y); + + if(pr_method!=PR_ICON_RENDER && mat->nodetree && mat->use_nodes) + ntreeClearPixelTree(mat->nodetree, x+ri->pr_rectx/2, y+ri->pr_recty/2); } } else if(mat->pr_type==MA_CUBE) { if( ray_previewrender(x, y, vec, shi.vn, ri->pr_rectx, ri->pr_recty) ) { - shade_preview_pixel(&shi, vec, x, y, (char *)rect, 0, ri->pr_rectx, ri->pr_recty); + shade_preview_pixel(&shi, vec, x, y, (char *)rect, ri->pr_rectx, ri->pr_recty); } else { rect[0]= previewback(mat->pr_back, x, y); + + if(pr_method!=PR_ICON_RENDER && mat->nodetree && mat->use_nodes) + ntreeClearPixelTree(mat->nodetree, x+ri->pr_rectx/2, y+ri->pr_recty/2); } } else { @@ -1499,7 +1447,7 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are shi.vn[0]= shi.vn[1]= 0.0f; shi.vn[2]= 1.0f; - shade_preview_pixel(&shi, vec, x, y, (char *)rect, 0, ri->pr_rectx, ri->pr_recty); + shade_preview_pixel(&shi, vec, x, y, (char *)rect, ri->pr_rectx, ri->pr_recty); } } } @@ -1520,7 +1468,7 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are } } - if (doDraw) { + if (pr_method!=PR_ICON_RENDER) { if(y<endy-2) { if(qtest()) { addafterqueue(curarea->win, RENDERPREVIEW, 1); @@ -1538,15 +1486,13 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are ri->cury++; } - if (doDraw) { - /* BIF_end_previewrect(); */ - + if (pr_method==PR_DRAW_RENDER) { if(ri->cury>=ri->pr_recty && tex) - draw_tex_crop((Tex*)id); + draw_tex_crop((Tex*)id); glDrawBuffer(GL_BACK); /* draw again for clean swapbufers */ - BIF_previewdraw_render(ri, area); + previewdraw_render(ri, area); } if(lar) { @@ -1556,59 +1502,99 @@ void BIF_previewrender(struct ID* id, struct RenderInfo *ri, struct ScrArea *are R.lights.first= R.lights.last= NULL; */ } + + if(mat && mat->nodetree && mat->use_nodes) { + ntreeEndExecTree(mat->nodetree); + if(ri->cury>=ri->pr_recty) + allqueue(REDRAWNODE, 0); + } } -/* create single icon from jpg, png etc. */ -void BIF_calcpreview_image(Image* img, RenderInfo* ri, unsigned int w, unsigned int h) +void BIF_previewrender_buts(SpaceButs *sbuts) { - struct ImBuf *ima; - struct ImBuf *imb; - short ex, ey, dx, dy; - float scaledx, scaledy; - int pr_size = w*h*sizeof(unsigned int); - - if (!img) - return; - - if (!ri->rect) { - ri->rect= MEM_callocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "butsrect"); - memset(ri->rect, 0xFF, w*h*sizeof(unsigned int)); + uiBlock *block; + struct ID* id = 0; + struct ID* idfrom = 0; + struct ID* idshow = 0; + Object *ob; + + if (!sbuts->ri) return; + + /* we safely assume curarea has panel "preview" */ + /* quick hack for now, later on preview should become uiBlock itself */ + + block= uiFindOpenPanelBlockName(&curarea->uiblocks, "Preview"); + if(block==NULL) return; + + ob= ((G.scene->basact)? (G.scene->basact)->object: 0); + + /* we cant trust this global lockpoin.. for example with headerless window */ + buttons_active_id(&id, &idfrom); + G.buts->lockpoin= id; + + if(sbuts->mainb==CONTEXT_SHADING) { + int tab= sbuts->tab[CONTEXT_SHADING]; + + if(tab==TAB_SHADING_MAT) + idshow = sbuts->lockpoin; + else if(tab==TAB_SHADING_TEX) + idshow = sbuts->lockpoin; + else if(tab==TAB_SHADING_LAMP) { + if(ob && ob->type==OB_LAMP) idshow= ob->data; + } + else if(tab==TAB_SHADING_WORLD) + idshow = sbuts->lockpoin; } - - if(img->ibuf==0) { - load_image(img, IB_rect, G.sce, G.scene->r.cfra); + else if(sbuts->mainb==CONTEXT_OBJECT) { + if(ob && ob->type==OB_LAMP) idshow = ob->data; } - ima = IMB_dupImBuf(img->ibuf); - - if (!ima) + + if (idshow) { + BKE_icon_changed(BKE_icon_getid(idshow)); + uiPanelPush(block); + set_previewrect(sbuts->area->win, PR_XMIN, PR_YMIN, PR_XMAX, PR_YMAX, sbuts->ri->pr_rectx, sbuts->ri->pr_recty); // uses UImat + BIF_previewrender(idshow, sbuts->ri, sbuts->area, PR_DRAW_RENDER); + uiPanelPop(block); + end_previewrect(); + } + else { + /* no active block to draw. But we do draw black if possible */ + if(sbuts->ri->rect) { + memset(sbuts->ri->rect, 0, sizeof(int)*sbuts->ri->pr_rectx*sbuts->ri->pr_recty); + sbuts->ri->cury= sbuts->ri->pr_recty; + addqueue(curarea->win, REDRAW, 1); + } return; + } +} - if (ima->x > ima->y) { - scaledx = (float)w; - scaledy = ( (float)ima->y/(float)ima->x )*(float)w; +/* is panel callback, supposed to be called with correct panel offset matrix */ +void BIF_previewdraw(void) +{ + SpaceButs *sbuts= curarea->spacedata.first; + short id_code= 0; + + if(sbuts->lockpoin) { + ID *id= sbuts->lockpoin; + id_code= GS(id->name); } - else { - scaledx = ( (float)ima->x/(float)ima->y )*(float)h; - scaledy = (float)h; + + if (!sbuts->ri) { + sbuts->ri= MEM_callocN(sizeof(RenderInfo), "butsrenderinfo"); + sbuts->ri->cury = 0; + sbuts->ri->rect = NULL; + sbuts->ri->pr_rectx = PREVIEW_RENDERSIZE; + sbuts->ri->pr_recty = PREVIEW_RENDERSIZE; } - - ex = (short)scaledx; - ey = (short)scaledy; - dx = (w - ex) / 2; - dy = (h - ey) / 2; + if (sbuts->ri->rect==NULL) BIF_preview_changed(id_code); + else { + set_previewrect(sbuts->area->win, PR_XMIN, PR_YMIN, PR_XMAX, PR_YMAX, sbuts->ri->pr_rectx, sbuts->ri->pr_recty); + previewdraw_render(sbuts->ri, sbuts->area); + end_previewrect(); + } + if(sbuts->ri->cury==0) BIF_preview_changed(id_code); - IMB_scaleImBuf(ima, ex, ey); - - imb = IMB_allocImBuf(w, h, 32, IB_rect, 0); - - IMB_rectop(imb, 0, 0, 0, 0, 0, w, h, IMB_rectfill, 0x00000000); - - IMB_rectop(imb, ima, dx, dy, 0, 0, ex, ey, IMB_rectcpy, 0); - - IMB_freeImBuf(ima); +} - memcpy(ri->rect, imb->rect,pr_size); - IMB_freeImBuf(imb); -} diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c index 637c018587d..ae6ffee5df5 100644 --- a/source/blender/src/renderwin.c +++ b/source/blender/src/renderwin.c @@ -329,16 +329,16 @@ static void renderwin_draw(RenderWin *rw, int just_clear) char *rect= (char *)R.rectot; glColorMask(1, 0, 0, 0); - glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+3); + glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+3); glColorMask(0, 1, 0, 0); - glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+2); + glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+2); glColorMask(0, 0, 1, 0); - glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+1); + glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+1); glColorMask(1, 1, 1, 1); } else { - glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, R.rectot); + glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, R.rectot); } glPixelZoom(1.0, 1.0); } @@ -743,7 +743,7 @@ static void renderwin_progress(RenderWin *rw, int start_y, int nlines, int rect_ glDrawBuffer(GL_FRONT); glPixelZoom(rw->zoom, rw->zoom); - glaDrawPixelsSafe(disprect[0][0], disprect[0][1] + start_y*rw->zoom, rect_w, nlines, &rect[start_y*rect_w*4]); + glaDrawPixelsSafe(disprect[0][0], disprect[0][1] + start_y*rw->zoom, rect_w, nlines, GL_UNSIGNED_BYTE, &rect[start_y*rect_w*4]); glPixelZoom(1.0, 1.0); glFlush(); glDrawBuffer(GL_BACK); @@ -830,7 +830,7 @@ static void renderview_progress_display_cb(int y1, int y2, int w, int h, unsigne sy= vb.ymin + facy*y1; glPixelZoom(facx, facy); - glaDrawPixelsSafe(sx, sy, w, nlines, rect+w*y1); + glaDrawPixelsSafe(sx, sy, w, nlines, GL_UNSIGNED_BYTE, rect+w*y1); glPixelZoom(1.0, 1.0); glFlush(); @@ -1090,7 +1090,7 @@ static void do_render(View3D *ogl_render_view3d, int anim, int force_dispwin) /* after an envmap creation... */ if(R.flag & R_REDRAW_PRV) { - BIF_all_preview_changed(); + BIF_preview_changed(ID_TE); } allqueue(REDRAWBUTSSCENE, 0); // visualize fbuf for example } diff --git a/source/blender/src/resources.c b/source/blender/src/resources.c index c206f12d01f..6049c34b31e 100644 --- a/source/blender/src/resources.c +++ b/source/blender/src/resources.c @@ -185,6 +185,9 @@ char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) case SPACE_TIME: ts= &btheme->ttime; break; + case SPACE_NODE: + ts= &btheme->tnode; + break; default: ts= &btheme->tv3d; break; @@ -272,6 +275,17 @@ char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid) case TH_SYNTAX_N: cp= ts->syntaxn; break; + case TH_NODE: + cp= ts->syntaxl; break; + case TH_NODE_IN_OUT: + cp= ts->syntaxn; break; + case TH_NODE_OPERATOR: + cp= ts->syntaxb; break; + case TH_NODE_GENERATOR: + cp= ts->syntaxv; break; + case TH_NODE_FREE: + cp= ts->syntaxc; break; + } } @@ -463,6 +477,15 @@ void BIF_InitTheme(void) /* space time */ btheme->ttime= btheme->tsnd; // same as sound space + + /* space node, re-uses syntax color storage */ + btheme->tnode= btheme->tv3d; + SETCOL(btheme->tnode.syntaxl, 120, 120, 120, 255); /* TH_NODE */ + SETCOL(btheme->tnode.syntaxn, 110, 110, 120, 255); /* in-out */ + SETCOL(btheme->tnode.syntaxb, 140, 140, 140, 255); /* operator */ + SETCOL(btheme->tnode.syntaxv, 120, 120, 120, 255); /* generator */ + SETCOL(btheme->tnode.syntaxc, 120, 120, 120, 255); /* free */ + } char *BIF_ThemeColorsPup(int spacetype) @@ -590,6 +613,14 @@ char *BIF_ThemeColorsPup(int spacetype) else if(spacetype==SPACE_TIME) { sprintf(str, "Grid %%x%d|", TH_GRID); strcat(cp, str); } + else if(spacetype==SPACE_NODE) { + strcat(cp,"%l|"); + sprintf(str, "Default Node %%x%d|", TH_NODE); strcat(cp, str); + sprintf(str, "In/Out Node %%x%d|", TH_NODE_IN_OUT); strcat(cp, str); + sprintf(str, "Operator Node %%x%d|", TH_NODE_OPERATOR); strcat(cp, str); + sprintf(str, "Generator Node %%x%d|", TH_NODE_GENERATOR); strcat(cp, str); +// sprintf(str, " %%x%d|", TH_NODE_FREE); strcat(cp, str); + } } return cp; } diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 159d3e0e7ff..f94a459bfad 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -3362,11 +3362,12 @@ void extern_set_butspace(int fkey) sbuts->mainb= CONTEXT_SHADING; sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT; } - + BIF_preview_changed(ID_TE); } else if(fkey==F6KEY) { sbuts->mainb= CONTEXT_SHADING; sbuts->tab[CONTEXT_SHADING]= TAB_SHADING_TEX; + BIF_preview_changed(ID_TE); } else if(fkey==F7KEY) { /* if it's already in object context, cycle between tabs with the same key */ @@ -3403,7 +3404,6 @@ void extern_set_butspace(int fkey) scrarea_queue_headredraw(sa); scrarea_queue_winredraw(sa); - BIF_preview_changed(sbuts); } /* ******************** SPACE: SEQUENCE ********************** */ @@ -4639,9 +4639,7 @@ void freespacelist(ListBase *lb) free_soundspace((SpaceSound *)sl); } else if(sl->spacetype==SPACE_NODE) { - SpaceNode *snode= (SpaceNode *)sl; - if(snode->nodetree) - nodeFreeTree(snode->nodetree); +/* SpaceNode *snode= (SpaceNode *)sl; */ } } diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c index a6f51f92c2d..52d853cd984 100644 --- a/source/blender/src/usiblender.c +++ b/source/blender/src/usiblender.c @@ -96,10 +96,11 @@ #include "BIF_cursors.h" #include "BSE_drawview.h" -#include "BSE_headerbuttons.h" +#include "BSE_edit.h" #include "BSE_editipo.h" #include "BSE_filesel.h" -#include "BSE_edit.h" +#include "BSE_headerbuttons.h" +#include "BSE_node.h" #include "BLO_readfile.h" #include "BLO_writefile.h" @@ -265,10 +266,23 @@ static void init_userdef_file(void) 255); } } - if(U.obcenter_dia==0) U.obcenter_dia= 6; } - + if (G.main->versionfile <= 240) { + bTheme *btheme; + for(btheme= U.themes.first; btheme; btheme= btheme->next) { + /* Node editor theme, check for alpha==0 is safe, then color was never set */ + if(btheme->tnode.syntaxn[3]==0) { + /* re-uses syntax color storage */ + btheme->tnode= btheme->tv3d; + SETCOL(btheme->tnode.syntaxl, 120, 120, 120, 255); /* TH_NODE */ + SETCOL(btheme->tnode.syntaxn, 110, 110, 120, 255); /* in-out */ + SETCOL(btheme->tnode.syntaxb, 140, 140, 140, 255); /* operator */ + SETCOL(btheme->tnode.syntaxv, 120, 120, 120, 255); /* generator */ + SETCOL(btheme->tnode.syntaxc, 120, 120, 120, 255); /* free */ + } + } + } if (U.undosteps==0) U.undosteps=32; @@ -660,6 +674,7 @@ void BIF_init(void) initbuttons(); InitCursorData(); sound_init_listener(); + init_node_butfuncs(); BIF_read_homefile(); init_gl_stuff(); /* drawview.c, after homefile */ |