├── Makefile ├── README ├── amptjp-bal.rep ├── binary-bal.rep ├── binary2-bal.rep ├── cccp-bal.rep ├── clock.c ├── clock.h ├── coalescing-bal.rep ├── config.h ├── cp-decl-bal.rep ├── double-free.rep ├── expr-bal.rep ├── fcyc.c ├── fcyc.h ├── fsecs.c ├── fsecs.h ├── ftimer.c ├── ftimer.h ├── mdriver.c ├── memlib.c ├── memlib.h ├── memory-leak.rep ├── mm.c ├── mm.h ├── random-bal.rep ├── random2-bal.rep ├── random3-bal.rep ├── random4-bal.rep ├── random5-bal.rep ├── result.txt ├── short1-bal.rep └── short2-bal.rep /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Students' Makefile for the Malloc Lab 3 | # 4 | TEAM = bovik 5 | VERSION = 1 6 | HANDINDIR = /afs/cs.cmu.edu/academic/class/15213-f01/malloclab/handin 7 | 8 | CC = gcc 9 | CFLAGS = -Wall -O2 -m32 10 | 11 | OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o 12 | 13 | mdriver: $(OBJS) 14 | $(CC) $(CFLAGS) -o mdriver $(OBJS) 15 | 16 | mdriver.o: mdriver.c fsecs.h fcyc.h clock.h memlib.h config.h mm.h 17 | memlib.o: memlib.c memlib.h 18 | mm.o: mm.c mm.h memlib.h 19 | fsecs.o: fsecs.c fsecs.h config.h 20 | fcyc.o: fcyc.c fcyc.h 21 | ftimer.o: ftimer.c ftimer.h config.h 22 | clock.o: clock.c clock.h 23 | 24 | handin: 25 | cp mm.c $(HANDINDIR)/$(TEAM)-$(VERSION)-mm.c 26 | 27 | clean: 28 | rm -f *~ *.o mdriver 29 | 30 | 31 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | =============================================================================== 2 | M1522.000800 System Programmig Spring 2015 3 | =============================================================================== 4 | Malloc Lab 5 | =============================================================================== 6 | 7 | based on the CS:APP Malloc Lab (c) by R.Bryant and D.O'Hallaron. 8 | 9 | 10 | Directions to Students 11 | ---------------------- 12 | 13 | In this lab you write a dynamic storage allocator for C programs. The goal is 14 | to implement an allocator that is correct, efficient, and fast. 15 | 16 | 17 | 0. Files: 18 | --------- 19 | 20 | mm.{c,h} Your solution malloc package. mm.c is the file that you 21 | will be handing in, and is the only file you should modify. 22 | mdriver.c The malloc driver that tests your mm.c file. 23 | *-bal.rep Tracefiles to test your implementation. 24 | Makefile Builds the driver 25 | 26 | Other support files for the driver: 27 | 28 | config.h Configures the malloc lab driver 29 | fsecs.{c,h} Wrapper function for the different timer packages 30 | clock.{c,h} Routines for accessing the Pentium and Alpha cycle counters 31 | fcyc.{c,h} Timer functions based on cycle counters 32 | ftimer.{c,h} Timer functions based on interval timers and gettimeofday() 33 | memlib.{c,h} Models the heap and sbrk function 34 | 35 | 36 | 1. Building and running the driver 37 | ---------------------------------- 38 | 39 | To build the driver, type "make" to the shell. 40 | 41 | To run the driver on a tiny test trace: 42 | 43 | unix> mdriver -V -f short1-bal.rep 44 | 45 | The -V option prints out helpful tracing and summary information. 46 | 47 | To get a list of the driver flags: 48 | 49 | unix> mdriver -h 50 | -------------------------------------------------------------------------------- /clock.c: -------------------------------------------------------------------------------- 1 | /* 2 | * clock.c - Routines for using the cycle counters on x86, 3 | * Alpha, and Sparc boxes. 4 | * 5 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 6 | * May not be used, modified, or copied without permission. 7 | */ 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include "clock.h" 14 | 15 | 16 | /******************************************************* 17 | * Machine dependent functions 18 | * 19 | * Note: the constants __i386__ and __alpha 20 | * are set by GCC when it calls the C preprocessor 21 | * You can verify this for yourself using gcc -v. 22 | *******************************************************/ 23 | 24 | #if defined(__i386__) 25 | /******************************************************* 26 | * Pentium versions of start_counter() and get_counter() 27 | *******************************************************/ 28 | 29 | 30 | /* $begin x86cyclecounter */ 31 | /* Initialize the cycle counter */ 32 | static unsigned cyc_hi = 0; 33 | static unsigned cyc_lo = 0; 34 | 35 | 36 | /* Set *hi and *lo to the high and low order bits of the cycle counter. 37 | Implementation requires assembly code to use the rdtsc instruction. */ 38 | void access_counter(unsigned *hi, unsigned *lo) 39 | { 40 | asm("rdtsc; movl %%edx,%0; movl %%eax,%1" /* Read cycle counter */ 41 | : "=r" (*hi), "=r" (*lo) /* and move results to */ 42 | : /* No input */ /* the two outputs */ 43 | : "%edx", "%eax"); 44 | } 45 | 46 | /* Record the current value of the cycle counter. */ 47 | void start_counter() 48 | { 49 | access_counter(&cyc_hi, &cyc_lo); 50 | } 51 | 52 | /* Return the number of cycles since the last call to start_counter. */ 53 | double get_counter() 54 | { 55 | unsigned ncyc_hi, ncyc_lo; 56 | unsigned hi, lo, borrow; 57 | double result; 58 | 59 | /* Get cycle counter */ 60 | access_counter(&ncyc_hi, &ncyc_lo); 61 | 62 | /* Do double precision subtraction */ 63 | lo = ncyc_lo - cyc_lo; 64 | borrow = lo > ncyc_lo; 65 | hi = ncyc_hi - cyc_hi - borrow; 66 | result = (double) hi * (1 << 30) * 4 + lo; 67 | if (result < 0) { 68 | fprintf(stderr, "Error: counter returns neg value: %.0f\n", result); 69 | } 70 | return result; 71 | } 72 | /* $end x86cyclecounter */ 73 | 74 | #elif defined(__alpha) 75 | 76 | /**************************************************** 77 | * Alpha versions of start_counter() and get_counter() 78 | ***************************************************/ 79 | 80 | /* Initialize the cycle counter */ 81 | static unsigned cyc_hi = 0; 82 | static unsigned cyc_lo = 0; 83 | 84 | 85 | /* Use Alpha cycle timer to compute cycles. Then use 86 | measured clock speed to compute seconds 87 | */ 88 | 89 | /* 90 | * counterRoutine is an array of Alpha instructions to access 91 | * the Alpha's processor cycle counter. It uses the rpcc 92 | * instruction to access the counter. This 64 bit register is 93 | * divided into two parts. The lower 32 bits are the cycles 94 | * used by the current process. The upper 32 bits are wall 95 | * clock cycles. These instructions read the counter, and 96 | * convert the lower 32 bits into an unsigned int - this is the 97 | * user space counter value. 98 | * NOTE: The counter has a very limited time span. With a 99 | * 450MhZ clock the counter can time things for about 9 100 | * seconds. */ 101 | static unsigned int counterRoutine[] = 102 | { 103 | 0x601fc000u, 104 | 0x401f0000u, 105 | 0x6bfa8001u 106 | }; 107 | 108 | /* Cast the above instructions into a function. */ 109 | static unsigned int (*counter)(void)= (void *)counterRoutine; 110 | 111 | 112 | void start_counter() 113 | { 114 | /* Get cycle counter */ 115 | cyc_hi = 0; 116 | cyc_lo = counter(); 117 | } 118 | 119 | double get_counter() 120 | { 121 | unsigned ncyc_hi, ncyc_lo; 122 | unsigned hi, lo, borrow; 123 | double result; 124 | ncyc_lo = counter(); 125 | ncyc_hi = 0; 126 | lo = ncyc_lo - cyc_lo; 127 | borrow = lo > ncyc_lo; 128 | hi = ncyc_hi - cyc_hi - borrow; 129 | result = (double) hi * (1 << 30) * 4 + lo; 130 | if (result < 0) { 131 | fprintf(stderr, "Error: Cycle counter returning negative value: %.0f\n", result); 132 | } 133 | return result; 134 | } 135 | 136 | #else 137 | 138 | /**************************************************************** 139 | * All the other platforms for which we haven't implemented cycle 140 | * counter routines. Newer models of sparcs (v8plus) have cycle 141 | * counters that can be accessed from user programs, but since there 142 | * are still many sparc boxes out there that don't support this, we 143 | * haven't provided a Sparc version here. 144 | ***************************************************************/ 145 | 146 | void start_counter() 147 | { 148 | printf("ERROR: You are trying to use a start_counter routine in clock.c\n"); 149 | printf("that has not been implemented yet on this platform.\n"); 150 | printf("Please choose another timing package in config.h.\n"); 151 | exit(1); 152 | } 153 | 154 | double get_counter() 155 | { 156 | printf("ERROR: You are trying to use a get_counter routine in clock.c\n"); 157 | printf("that has not been implemented yet on this platform.\n"); 158 | printf("Please choose another timing package in config.h.\n"); 159 | exit(1); 160 | } 161 | #endif 162 | 163 | 164 | 165 | 166 | /******************************* 167 | * Machine-independent functions 168 | ******************************/ 169 | double ovhd() 170 | { 171 | /* Do it twice to eliminate cache effects */ 172 | int i; 173 | double result; 174 | 175 | for (i = 0; i < 2; i++) { 176 | start_counter(); 177 | result = get_counter(); 178 | } 179 | return result; 180 | } 181 | 182 | /* $begin mhz */ 183 | /* Estimate the clock rate by measuring the cycles that elapse */ 184 | /* while sleeping for sleeptime seconds */ 185 | double mhz_full(int verbose, int sleeptime) 186 | { 187 | double rate; 188 | 189 | start_counter(); 190 | sleep(sleeptime); 191 | rate = get_counter() / (1e6*sleeptime); 192 | if (verbose) 193 | printf("Processor clock rate ~= %.1f MHz\n", rate); 194 | return rate; 195 | } 196 | /* $end mhz */ 197 | 198 | /* Version using a default sleeptime */ 199 | double mhz(int verbose) 200 | { 201 | return mhz_full(verbose, 2); 202 | } 203 | 204 | /** Special counters that compensate for timer interrupt overhead */ 205 | 206 | static double cyc_per_tick = 0.0; 207 | 208 | #define NEVENT 100 209 | #define THRESHOLD 1000 210 | #define RECORDTHRESH 3000 211 | 212 | /* Attempt to see how much time is used by timer interrupt */ 213 | static void callibrate(int verbose) 214 | { 215 | double oldt; 216 | struct tms t; 217 | clock_t oldc; 218 | int e = 0; 219 | 220 | times(&t); 221 | oldc = t.tms_utime; 222 | start_counter(); 223 | oldt = get_counter(); 224 | while (e = THRESHOLD) { 228 | clock_t newc; 229 | times(&t); 230 | newc = t.tms_utime; 231 | if (newc > oldc) { 232 | double cpt = (newt-oldt)/(newc-oldc); 233 | if ((cyc_per_tick == 0.0 || cyc_per_tick > cpt) && cpt > RECORDTHRESH) 234 | cyc_per_tick = cpt; 235 | /* 236 | if (verbose) 237 | printf("Saw event lasting %.0f cycles and %d ticks. Ratio = %f\n", 238 | newt-oldt, (int) (newc-oldc), cpt); 239 | */ 240 | e++; 241 | oldc = newc; 242 | } 243 | oldt = newt; 244 | } 245 | } 246 | if (verbose) 247 | printf("Setting cyc_per_tick to %f\n", cyc_per_tick); 248 | } 249 | 250 | static clock_t start_tick = 0; 251 | 252 | void start_comp_counter() 253 | { 254 | struct tms t; 255 | 256 | if (cyc_per_tick == 0.0) 257 | callibrate(0); 258 | times(&t); 259 | start_tick = t.tms_utime; 260 | start_counter(); 261 | } 262 | 263 | double get_comp_counter() 264 | { 265 | double time = get_counter(); 266 | double ctime; 267 | struct tms t; 268 | clock_t ticks; 269 | 270 | times(&t); 271 | ticks = t.tms_utime - start_tick; 272 | ctime = time - ticks*cyc_per_tick; 273 | /* 274 | printf("Measured %.0f cycles. Ticks = %d. Corrected %.0f cycles\n", 275 | time, (int) ticks, ctime); 276 | */ 277 | return ctime; 278 | } 279 | 280 | -------------------------------------------------------------------------------- /clock.h: -------------------------------------------------------------------------------- 1 | /* Routines for using cycle counter */ 2 | 3 | /* Start the counter */ 4 | void start_counter(); 5 | 6 | /* Get # cycles since counter started */ 7 | double get_counter(); 8 | 9 | /* Measure overhead for counter */ 10 | double ovhd(); 11 | 12 | /* Determine clock rate of processor (using a default sleeptime) */ 13 | double mhz(int verbose); 14 | 15 | /* Determine clock rate of processor, having more control over accuracy */ 16 | double mhz_full(int verbose, int sleeptime); 17 | 18 | /** Special counters that compensate for timer interrupt overhead */ 19 | 20 | void start_comp_counter(); 21 | 22 | double get_comp_counter(); 23 | -------------------------------------------------------------------------------- /config.h: -------------------------------------------------------------------------------- 1 | #ifndef __CONFIG_H_ 2 | #define __CONFIG_H_ 3 | 4 | /* 5 | * config.h - malloc lab configuration file 6 | * 7 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 8 | * May not be used, modified, or copied without permission. 9 | */ 10 | 11 | /* 12 | * This is the default path where the driver will look for the 13 | * default tracefiles. You can override it at runtime with the -t flag. 14 | */ 15 | #define TRACEDIR "./" 16 | 17 | /* 18 | * This is the list of default tracefiles in TRACEDIR that the driver 19 | * will use for testing. Modify this if you want to add or delete 20 | * traces from the driver's test suite. For example, if you don't want 21 | * your students to implement realloc, you can delete the last two 22 | * traces. 23 | */ 24 | 25 | #define CHECK_DOUBLE_FREE 0 26 | 27 | #if CHECK_DOUBLE_FREE 28 | #define DEFAULT_TRACEFILES "double-free.rep" 29 | #else 30 | #define DEFAULT_TRACEFILES \ 31 | "memory-leak.rep",\ 32 | "short1-bal.rep",\ 33 | "short2-bal.rep",\ 34 | "random-bal.rep",\ 35 | "random2-bal.rep",\ 36 | "random3-bal.rep",\ 37 | "random4-bal.rep",\ 38 | "random5-bal.rep",\ 39 | "binary-bal.rep",\ 40 | "binary2-bal.rep", \ 41 | "amptjp-bal.rep",\ 42 | "cccp-bal.rep",\ 43 | "cp-decl-bal.rep",\ 44 | "expr-bal.rep",\ 45 | "coalescing-bal.rep" 46 | #endif 47 | 48 | /* 49 | * This constant gives the estimated performance of the libc malloc 50 | * package using our traces on some reference system, typically the 51 | * same kind of system the students use. Its purpose is to cap the 52 | * contribution of throughput to the performance index. Once the 53 | * students surpass the AVG_LIBC_THRUPUT, they get no further benefit 54 | * to their score. This deters students from building extremely fast, 55 | * but extremely stupid malloc packages. 56 | */ 57 | #define AVG_LIBC_THRUPUT 8000E3 /* 8'000 Kops/sec */ 58 | 59 | /* 60 | * This constant determines the contributions of space utilization 61 | * (UTIL_WEIGHT) and throughput (1 - UTIL_WEIGHT) to the performance 62 | * index. 63 | */ 64 | #define UTIL_WEIGHT .60 65 | 66 | /* 67 | * Alignment requirement in bytes (either 4 or 8) 68 | */ 69 | #define ALIGNMENT 8 70 | 71 | /* 72 | * Maximum heap size in bytes 73 | */ 74 | #define MAX_HEAP (64*(1<<20)) /* 64 MB */ 75 | 76 | /***************************************************************************** 77 | * Set exactly one of these USE_xxx constants to "1" to select a timing method 78 | *****************************************************************************/ 79 | #define USE_FCYC 0 /* cycle counter w/K-best scheme (x86 & Alpha only) */ 80 | #define USE_ITIMER 0 /* interval timer (any Unix box) */ 81 | #define USE_GETTOD 1 /* gettimeofday (any Unix box) */ 82 | 83 | #endif /* __CONFIG_H */ 84 | -------------------------------------------------------------------------------- /double-free.rep: -------------------------------------------------------------------------------- 1 | 20000 2 | 6 3 | 13 4 | 1 5 | a 0 2040 6 | a 1 2040 7 | f 1 8 | f 1 9 | a 2 48 10 | a 3 4072 11 | f 3 12 | a 4 4072 13 | f 0 14 | f 2 15 | a 5 4072 16 | f 4 17 | f 5 18 | -------------------------------------------------------------------------------- /fcyc.c: -------------------------------------------------------------------------------- 1 | /* 2 | * fcyc.c - Estimate the time (in CPU cycles) used by a function f 3 | * 4 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 5 | * May not be used, modified, or copied without permission. 6 | * 7 | * Uses the cycle timer routines in clock.c to estimate the 8 | * the time in CPU cycles for a function f. 9 | */ 10 | #include 11 | #include 12 | #include 13 | 14 | #include "fcyc.h" 15 | #include "clock.h" 16 | 17 | /* Default values */ 18 | #define K 3 /* Value of K in K-best scheme */ 19 | #define MAXSAMPLES 20 /* Give up after MAXSAMPLES */ 20 | #define EPSILON 0.01 /* K samples should be EPSILON of each other*/ 21 | #define COMPENSATE 0 /* 1-> try to compensate for clock ticks */ 22 | #define CLEAR_CACHE 0 /* Clear cache before running test function */ 23 | #define CACHE_BYTES (1<<19) /* Max cache size in bytes */ 24 | #define CACHE_BLOCK 32 /* Cache block size in bytes */ 25 | 26 | static int kbest = K; 27 | static int maxsamples = MAXSAMPLES; 28 | static double epsilon = EPSILON; 29 | static int compensate = COMPENSATE; 30 | static int clear_cache = CLEAR_CACHE; 31 | static int cache_bytes = CACHE_BYTES; 32 | static int cache_block = CACHE_BLOCK; 33 | 34 | static int *cache_buf = NULL; 35 | 36 | static double *values = NULL; 37 | static int samplecount = 0; 38 | 39 | /* for debugging only */ 40 | #define KEEP_VALS 0 41 | #define KEEP_SAMPLES 0 42 | 43 | #if KEEP_SAMPLES 44 | static double *samples = NULL; 45 | #endif 46 | 47 | /* 48 | * init_sampler - Start new sampling process 49 | */ 50 | static void init_sampler() 51 | { 52 | if (values) 53 | free(values); 54 | values = calloc(kbest, sizeof(double)); 55 | #if KEEP_SAMPLES 56 | if (samples) 57 | free(samples); 58 | /* Allocate extra for wraparound analysis */ 59 | samples = calloc(maxsamples+kbest, sizeof(double)); 60 | #endif 61 | samplecount = 0; 62 | } 63 | 64 | /* 65 | * add_sample - Add new sample 66 | */ 67 | static void add_sample(double val) 68 | { 69 | int pos = 0; 70 | if (samplecount < kbest) { 71 | pos = samplecount; 72 | values[pos] = val; 73 | } else if (val < values[kbest-1]) { 74 | pos = kbest-1; 75 | values[pos] = val; 76 | } 77 | #if KEEP_SAMPLES 78 | samples[samplecount] = val; 79 | #endif 80 | samplecount++; 81 | /* Insertion sort */ 82 | while (pos > 0 && values[pos-1] > values[pos]) { 83 | double temp = values[pos-1]; 84 | values[pos-1] = values[pos]; 85 | values[pos] = temp; 86 | pos--; 87 | } 88 | } 89 | 90 | /* 91 | * has_converged- Have kbest minimum measurements converged within epsilon? 92 | */ 93 | static int has_converged() 94 | { 95 | return 96 | (samplecount >= kbest) && 97 | ((1 + epsilon)*values[0] >= values[kbest-1]); 98 | } 99 | 100 | /* 101 | * clear - Code to clear cache 102 | */ 103 | static volatile int sink = 0; 104 | 105 | static void clear() 106 | { 107 | int x = sink; 108 | int *cptr, *cend; 109 | int incr = cache_block/sizeof(int); 110 | if (!cache_buf) { 111 | cache_buf = malloc(cache_bytes); 112 | if (!cache_buf) { 113 | fprintf(stderr, "Fatal error. Malloc returned null when trying to clear cache\n"); 114 | exit(1); 115 | } 116 | } 117 | cptr = (int *) cache_buf; 118 | cend = cptr + cache_bytes/sizeof(int); 119 | while (cptr < cend) { 120 | x += *cptr; 121 | cptr += incr; 122 | } 123 | sink = x; 124 | } 125 | 126 | /* 127 | * fcyc - Use K-best scheme to estimate the running time of function f 128 | */ 129 | double fcyc(test_funct f, void *argp) 130 | { 131 | double result; 132 | init_sampler(); 133 | if (compensate) { 134 | do { 135 | double cyc; 136 | if (clear_cache) 137 | clear(); 138 | start_comp_counter(); 139 | f(argp); 140 | cyc = get_comp_counter(); 141 | add_sample(cyc); 142 | } while (!has_converged() && samplecount < maxsamples); 143 | } else { 144 | do { 145 | double cyc; 146 | if (clear_cache) 147 | clear(); 148 | start_counter(); 149 | f(argp); 150 | cyc = get_counter(); 151 | add_sample(cyc); 152 | } while (!has_converged() && samplecount < maxsamples); 153 | } 154 | #ifdef DEBUG 155 | { 156 | int i; 157 | printf(" %d smallest values: [", kbest); 158 | for (i = 0; i < kbest; i++) 159 | printf("%.0f%s", values[i], i==kbest-1 ? "]\n" : ", "); 160 | } 161 | #endif 162 | result = values[0]; 163 | #if !KEEP_VALS 164 | free(values); 165 | values = NULL; 166 | #endif 167 | return result; 168 | } 169 | 170 | 171 | /************************************************************* 172 | * Set the various parameters used by the measurement routines 173 | ************************************************************/ 174 | 175 | /* 176 | * set_fcyc_clear_cache - When set, will run code to clear cache 177 | * before each measurement. 178 | * Default = 0 179 | */ 180 | void set_fcyc_clear_cache(int clear) 181 | { 182 | clear_cache = clear; 183 | } 184 | 185 | /* 186 | * set_fcyc_cache_size - Set size of cache to use when clearing cache 187 | * Default = 1<<19 (512KB) 188 | */ 189 | void set_fcyc_cache_size(int bytes) 190 | { 191 | if (bytes != cache_bytes) { 192 | cache_bytes = bytes; 193 | if (cache_buf) { 194 | free(cache_buf); 195 | cache_buf = NULL; 196 | } 197 | } 198 | } 199 | 200 | /* 201 | * set_fcyc_cache_block - Set size of cache block 202 | * Default = 32 203 | */ 204 | void set_fcyc_cache_block(int bytes) { 205 | cache_block = bytes; 206 | } 207 | 208 | 209 | /* 210 | * set_fcyc_compensate- When set, will attempt to compensate for 211 | * timer interrupt overhead 212 | * Default = 0 213 | */ 214 | void set_fcyc_compensate(int compensate_arg) 215 | { 216 | compensate = compensate_arg; 217 | } 218 | 219 | /* 220 | * set_fcyc_k - Value of K in K-best measurement scheme 221 | * Default = 3 222 | */ 223 | void set_fcyc_k(int k) 224 | { 225 | kbest = k; 226 | } 227 | 228 | /* 229 | * set_fcyc_maxsamples - Maximum number of samples attempting to find 230 | * K-best within some tolerance. 231 | * When exceeded, just return best sample found. 232 | * Default = 20 233 | */ 234 | void set_fcyc_maxsamples(int maxsamples_arg) 235 | { 236 | maxsamples = maxsamples_arg; 237 | } 238 | 239 | /* 240 | * set_fcyc_epsilon - Tolerance required for K-best 241 | * Default = 0.01 242 | */ 243 | void set_fcyc_epsilon(double epsilon_arg) 244 | { 245 | epsilon = epsilon_arg; 246 | } 247 | 248 | 249 | 250 | 251 | 252 | -------------------------------------------------------------------------------- /fcyc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * fcyc.h - prototypes for the routines in fcyc.c that estimate the 3 | * time in CPU cycles used by a test function f 4 | * 5 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 6 | * May not be used, modified, or copied without permission. 7 | * 8 | */ 9 | 10 | /* The test function takes a generic pointer as input */ 11 | typedef void (*test_funct)(void *); 12 | 13 | /* Compute number of cycles used by test function f */ 14 | double fcyc(test_funct f, void* argp); 15 | 16 | /********************************************************* 17 | * Set the various parameters used by measurement routines 18 | *********************************************************/ 19 | 20 | /* 21 | * set_fcyc_clear_cache - When set, will run code to clear cache 22 | * before each measurement. 23 | * Default = 0 24 | */ 25 | void set_fcyc_clear_cache(int clear); 26 | 27 | /* 28 | * set_fcyc_cache_size - Set size of cache to use when clearing cache 29 | * Default = 1<<19 (512KB) 30 | */ 31 | void set_fcyc_cache_size(int bytes); 32 | 33 | /* 34 | * set_fcyc_cache_block - Set size of cache block 35 | * Default = 32 36 | */ 37 | void set_fcyc_cache_block(int bytes); 38 | 39 | /* 40 | * set_fcyc_compensate- When set, will attempt to compensate for 41 | * timer interrupt overhead 42 | * Default = 0 43 | */ 44 | void set_fcyc_compensate(int compensate_arg); 45 | 46 | /* 47 | * set_fcyc_k - Value of K in K-best measurement scheme 48 | * Default = 3 49 | */ 50 | void set_fcyc_k(int k); 51 | 52 | /* 53 | * set_fcyc_maxsamples - Maximum number of samples attempting to find 54 | * K-best within some tolerance. 55 | * When exceeded, just return best sample found. 56 | * Default = 20 57 | */ 58 | void set_fcyc_maxsamples(int maxsamples_arg); 59 | 60 | /* 61 | * set_fcyc_epsilon - Tolerance required for K-best 62 | * Default = 0.01 63 | */ 64 | void set_fcyc_epsilon(double epsilon_arg); 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /fsecs.c: -------------------------------------------------------------------------------- 1 | /**************************** 2 | * High-level timing wrappers 3 | ****************************/ 4 | #include 5 | #include "fsecs.h" 6 | #include "fcyc.h" 7 | #include "clock.h" 8 | #include "ftimer.h" 9 | #include "config.h" 10 | 11 | static double Mhz; /* estimated CPU clock frequency */ 12 | 13 | extern int verbose; /* -v option in mdriver.c */ 14 | 15 | /* 16 | * init_fsecs - initialize the timing package 17 | */ 18 | void init_fsecs(void) 19 | { 20 | Mhz = 0; /* keep gcc -Wall happy */ 21 | 22 | #if USE_FCYC 23 | if (verbose) 24 | printf("Measuring performance with a cycle counter.\n"); 25 | 26 | /* set key parameters for the fcyc package */ 27 | set_fcyc_maxsamples(20); 28 | set_fcyc_clear_cache(1); 29 | set_fcyc_compensate(1); 30 | set_fcyc_epsilon(0.01); 31 | set_fcyc_k(3); 32 | Mhz = mhz(verbose > 0); 33 | #elif USE_ITIMER 34 | if (verbose) 35 | printf("Measuring performance with the interval timer.\n"); 36 | #elif USE_GETTOD 37 | if (verbose) 38 | printf("Measuring performance with gettimeofday().\n"); 39 | #endif 40 | } 41 | 42 | /* 43 | * fsecs - Return the running time of a function f (in seconds) 44 | */ 45 | double fsecs(fsecs_test_funct f, void *argp) 46 | { 47 | #if USE_FCYC 48 | double cycles = fcyc(f, argp); 49 | return cycles/(Mhz*1e6); 50 | #elif USE_ITIMER 51 | return ftimer_itimer(f, argp, 10); 52 | #elif USE_GETTOD 53 | return ftimer_gettod(f, argp, 10); 54 | #endif 55 | } 56 | 57 | 58 | -------------------------------------------------------------------------------- /fsecs.h: -------------------------------------------------------------------------------- 1 | typedef void (*fsecs_test_funct)(void *); 2 | 3 | void init_fsecs(void); 4 | double fsecs(fsecs_test_funct f, void *argp); 5 | -------------------------------------------------------------------------------- /ftimer.c: -------------------------------------------------------------------------------- 1 | /* 2 | * ftimer.c - Estimate the time (in seconds) used by a function f 3 | * 4 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 5 | * May not be used, modified, or copied without permission. 6 | * 7 | * Function timers that estimate the running time (in seconds) of a function f. 8 | * ftimer_itimer: version that uses the interval timer 9 | * ftimer_gettod: version that uses gettimeofday 10 | */ 11 | #include 12 | #include 13 | #include "ftimer.h" 14 | 15 | /* function prototypes */ 16 | static void init_etime(void); 17 | static double get_etime(void); 18 | 19 | /* 20 | * ftimer_itimer - Use the interval timer to estimate the running time 21 | * of f(argp). Return the average of n runs. 22 | */ 23 | double ftimer_itimer(ftimer_test_funct f, void *argp, int n) 24 | { 25 | double start, tmeas; 26 | int i; 27 | 28 | init_etime(); 29 | start = get_etime(); 30 | for (i = 0; i < n; i++) 31 | f(argp); 32 | tmeas = get_etime() - start; 33 | return tmeas / n; 34 | } 35 | 36 | /* 37 | * ftimer_gettod - Use gettimeofday to estimate the running time of 38 | * f(argp). Return the average of n runs. 39 | */ 40 | double ftimer_gettod(ftimer_test_funct f, void *argp, int n) 41 | { 42 | int i; 43 | struct timeval stv, etv; 44 | double diff; 45 | 46 | gettimeofday(&stv, NULL); 47 | for (i = 0; i < n; i++) 48 | f(argp); 49 | gettimeofday(&etv,NULL); 50 | diff = 1E3*(etv.tv_sec - stv.tv_sec) + 1E-3*(etv.tv_usec-stv.tv_usec); 51 | diff /= n; 52 | return (1E-3*diff); 53 | } 54 | 55 | 56 | /* 57 | * Routines for manipulating the Unix interval timer 58 | */ 59 | 60 | /* The initial value of the interval timer */ 61 | #define MAX_ETIME 86400 62 | 63 | /* static variables that hold the initial value of the interval timer */ 64 | static struct itimerval first_u; /* user time */ 65 | static struct itimerval first_r; /* real time */ 66 | static struct itimerval first_p; /* prof time*/ 67 | 68 | /* init the timer */ 69 | static void init_etime(void) 70 | { 71 | first_u.it_interval.tv_sec = 0; 72 | first_u.it_interval.tv_usec = 0; 73 | first_u.it_value.tv_sec = MAX_ETIME; 74 | first_u.it_value.tv_usec = 0; 75 | setitimer(ITIMER_VIRTUAL, &first_u, NULL); 76 | 77 | first_r.it_interval.tv_sec = 0; 78 | first_r.it_interval.tv_usec = 0; 79 | first_r.it_value.tv_sec = MAX_ETIME; 80 | first_r.it_value.tv_usec = 0; 81 | setitimer(ITIMER_REAL, &first_r, NULL); 82 | 83 | first_p.it_interval.tv_sec = 0; 84 | first_p.it_interval.tv_usec = 0; 85 | first_p.it_value.tv_sec = MAX_ETIME; 86 | first_p.it_value.tv_usec = 0; 87 | setitimer(ITIMER_PROF, &first_p, NULL); 88 | } 89 | 90 | /* return elapsed real seconds since call to init_etime */ 91 | static double get_etime(void) { 92 | struct itimerval v_curr; 93 | struct itimerval r_curr; 94 | struct itimerval p_curr; 95 | 96 | getitimer(ITIMER_VIRTUAL, &v_curr); 97 | getitimer(ITIMER_REAL,&r_curr); 98 | getitimer(ITIMER_PROF,&p_curr); 99 | 100 | return (double) ((first_p.it_value.tv_sec - r_curr.it_value.tv_sec) + 101 | (first_p.it_value.tv_usec - r_curr.it_value.tv_usec)*1e-6); 102 | } 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /ftimer.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Function timers 3 | */ 4 | typedef void (*ftimer_test_funct)(void *); 5 | 6 | /* Estimate the running time of f(argp) using the Unix interval timer. 7 | Return the average of n runs */ 8 | double ftimer_itimer(ftimer_test_funct f, void *argp, int n); 9 | 10 | 11 | /* Estimate the running time of f(argp) using gettimeofday 12 | Return the average of n runs */ 13 | double ftimer_gettod(ftimer_test_funct f, void *argp, int n); 14 | 15 | -------------------------------------------------------------------------------- /mdriver.c: -------------------------------------------------------------------------------- 1 | /* 2 | * mdriver.c - CS:APP Malloc Lab Driver 3 | * 4 | * Uses a collection of trace files to tests a malloc/free/realloc 5 | * implementation in mm.c. 6 | * 7 | * Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved. 8 | * May not be used, modified, or copied without permission. 9 | */ 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | #include "mm.h" 20 | #include "memlib.h" 21 | #include "fsecs.h" 22 | #include "config.h" 23 | 24 | /********************** 25 | * Constants and macros 26 | **********************/ 27 | 28 | /* Misc */ 29 | #define MAXLINE 1024 /* max string size */ 30 | #define HDRLINES 4 /* number of header lines in a trace file */ 31 | #define LINENUM(i) (i+5) /* cnvt trace request nums to linenums (origin 1) */ 32 | 33 | /* Returns true if p is ALIGNMENT-byte aligned */ 34 | #define IS_ALIGNED(p) ((((unsigned int)(p)) % ALIGNMENT) == 0) 35 | 36 | /****************************** 37 | * The key compound data types 38 | *****************************/ 39 | 40 | /* Records the extent of each block's payload 41 | typedef struct range_t { 42 | char *lo; // low payload address 43 | char *hi; // high payload address 44 | struct range_t *next; // next list element 45 | } range_t; 46 | */ 47 | 48 | /* Characterizes a single trace operation (allocator request) */ 49 | typedef struct { 50 | enum {ALLOC, FREE, REALLOC} type; /* type of request */ 51 | int index; /* index for free() to use later */ 52 | int size; /* byte size of alloc/realloc request */ 53 | } traceop_t; 54 | 55 | /* Holds the information for one trace file*/ 56 | typedef struct { 57 | int sugg_heapsize; /* suggested heap size (unused) */ 58 | int num_ids; /* number of alloc/realloc ids */ 59 | int num_ops; /* number of distinct requests */ 60 | int weight; /* weight for this trace (unused) */ 61 | traceop_t *ops; /* array of requests */ 62 | char **blocks; /* array of ptrs returned by malloc/realloc... */ 63 | size_t *block_sizes; /* ... and a corresponding array of payload sizes */ 64 | } trace_t; 65 | 66 | /* 67 | * Holds the params to the xxx_speed functions, which are timed by fcyc. 68 | * This struct is necessary because fcyc accepts only a pointer array 69 | * as input. 70 | */ 71 | typedef struct { 72 | trace_t *trace; 73 | range_t *ranges; 74 | } speed_t; 75 | 76 | /* Summarizes the important stats for some malloc function on some trace */ 77 | typedef struct { 78 | /* defined for both libc malloc and student malloc package (mm.c) */ 79 | double ops; /* number of ops (malloc/free/realloc) in the trace */ 80 | int valid; /* was the trace processed correctly by the allocator? */ 81 | double secs; /* number of secs needed to run the trace */ 82 | 83 | /* defined only for the student malloc package */ 84 | double util; /* space utilization for this trace (always 0 for libc) */ 85 | 86 | /* Note: secs and util are only defined if valid is true */ 87 | } stats_t; 88 | 89 | /******************** 90 | * Global variables 91 | *******************/ 92 | int verbose = 0; /* global flag for verbose output */ 93 | static int errors = 0; /* number of errs found when running student malloc */ 94 | char msg[MAXLINE]; /* for whenever we need to compose an error message */ 95 | 96 | /* Directory where default tracefiles are found */ 97 | static char tracedir[MAXLINE] = TRACEDIR; 98 | 99 | /* The filenames of the default tracefiles */ 100 | static char *default_tracefiles[] = { 101 | DEFAULT_TRACEFILES, NULL 102 | }; 103 | 104 | 105 | /********************* 106 | * Function prototypes 107 | *********************/ 108 | 109 | /* these functions manipulate range lists */ 110 | static int add_range(range_t **ranges, char *lo, int size, 111 | int tracenum, int opnum); 112 | static void remove_range(range_t **ranges, char *lo); 113 | static void clear_ranges(range_t **ranges); 114 | 115 | /* These functions read, allocate, and free storage for traces */ 116 | static trace_t *read_trace(char *tracedir, char *filename); 117 | static void free_trace(trace_t *trace); 118 | 119 | /* Routines for evaluating the correctness and speed of libc malloc */ 120 | static int eval_libc_valid(trace_t *trace, int tracenum); 121 | static void eval_libc_speed(void *ptr); 122 | 123 | /* Routines for evaluating correctnes, space utilization, and speed 124 | of the student's malloc package in mm.c */ 125 | static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges); 126 | static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges); 127 | static void eval_mm_speed(void *ptr); 128 | 129 | /* Various helper routines */ 130 | static void printresults(int n, stats_t *stats); 131 | static void usage(void); 132 | static void unix_error(char *msg); 133 | static void malloc_error(int tracenum, int opnum, char *msg); 134 | static void app_error(char *msg); 135 | 136 | /************** 137 | * Main routine 138 | **************/ 139 | int main(int argc, char **argv) 140 | { 141 | int i; 142 | char c; 143 | char **tracefiles = NULL; /* null-terminated array of trace file names */ 144 | int num_tracefiles = 0; /* the number of traces in that array */ 145 | trace_t *trace = NULL; /* stores a single trace file in memory */ 146 | range_t *ranges = NULL; /* keeps track of block extents for one trace */ 147 | stats_t *libc_stats = NULL;/* libc stats for each trace */ 148 | stats_t *mm_stats = NULL; /* mm (i.e. student) stats for each trace */ 149 | speed_t speed_params; /* input parameters to the xx_speed routines */ 150 | 151 | int team_check = 1; /* If set, check team structure (reset by -a) */ 152 | int run_libc = 0; /* If set, run libc malloc (set by -l) */ 153 | int autograder = 0; /* If set, emit summary info for autograder (-g) */ 154 | 155 | /* temporaries used to compute the performance index */ 156 | double secs, ops, util, avg_mm_util, avg_mm_throughput, p1, p2, perfindex; 157 | int numcorrect; 158 | 159 | /* 160 | * Read and interpret the command line arguments 161 | */ 162 | while ((c = getopt(argc, argv, "f:t:hvVgal")) != EOF) { 163 | switch (c) { 164 | case 'g': /* Generate summary info for the autograder */ 165 | autograder = 1; 166 | break; 167 | case 'f': /* Use one specific trace file only (relative to curr dir) */ 168 | num_tracefiles = 1; 169 | if ((tracefiles = realloc(tracefiles, 2*sizeof(char *))) == NULL) 170 | unix_error("ERROR: realloc failed in main"); 171 | strcpy(tracedir, "./"); 172 | tracefiles[0] = strdup(optarg); 173 | tracefiles[1] = NULL; 174 | break; 175 | case 't': /* Directory where the traces are located */ 176 | if (num_tracefiles == 1) /* ignore if -f already encountered */ 177 | break; 178 | strcpy(tracedir, optarg); 179 | if (tracedir[strlen(tracedir)-1] != '/') 180 | strcat(tracedir, "/"); /* path always ends with "/" */ 181 | break; 182 | case 'a': /* Don't check team structure */ 183 | team_check = 0; 184 | break; 185 | case 'l': /* Run libc malloc */ 186 | run_libc = 1; 187 | break; 188 | case 'v': /* Print per-trace performance breakdown */ 189 | verbose = 1; 190 | break; 191 | case 'V': /* Be more verbose than -v */ 192 | verbose = 2; 193 | break; 194 | case 'h': /* Print this message */ 195 | usage(); 196 | exit(0); 197 | default: 198 | usage(); 199 | exit(1); 200 | } 201 | } 202 | 203 | /* 204 | * Check and print team info 205 | */ 206 | if (team_check) { 207 | /* Students must fill in their team information */ 208 | if (!strcmp(team.teamname, "")) { 209 | printf("ERROR: Please provide the information about your team in mm.c.\n"); 210 | exit(1); 211 | } else 212 | printf("Team Name:%s\n", team.teamname); 213 | if ((*team.name1 == '\0') || (*team.id1 == '\0')) { 214 | printf("ERROR. You must fill in all team member 1 fields!\n"); 215 | exit(1); 216 | } 217 | else 218 | printf("Member 1 :%s:%s\n", team.name1, team.id1); 219 | 220 | if (((*team.name2 != '\0') && (*team.id2 == '\0')) || 221 | ((*team.name2 == '\0') && (*team.id2 != '\0'))) { 222 | printf("ERROR. You must fill in all or none of the team member 2 ID fields!\n"); 223 | exit(1); 224 | } 225 | else if (*team.name2 != '\0') 226 | printf("Member 2 :%s:%s\n", team.name2, team.id2); 227 | } 228 | 229 | /* 230 | * If no -f command line arg, then use the entire set of tracefiles 231 | * defined in default_traces[] 232 | */ 233 | if (tracefiles == NULL) { 234 | tracefiles = default_tracefiles; 235 | num_tracefiles = sizeof(default_tracefiles) / sizeof(char *) - 1; 236 | printf("Using default tracefiles in %s\n", tracedir); 237 | } 238 | 239 | /* Initialize the timing package */ 240 | init_fsecs(); 241 | 242 | /* 243 | * Optionally run and evaluate the libc malloc package 244 | */ 245 | if (run_libc) { 246 | if (verbose > 1) 247 | printf("\nTesting libc malloc\n"); 248 | 249 | /* Allocate libc stats array, with one stats_t struct per tracefile */ 250 | libc_stats = (stats_t *)calloc(num_tracefiles, sizeof(stats_t)); 251 | if (libc_stats == NULL) 252 | unix_error("libc_stats calloc in main failed"); 253 | 254 | /* Evaluate the libc malloc package using the K-best scheme */ 255 | for (i=0; i < num_tracefiles; i++) { 256 | trace = read_trace(tracedir, tracefiles[i]); 257 | libc_stats[i].ops = trace->num_ops; 258 | if (verbose > 1) 259 | printf("Checking libc malloc for correctness, "); 260 | libc_stats[i].valid = eval_libc_valid(trace, i); 261 | if (libc_stats[i].valid) { 262 | speed_params.trace = trace; 263 | if (verbose > 1) 264 | printf("and performance.\n"); 265 | libc_stats[i].secs = fsecs(eval_libc_speed, &speed_params); 266 | } 267 | free_trace(trace); 268 | } 269 | 270 | /* Display the libc results in a compact table */ 271 | if (verbose) { 272 | printf("\nResults for libc malloc:\n"); 273 | printresults(num_tracefiles, libc_stats); 274 | } 275 | } 276 | 277 | /* 278 | * Always run and evaluate the student's mm package 279 | */ 280 | if (verbose > 1) 281 | printf("\nTesting mm malloc\n"); 282 | 283 | /* Allocate the mm stats array, with one stats_t struct per tracefile */ 284 | mm_stats = (stats_t *)calloc(num_tracefiles, sizeof(stats_t)); 285 | if (mm_stats == NULL) 286 | unix_error("mm_stats calloc in main failed"); 287 | 288 | /* Initialize the simulated memory system in memlib.c */ 289 | mem_init(); 290 | 291 | /* Evaluate student's mm malloc package using the K-best scheme */ 292 | for (i=0; i < num_tracefiles; i++) { 293 | trace = read_trace(tracedir, tracefiles[i]); 294 | mm_stats[i].ops = trace->num_ops; 295 | if (verbose > 1) 296 | printf("Checking mm_malloc for correctness, "); 297 | mm_stats[i].valid = eval_mm_valid(trace, i, &ranges); 298 | if (mm_stats[i].valid) { 299 | if (verbose > 1) 300 | printf("efficiency, "); 301 | mm_stats[i].util = eval_mm_util(trace, i, &ranges); 302 | speed_params.trace = trace; 303 | speed_params.ranges = ranges; 304 | if (verbose > 1) 305 | printf("and performance.\n"); 306 | mm_stats[i].secs = fsecs(eval_mm_speed, &speed_params); 307 | } 308 | free_trace(trace); 309 | } 310 | 311 | /* Display the mm results in a compact table */ 312 | if (verbose) { 313 | printf("\nResults for mm malloc:\n"); 314 | printresults(num_tracefiles, mm_stats); 315 | printf("\n"); 316 | } 317 | 318 | /* 319 | * Accumulate the aggregate statistics for the student's mm package 320 | */ 321 | secs = 0; 322 | ops = 0; 323 | util = 0; 324 | numcorrect = 0; 325 | for (i=0; i < num_tracefiles; i++) { 326 | secs += mm_stats[i].secs; 327 | ops += mm_stats[i].ops; 328 | util += mm_stats[i].util; 329 | if (mm_stats[i].valid) 330 | numcorrect++; 331 | } 332 | avg_mm_util = util/num_tracefiles; 333 | 334 | /* 335 | * Compute and print the performance index 336 | */ 337 | if (errors == 0) { 338 | avg_mm_throughput = ops/secs; 339 | 340 | p1 = UTIL_WEIGHT * avg_mm_util; 341 | if (avg_mm_throughput > AVG_LIBC_THRUPUT) { 342 | p2 = (double)(1.0 - UTIL_WEIGHT); 343 | } 344 | else { 345 | p2 = ((double) (1.0 - UTIL_WEIGHT)) * 346 | (avg_mm_throughput/AVG_LIBC_THRUPUT); 347 | } 348 | 349 | perfindex = (p1 + p2)*100.0; 350 | printf("Perf index = %.0f (util) + %.0f (thru) = %.0f/100\n", 351 | p1*100, 352 | p2*100, 353 | perfindex); 354 | 355 | } 356 | else { /* There were errors */ 357 | perfindex = 0.0; 358 | printf("Terminated with %d errors\n", errors); 359 | } 360 | 361 | if (autograder) { 362 | printf("correct:%d\n", numcorrect); 363 | printf("perfidx:%.0f\n", perfindex); 364 | } 365 | 366 | exit(0); 367 | } 368 | 369 | 370 | /***************************************************************** 371 | * The following routines manipulate the range list, which keeps 372 | * track of the extent of every allocated block payload. We use the 373 | * range list to detect any overlapping allocated blocks. 374 | ****************************************************************/ 375 | 376 | /* 377 | * add_range - As directed by request opnum in trace tracenum, 378 | * we've just called the student's mm_malloc to allocate a block of 379 | * size bytes at addr lo. After checking the block for correctness, 380 | * we create a range struct for this block and add it to the range list. 381 | */ 382 | static int add_range(range_t **ranges, char *lo, int size, 383 | int tracenum, int opnum) 384 | { 385 | char *hi = lo + size - 1; 386 | range_t *p; 387 | char msg[MAXLINE]; 388 | 389 | assert(size > 0); 390 | 391 | /* Payload addresses must be ALIGNMENT-byte aligned */ 392 | if (!IS_ALIGNED(lo)) { 393 | sprintf(msg, "Payload address (%p) not aligned to %d bytes", 394 | lo, ALIGNMENT); 395 | malloc_error(tracenum, opnum, msg); 396 | return 0; 397 | } 398 | 399 | /* The payload must lie within the extent of the heap */ 400 | if ((lo < (char *)mem_heap_lo()) || (lo > (char *)mem_heap_hi()) || 401 | (hi < (char *)mem_heap_lo()) || (hi > (char *)mem_heap_hi())) { 402 | sprintf(msg, "Payload (%p:%p) lies outside heap (%p:%p)", 403 | lo, hi, mem_heap_lo(), mem_heap_hi()); 404 | malloc_error(tracenum, opnum, msg); 405 | return 0; 406 | } 407 | 408 | /* The payload must not overlap any other payloads */ 409 | for (p = *ranges; p != NULL; p = p->next) { 410 | if ((lo >= p->lo && lo <= p-> hi) || 411 | (hi >= p->lo && hi <= p->hi)) { 412 | sprintf(msg, "Payload (%p:%p) overlaps another payload (%p:%p)\n", 413 | lo, hi, p->lo, p->hi); 414 | malloc_error(tracenum, opnum, msg); 415 | return 0; 416 | } 417 | } 418 | 419 | /* 420 | * Everything looks OK, so remember the extent of this block 421 | * by creating a range struct and adding it the range list. 422 | */ 423 | if ((p = (range_t *)malloc(sizeof(range_t))) == NULL) 424 | unix_error("malloc error in add_range"); 425 | p->next = *ranges; 426 | p->lo = lo; 427 | p->hi = hi; 428 | *ranges = p; 429 | return 1; 430 | } 431 | 432 | /* 433 | * remove_range - Free the range record of block whose payload starts at lo 434 | */ 435 | static void remove_range(range_t **ranges, char *lo) 436 | { 437 | range_t *p; 438 | range_t **prevpp = ranges; 439 | 440 | for (p = *ranges; p != NULL; p = p->next) { 441 | if (p->lo == lo) { 442 | *prevpp = p->next; 443 | free(p); 444 | break; 445 | } 446 | prevpp = &(p->next); 447 | } 448 | } 449 | 450 | /* 451 | * clear_ranges - free all of the range records for a trace 452 | */ 453 | static void clear_ranges(range_t **ranges) 454 | { 455 | range_t *p; 456 | range_t *pnext; 457 | 458 | for (p = *ranges; p != NULL; p = pnext) { 459 | pnext = p->next; 460 | free(p); 461 | } 462 | *ranges = NULL; 463 | } 464 | 465 | 466 | /********************************************** 467 | * The following routines manipulate tracefiles 468 | *********************************************/ 469 | 470 | /* 471 | * read_trace - read a trace file and store it in memory 472 | */ 473 | static trace_t *read_trace(char *tracedir, char *filename) 474 | { 475 | FILE *tracefile; 476 | trace_t *trace; 477 | char type[MAXLINE]; 478 | char path[MAXLINE]; 479 | unsigned index, size; 480 | unsigned max_index = 0; 481 | unsigned op_index; 482 | 483 | if (verbose > 1) 484 | printf("Reading tracefile: %s\n", filename); 485 | 486 | /* Allocate the trace record */ 487 | if ((trace = (trace_t *) malloc(sizeof(trace_t))) == NULL) 488 | unix_error("malloc 1 failed in read_trance"); 489 | 490 | /* Read the trace file header */ 491 | strcpy(path, tracedir); 492 | strcat(path, filename); 493 | if ((tracefile = fopen(path, "r")) == NULL) { 494 | sprintf(msg, "Could not open %s in read_trace", path); 495 | unix_error(msg); 496 | } 497 | if ( 498 | (fscanf(tracefile, "%d", &(trace->sugg_heapsize)) < 1) || /* not used */ 499 | (fscanf(tracefile, "%d", &(trace->num_ids)) < 1) || 500 | (fscanf(tracefile, "%d", &(trace->num_ops)) < 1) || 501 | (fscanf(tracefile, "%d", &(trace->weight)) < 1) 502 | ) 503 | { 504 | unix_error("failed to read line from trace"); 505 | } 506 | 507 | /* We'll store each request line in the trace in this array */ 508 | if ((trace->ops = 509 | (traceop_t *)malloc(trace->num_ops * sizeof(traceop_t))) == NULL) 510 | unix_error("malloc 2 failed in read_trace"); 511 | 512 | /* We'll keep an array of pointers to the allocated blocks here... */ 513 | if ((trace->blocks = 514 | (char **)malloc(trace->num_ids * sizeof(char *))) == NULL) 515 | unix_error("malloc 3 failed in read_trace"); 516 | 517 | /* ... along with the corresponding byte sizes of each block */ 518 | if ((trace->block_sizes = 519 | (size_t *)malloc(trace->num_ids * sizeof(size_t))) == NULL) 520 | unix_error("malloc 4 failed in read_trace"); 521 | 522 | /* read every request line in the trace file */ 523 | index = 0; 524 | op_index = 0; 525 | while (fscanf(tracefile, "%s", type) != EOF) { 526 | switch(type[0]) { 527 | case 'a': 528 | if (fscanf(tracefile, "%u %u", &index, &size) < 2) { 529 | unix_error("failed to read line from trace"); 530 | } 531 | trace->ops[op_index].type = ALLOC; 532 | trace->ops[op_index].index = index; 533 | trace->ops[op_index].size = size; 534 | max_index = (index > max_index) ? index : max_index; 535 | break; 536 | case 'r': 537 | if (fscanf(tracefile, "%u %u", &index, &size) < 2) { 538 | unix_error("failed to read line from trace"); 539 | } 540 | trace->ops[op_index].type = REALLOC; 541 | trace->ops[op_index].index = index; 542 | trace->ops[op_index].size = size; 543 | max_index = (index > max_index) ? index : max_index; 544 | break; 545 | case 'f': 546 | if (fscanf(tracefile, "%ud", &index) < 1) { 547 | unix_error("failed to read line from trace"); 548 | } 549 | trace->ops[op_index].type = FREE; 550 | trace->ops[op_index].index = index; 551 | break; 552 | default: 553 | printf("Bogus type character (%c) in tracefile %s\n", 554 | type[0], path); 555 | exit(1); 556 | } 557 | op_index++; 558 | 559 | } 560 | fclose(tracefile); 561 | assert(max_index == trace->num_ids - 1); 562 | assert(trace->num_ops == op_index); 563 | 564 | return trace; 565 | } 566 | 567 | /* 568 | * free_trace - Free the trace record and the three arrays it points 569 | * to, all of which were allocated in read_trace(). 570 | */ 571 | void free_trace(trace_t *trace) 572 | { 573 | free(trace->ops); /* free the three arrays... */ 574 | free(trace->blocks); 575 | free(trace->block_sizes); 576 | free(trace); /* and the trace record itself... */ 577 | } 578 | 579 | /********************************************************************** 580 | * The following functions evaluate the correctness, space utilization, 581 | * and throughput of the libc and mm malloc packages. 582 | **********************************************************************/ 583 | 584 | /* 585 | * eval_mm_valid - Check the mm malloc package for correctness 586 | */ 587 | static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges) 588 | { 589 | int i, j; 590 | int index; 591 | int size; 592 | int oldsize; 593 | char *newp; 594 | char *oldp; 595 | char *p; 596 | 597 | /* Reset the heap and free any records in the range list */ 598 | mem_reset_brk(); 599 | clear_ranges(ranges); 600 | 601 | /* Call the mm package's init function */ 602 | if (mm_init(ranges) < 0) { 603 | malloc_error(tracenum, 0, "mm_init failed."); 604 | return 0; 605 | } 606 | 607 | /* Interpret each operation in the trace in order */ 608 | for (i = 0; i < trace->num_ops; i++) { 609 | index = trace->ops[i].index; 610 | size = trace->ops[i].size; 611 | 612 | switch (trace->ops[i].type) { 613 | 614 | case ALLOC: /* mm_malloc */ 615 | 616 | /* Call the student's malloc */ 617 | if ((p = mm_malloc(size)) == NULL) { 618 | malloc_error(tracenum, i, "mm_malloc failed."); 619 | return 0; 620 | } 621 | 622 | /* 623 | * Test the range of the new block for correctness and add it 624 | * to the range list if OK. The block must be be aligned properly, 625 | * and must not overlap any currently allocated block. 626 | */ 627 | if (add_range(ranges, p, size, tracenum, i) == 0) 628 | return 0; 629 | 630 | /* ADDED: cgw 631 | * fill range with low byte of index. This will be used later 632 | * if we realloc the block and wish to make sure that the old 633 | * data was copied to the new block 634 | */ 635 | memset(p, index & 0xFF, size); 636 | 637 | /* Remember region */ 638 | trace->blocks[index] = p; 639 | trace->block_sizes[index] = size; 640 | break; 641 | 642 | case REALLOC: /* mm_realloc */ 643 | 644 | /* Call the student's realloc */ 645 | oldp = trace->blocks[index]; 646 | if ((newp = mm_realloc(oldp, size)) == NULL) { 647 | malloc_error(tracenum, i, "mm_realloc failed."); 648 | return 0; 649 | } 650 | 651 | /* Remove the old region from the range list */ 652 | remove_range(ranges, oldp); 653 | 654 | /* Check new block for correctness and add it to range list */ 655 | if (add_range(ranges, newp, size, tracenum, i) == 0) 656 | return 0; 657 | 658 | /* ADDED: cgw 659 | * Make sure that the new block contains the data from the old 660 | * block and then fill in the new block with the low order byte 661 | * of the new index 662 | */ 663 | oldsize = trace->block_sizes[index]; 664 | if (size < oldsize) oldsize = size; 665 | for (j = 0; j < oldsize; j++) { 666 | if (newp[j] != (index & 0xFF)) { 667 | malloc_error(tracenum, i, "mm_realloc did not preserve the " 668 | "data from old block"); 669 | return 0; 670 | } 671 | } 672 | memset(newp, index & 0xFF, size); 673 | 674 | /* Remember region */ 675 | trace->blocks[index] = newp; 676 | trace->block_sizes[index] = size; 677 | break; 678 | 679 | case FREE: /* mm_free */ 680 | 681 | /* Remove region from list and call student's free function */ 682 | p = trace->blocks[index]; 683 | //remove_range(ranges, p); - no need, because mm_free call it automatically. 684 | mm_free(p); 685 | break; 686 | 687 | default: 688 | app_error("Nonexistent request type in eval_mm_valid"); 689 | } 690 | 691 | } 692 | 693 | /* Call the mm package's exit function */ 694 | mm_exit(); 695 | 696 | /* 697 | * Test memory leak problem. 698 | */ 699 | if (*ranges) { 700 | malloc_error(tracenum, i, "mm_exit did not treat the memory leak"); 701 | return 0; 702 | } 703 | 704 | /* As far as we know, this is a valid malloc package */ 705 | return 1; 706 | } 707 | 708 | /* 709 | * eval_mm_util - Evaluate the space utilization of the student's package 710 | * The idea is to remember the high water mark "hwm" of the heap for 711 | * an optimal allocator, i.e., no gaps and no internal fragmentation. 712 | * Utilization is the ratio hwm/heapsize, where heapsize is the 713 | * size of the heap in bytes after running the student's malloc 714 | * package on the trace. Note that our implementation of mem_sbrk() 715 | * doesn't allow the students to decrement the brk pointer, so brk 716 | * is always the high water mark of the heap. 717 | * 718 | */ 719 | static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges) 720 | { 721 | int i; 722 | int index; 723 | int size, newsize, oldsize; 724 | int max_total_size = 0; 725 | int total_size = 0; 726 | char *p; 727 | char *newp, *oldp; 728 | 729 | /* initialize the heap and the mm malloc package */ 730 | mem_reset_brk(); 731 | if (mm_init(NULL) < 0) 732 | app_error("mm_init failed in eval_mm_util"); 733 | 734 | for (i = 0; i < trace->num_ops; i++) { 735 | switch (trace->ops[i].type) { 736 | 737 | case ALLOC: /* mm_alloc */ 738 | index = trace->ops[i].index; 739 | size = trace->ops[i].size; 740 | 741 | if ((p = mm_malloc(size)) == NULL) 742 | app_error("mm_malloc failed in eval_mm_util"); 743 | 744 | /* Remember region and size */ 745 | trace->blocks[index] = p; 746 | trace->block_sizes[index] = size; 747 | 748 | /* Keep track of current total size 749 | * of all allocated blocks */ 750 | total_size += size; 751 | 752 | /* Update statistics */ 753 | max_total_size = (total_size > max_total_size) ? 754 | total_size : max_total_size; 755 | break; 756 | 757 | case REALLOC: /* mm_realloc */ 758 | index = trace->ops[i].index; 759 | newsize = trace->ops[i].size; 760 | oldsize = trace->block_sizes[index]; 761 | 762 | oldp = trace->blocks[index]; 763 | if ((newp = mm_realloc(oldp,newsize)) == NULL) 764 | app_error("mm_realloc failed in eval_mm_util"); 765 | 766 | /* Remember region and size */ 767 | trace->blocks[index] = newp; 768 | trace->block_sizes[index] = newsize; 769 | 770 | /* Keep track of current total size 771 | * of all allocated blocks */ 772 | total_size += (newsize - oldsize); 773 | 774 | /* Update statistics */ 775 | max_total_size = (total_size > max_total_size) ? 776 | total_size : max_total_size; 777 | break; 778 | 779 | case FREE: /* mm_free */ 780 | index = trace->ops[i].index; 781 | size = trace->block_sizes[index]; 782 | p = trace->blocks[index]; 783 | 784 | mm_free(p); 785 | 786 | /* Keep track of current total size 787 | * of all allocated blocks */ 788 | total_size -= size; 789 | 790 | break; 791 | 792 | default: 793 | app_error("Nonexistent request type in eval_mm_util"); 794 | 795 | } 796 | } 797 | 798 | return ((double)max_total_size / (double)mem_heapsize()); 799 | } 800 | 801 | 802 | /* 803 | * eval_mm_speed - This is the function that is used by fcyc() 804 | * to measure the running time of the mm malloc package. 805 | */ 806 | static void eval_mm_speed(void *ptr) 807 | { 808 | int i, index, size, newsize; 809 | char *p, *newp, *oldp, *block; 810 | trace_t *trace = ((speed_t *)ptr)->trace; 811 | 812 | /* Reset the heap and initialize the mm package */ 813 | mem_reset_brk(); 814 | if (mm_init(NULL) < 0) 815 | app_error("mm_init failed in eval_mm_speed"); 816 | 817 | /* Interpret each trace request */ 818 | for (i = 0; i < trace->num_ops; i++) 819 | switch (trace->ops[i].type) { 820 | 821 | case ALLOC: /* mm_malloc */ 822 | index = trace->ops[i].index; 823 | size = trace->ops[i].size; 824 | if ((p = mm_malloc(size)) == NULL) 825 | app_error("mm_malloc error in eval_mm_speed"); 826 | trace->blocks[index] = p; 827 | break; 828 | 829 | case REALLOC: /* mm_realloc */ 830 | index = trace->ops[i].index; 831 | newsize = trace->ops[i].size; 832 | oldp = trace->blocks[index]; 833 | if ((newp = mm_realloc(oldp,newsize)) == NULL) 834 | app_error("mm_realloc error in eval_mm_speed"); 835 | trace->blocks[index] = newp; 836 | break; 837 | 838 | case FREE: /* mm_free */ 839 | index = trace->ops[i].index; 840 | block = trace->blocks[index]; 841 | mm_free(block); 842 | break; 843 | 844 | default: 845 | app_error("Nonexistent request type in eval_mm_valid"); 846 | } 847 | } 848 | 849 | /* 850 | * eval_libc_valid - We run this function to make sure that the 851 | * libc malloc can run to completion on the set of traces. 852 | * We'll be conservative and terminate if any libc malloc call fails. 853 | * 854 | */ 855 | static int eval_libc_valid(trace_t *trace, int tracenum) 856 | { 857 | int i, newsize; 858 | char *p, *newp, *oldp; 859 | 860 | for (i = 0; i < trace->num_ops; i++) { 861 | switch (trace->ops[i].type) { 862 | 863 | case ALLOC: /* malloc */ 864 | if ((p = malloc(trace->ops[i].size)) == NULL) { 865 | malloc_error(tracenum, i, "libc malloc failed"); 866 | unix_error("System message"); 867 | } 868 | trace->blocks[trace->ops[i].index] = p; 869 | break; 870 | 871 | case REALLOC: /* realloc */ 872 | newsize = trace->ops[i].size; 873 | oldp = trace->blocks[trace->ops[i].index]; 874 | if ((newp = realloc(oldp, newsize)) == NULL) { 875 | malloc_error(tracenum, i, "libc realloc failed"); 876 | unix_error("System message"); 877 | } 878 | trace->blocks[trace->ops[i].index] = newp; 879 | break; 880 | 881 | case FREE: /* free */ 882 | free(trace->blocks[trace->ops[i].index]); 883 | break; 884 | 885 | default: 886 | app_error("invalid operation type in eval_libc_valid"); 887 | } 888 | } 889 | 890 | return 1; 891 | } 892 | 893 | /* 894 | * eval_libc_speed - This is the function that is used by fcyc() to 895 | * measure the running time of the libc malloc package on the set 896 | * of traces. 897 | */ 898 | static void eval_libc_speed(void *ptr) 899 | { 900 | int i; 901 | int index, size, newsize; 902 | char *p, *newp, *oldp, *block; 903 | trace_t *trace = ((speed_t *)ptr)->trace; 904 | 905 | for (i = 0; i < trace->num_ops; i++) { 906 | switch (trace->ops[i].type) { 907 | case ALLOC: /* malloc */ 908 | index = trace->ops[i].index; 909 | size = trace->ops[i].size; 910 | if ((p = malloc(size)) == NULL) 911 | unix_error("malloc failed in eval_libc_speed"); 912 | trace->blocks[index] = p; 913 | break; 914 | 915 | case REALLOC: /* realloc */ 916 | index = trace->ops[i].index; 917 | newsize = trace->ops[i].size; 918 | oldp = trace->blocks[index]; 919 | if ((newp = realloc(oldp, newsize)) == NULL) 920 | unix_error("realloc failed in eval_libc_speed\n"); 921 | 922 | trace->blocks[index] = newp; 923 | break; 924 | 925 | case FREE: /* free */ 926 | index = trace->ops[i].index; 927 | block = trace->blocks[index]; 928 | free(block); 929 | break; 930 | } 931 | } 932 | } 933 | 934 | /************************************* 935 | * Some miscellaneous helper routines 936 | ************************************/ 937 | 938 | 939 | /* 940 | * printresults - prints a performance summary for some malloc package 941 | */ 942 | static void printresults(int n, stats_t *stats) 943 | { 944 | int i; 945 | double secs = 0; 946 | double ops = 0; 947 | double util = 0; 948 | 949 | /* Print the individual results for each trace */ 950 | printf("%5s %7s %5s %8s %10s %6s\n", 951 | "trace", " valid", "util", "ops", "secs", "Kops"); 952 | for (i=0; i < n; i++) { 953 | if (stats[i].valid) { 954 | printf("%2d %10s %5.0f%% %8.0f %10.6f %6.0f\n", 955 | i, 956 | "yes", 957 | stats[i].util*100.0, 958 | stats[i].ops, 959 | stats[i].secs, 960 | (stats[i].ops/1e3)/stats[i].secs); 961 | secs += stats[i].secs; 962 | ops += stats[i].ops; 963 | util += stats[i].util; 964 | } 965 | else { 966 | printf("%2d %10s %6s %8s %10s %6s\n", 967 | i, 968 | "no", 969 | "-", 970 | "-", 971 | "-", 972 | "-"); 973 | } 974 | } 975 | 976 | /* Print the aggregate results for the set of traces */ 977 | if (errors == 0) { 978 | printf("%12s %5.0f%% %8.0f %10.6f %6.0f\n", 979 | "Total ", 980 | (util/n)*100.0, 981 | ops, 982 | secs, 983 | (ops/1e3)/secs); 984 | } 985 | else { 986 | printf("%12s %6s %8s %10s %6s\n", 987 | "Total ", 988 | "-", 989 | "-", 990 | "-", 991 | "-"); 992 | } 993 | 994 | } 995 | 996 | /* 997 | * app_error - Report an arbitrary application error 998 | */ 999 | void app_error(char *msg) 1000 | { 1001 | printf("%s\n", msg); 1002 | exit(1); 1003 | } 1004 | 1005 | /* 1006 | * unix_error - Report a Unix-style error 1007 | */ 1008 | void unix_error(char *msg) 1009 | { 1010 | printf("%s: %s\n", msg, strerror(errno)); 1011 | exit(1); 1012 | } 1013 | 1014 | /* 1015 | * malloc_error - Report an error returned by the mm_malloc package 1016 | */ 1017 | void malloc_error(int tracenum, int opnum, char *msg) 1018 | { 1019 | errors++; 1020 | printf("ERROR [trace %d, line %d]: %s\n", tracenum, LINENUM(opnum), msg); 1021 | } 1022 | 1023 | /* 1024 | * usage - Explain the command line arguments 1025 | */ 1026 | static void usage(void) 1027 | { 1028 | fprintf(stderr, "Usage: mdriver [-hvVal] [-f ] [-t ]\n"); 1029 | fprintf(stderr, "Options\n"); 1030 | fprintf(stderr, "\t-a Don't check the team structure.\n"); 1031 | fprintf(stderr, "\t-f Use as the trace file.\n"); 1032 | fprintf(stderr, "\t-g Generate summary info for autograder.\n"); 1033 | fprintf(stderr, "\t-h Print this message.\n"); 1034 | fprintf(stderr, "\t-l Run libc malloc as well.\n"); 1035 | fprintf(stderr, "\t-t Directory to find default traces.\n"); 1036 | fprintf(stderr, "\t-v Print per-trace performance breakdowns.\n"); 1037 | fprintf(stderr, "\t-V Print additional debug info.\n"); 1038 | } 1039 | -------------------------------------------------------------------------------- /memlib.c: -------------------------------------------------------------------------------- 1 | /* 2 | * memlib.c - a module that simulates the memory system. Needed because it 3 | * allows us to interleave calls from the student's malloc package 4 | * with the system's malloc package in libc. 5 | */ 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "memlib.h" 15 | #include "config.h" 16 | 17 | /* private variables */ 18 | static char *mem_start_brk; /* points to first byte of heap */ 19 | static char *mem_brk; /* points to last byte of heap */ 20 | static char *mem_max_addr; /* largest legal heap address */ 21 | 22 | /* 23 | * mem_init - initialize the memory system model 24 | */ 25 | void mem_init(void) 26 | { 27 | /* allocate the storage we will use to model the available VM */ 28 | if ((mem_start_brk = (char *)malloc(MAX_HEAP)) == NULL) { 29 | fprintf(stderr, "mem_init_vm: malloc error\n"); 30 | exit(1); 31 | } 32 | 33 | mem_max_addr = mem_start_brk + MAX_HEAP; /* max legal heap address */ 34 | mem_brk = mem_start_brk; /* heap is empty initially */ 35 | } 36 | 37 | /* 38 | * mem_deinit - free the storage used by the memory system model 39 | */ 40 | void mem_deinit(void) 41 | { 42 | free(mem_start_brk); 43 | } 44 | 45 | /* 46 | * mem_reset_brk - reset the simulated brk pointer to make an empty heap 47 | */ 48 | void mem_reset_brk() 49 | { 50 | mem_brk = mem_start_brk; 51 | } 52 | 53 | /* 54 | * mem_sbrk - simple model of the sbrk function. Extends the heap 55 | * by incr bytes and returns the start address of the new area. In 56 | * this model, the heap cannot be shrunk. 57 | */ 58 | void *mem_sbrk(int incr) 59 | { 60 | char *old_brk = mem_brk; 61 | 62 | if ( (incr < 0) || ((mem_brk + incr) > mem_max_addr)) { 63 | errno = ENOMEM; 64 | fprintf(stderr, "ERROR: mem_sbrk failed. Ran out of memory...\n"); 65 | return (void *)-1; 66 | } 67 | mem_brk += incr; 68 | return (void *)old_brk; 69 | } 70 | 71 | /* 72 | * mem_heap_lo - return address of the first heap byte 73 | */ 74 | void *mem_heap_lo() 75 | { 76 | return (void *)mem_start_brk; 77 | } 78 | 79 | /* 80 | * mem_heap_hi - return address of last heap byte 81 | */ 82 | void *mem_heap_hi() 83 | { 84 | return (void *)(mem_brk - 1); 85 | } 86 | 87 | /* 88 | * mem_heapsize() - returns the heap size in bytes 89 | */ 90 | size_t mem_heapsize() 91 | { 92 | return (size_t)(mem_brk - mem_start_brk); 93 | } 94 | 95 | /* 96 | * mem_pagesize() - returns the page size of the system 97 | */ 98 | size_t mem_pagesize() 99 | { 100 | return (size_t)getpagesize(); 101 | } 102 | -------------------------------------------------------------------------------- /memlib.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | void mem_init(void); 4 | void mem_deinit(void); 5 | void *mem_sbrk(int incr); 6 | void mem_reset_brk(void); 7 | void *mem_heap_lo(void); 8 | void *mem_heap_hi(void); 9 | size_t mem_heapsize(void); 10 | size_t mem_pagesize(void); 11 | 12 | -------------------------------------------------------------------------------- /memory-leak.rep: -------------------------------------------------------------------------------- 1 | 20000 2 | 6 3 | 8 4 | 1 5 | a 0 2040 6 | a 1 2040 7 | f 1 8 | a 2 48 9 | a 3 4072 10 | f 3 11 | a 4 4072 12 | a 5 4072 13 | -------------------------------------------------------------------------------- /mm.c: -------------------------------------------------------------------------------- 1 | /* 2 | * mm.c - fast and memory-efficient malloc package 3 | * 4 | * In this package, a block is allocated with 8 byte header. Free 5 | * blocks are maintained by Red-black tree, which allows logarithmic 6 | * time complexity of best-fit malloc and free. If a request size is larger 7 | * than any free blocks, it simply increases the brk pointer. 8 | * When a block is freed, immediate coalescing occurs. Realloc is 9 | * not implemented here. 10 | * 11 | * Red-black tree implementation is modified from 12 | * - http://web.mit.edu/~emin/www.old/source_code/red_black_tree/red_black_tree.c 13 | * - http://en.wikipedia.org/wiki/Red%E2%80%93black_tree 14 | * Red-black tree uses block size as key. 15 | * 16 | * Setting DEBUG flag will print core function calls and full RBtree contents. 17 | * Setting CHECK flag will check heap consistency each time malloc and free are called. 18 | */ 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include "mm.h" 26 | #include "memlib.h" 27 | 28 | /********************************************************* 29 | * NOTE TO STUDENTS: Before you do anything else, please 30 | * provide your information in the following struct. 31 | ********************************************************/ 32 | team_t team = { 33 | /* Team name : Your student ID */ 34 | "2013-11395", 35 | /* Your full name */ 36 | "HeeHoon Kim", 37 | /* Your student ID */ 38 | "2013-11395", 39 | /* leave blank */ 40 | "", 41 | /* leave blank */ 42 | "" 43 | }; 44 | 45 | /* DON'T MODIFY THIS VALUE AND LEAVE IT AS IT WAS */ 46 | static range_t **gl_ranges; 47 | 48 | /* 49 | * Block structure 50 | * 51 | * We assume sizeof(size_t) == 4 and sizeof(void*) == 4. 52 | * 53 | * An allocated block 54 | * 55 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- current 56 | * | Size of previous block |0|0|F| 57 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 58 | * | Size of current block |0|0|F| 59 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- user 60 | * . . 61 | * . User data . 62 | * . . 63 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- next 64 | * | Size of current block |0|0|F| 65 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- (brk) 66 | * 67 | * The size of current block is stored in both current block's header 68 | * and next block's header. So brk is always 4 byte off from 8-byte 69 | * boundary. Like libc malloc, user is always aligned to 8-byte boundary. 70 | * Since last 3 bits of size will be 0, the last bit is used for 71 | * indicating whether the block is free. (1 if free) 72 | * 73 | * An free block 74 | * 75 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- current 76 | * | Size of previous block |0|0|F| 77 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 78 | * | Size of current block |0|0|F| 79 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 80 | * | Address of left child | 81 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 82 | * | Address of right child | 83 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 84 | * | Address of parent | 85 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 86 | * | Garbage |R| 87 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 88 | * . . 89 | * . Garbage . 90 | * . . 91 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- next 92 | * | Size of current block |0|0|F| 93 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ <- (brk) 94 | * 95 | * Addresses of children and parent are added in order to maintain Red-black 96 | * tree. Color is stored in the last bit after parent address. (1 if red) 97 | * Therefore, in order to store free block in the tree, the block should 98 | * be at least 24-byte (MIN_BLOCK_SIZE) including the header. Thus, this 99 | * package always allocates more than or equal to MIN_BLOCK_SIZE. Note that 100 | * free block which is smaller than MIN_BLOCK_SIZE can still happen when 101 | * a block is assigned from a bigger free block. 102 | * 103 | */ 104 | 105 | /* double word (8) alignment */ 106 | #define ALIGNMENT 8 107 | /* rounds up to the nearest multiple of ALIGNMENT */ 108 | #define ALIGN(size) (((size) + (ALIGNMENT-1)) & ~0x7) 109 | 110 | #define HEADER_SIZE 8 111 | #define MIN_BLOCK_SIZE 24 112 | #define FAIL ((void*)-1) 113 | 114 | /* 115 | * pointer macros 116 | */ 117 | #define PREV_SIZE(p) (*(size_t*)(p)) 118 | /* returns block size without free bit. Note that this is r-value */ 119 | #define PREV_SIZE_MASKED(p) (PREV_SIZE(p) & ~0x7) 120 | #define PREV_FREE(p) (PREV_SIZE(p) & 0x1) 121 | #define CUR_SIZE(p) (*(size_t*)((p) + 4)) 122 | #define CUR_SIZE_MASKED(p) (CUR_SIZE(p) & ~0x7) 123 | #define CUR_FREE(p) (CUR_SIZE(p) & 0x1) 124 | #define RB_LEFT(p) (*(void**)((p) + 8)) 125 | #define RB_RIGHT(p) (*(void**)((p) + 12)) 126 | #define RB_PARENT(p) (*(void**)((p) + 16)) 127 | #define RB_RED(p) (*(int*)((p) + 20)) 128 | #define PREV_BLOCK(p, sz) ((p) - (sz)) 129 | #define NEXT_BLOCK(p, sz) ((p) + (sz)) 130 | #define USER_BLOCK(p) ((p) + HEADER_SIZE) 131 | /* should it be in Red-black tree? */ 132 | #define IS_IN_RB(p) (CUR_SIZE_MASKED(p) >= MIN_BLOCK_SIZE) 133 | 134 | /* root and nil node of Red-black tree, which will be allocated in heap */ 135 | static void *rb_root, *rb_null; 136 | 137 | /* 138 | * remove_range - manipulate range lists 139 | * DON'T MODIFY THIS FUNCTION AND LEAVE IT AS IT WAS 140 | */ 141 | static void remove_range(range_t **ranges, char *lo) 142 | { 143 | range_t *p; 144 | range_t **prevpp = ranges; 145 | 146 | if (!ranges) 147 | return; 148 | 149 | for (p = *ranges; p != NULL; p = p->next) { 150 | if (p->lo == lo) { 151 | *prevpp = p->next; 152 | free(p); 153 | break; 154 | } 155 | prevpp = &(p->next); 156 | } 157 | } 158 | 159 | /* 160 | * mm_init - initialize the malloc package. 161 | */ 162 | int mm_init(range_t **ranges) 163 | { 164 | /* allocate root and nil nodes */ 165 | if((rb_root = rb_null = mem_sbrk(4 + MIN_BLOCK_SIZE)) == FAIL) return -1; 166 | /* assign sentinel values */ 167 | RB_LEFT(rb_root) = RB_RIGHT(rb_root) = rb_null; 168 | RB_RED(rb_root) = 0; 169 | /* prevent coalesce by setting free bit to 0*/ 170 | PREV_SIZE(NEXT_BLOCK(rb_null, MIN_BLOCK_SIZE)) = 0; 171 | 172 | /* DON't MODIFY THIS STAGE AND LEAVE IT AS IT WAS */ 173 | gl_ranges = ranges; 174 | 175 | return 0; 176 | } 177 | 178 | /* 179 | * rb_find - find the smallest free block which is bigger than or equal to size. 180 | */ 181 | static void* rb_find(size_t size){ 182 | void *node = RB_LEFT(rb_root), *best = rb_null; 183 | while(node != rb_null){ 184 | if(CUR_SIZE_MASKED(node) < size){ 185 | node = RB_RIGHT(node); 186 | }else{ 187 | best = node; 188 | node = RB_LEFT(node); 189 | } 190 | } 191 | return best; 192 | } 193 | 194 | /* 195 | * rb_find_exact - check whether block is in Red-black tree or not. 196 | */ 197 | static int rb_find_exact(void *block){ 198 | void *node = RB_LEFT(rb_root); 199 | while(node != rb_null){ 200 | if(node == block){ 201 | return 1; 202 | }else if(CUR_SIZE_MASKED(node) > CUR_SIZE_MASKED(block)){ 203 | node = RB_LEFT(node); 204 | }else if(CUR_SIZE_MASKED(node) == CUR_SIZE_MASKED(block)){ 205 | if(node > block){ 206 | node = RB_LEFT(node); 207 | }else{ 208 | node = RB_RIGHT(node); 209 | } 210 | }else{ 211 | node = RB_RIGHT(node); 212 | } 213 | } 214 | return 0; 215 | } 216 | 217 | /* 218 | * rb_successor - find the next node of node in ascending order. 219 | */ 220 | static void* rb_successor(void *node){ 221 | void *succ, *left; 222 | if((succ = RB_RIGHT(node)) != rb_null){ 223 | while((left = RB_LEFT(succ)) != rb_null){ 224 | succ = left; 225 | } 226 | return succ; 227 | }else{ 228 | succ = RB_PARENT(node); 229 | while(RB_RIGHT(succ) == node){ 230 | node = succ; 231 | succ = RB_PARENT(succ); 232 | } 233 | if(succ == rb_root) return rb_null; 234 | return succ; 235 | } 236 | } 237 | 238 | /* 239 | * rb_rotate_left - rotate node and children of node to the left 240 | */ 241 | static void rb_rotate_left(void *node){ 242 | void *right; 243 | 244 | right = RB_RIGHT(node); 245 | RB_RIGHT(node) = RB_LEFT(right); 246 | if(RB_LEFT(right) != rb_null) 247 | RB_PARENT(RB_LEFT(right)) = node; 248 | 249 | RB_PARENT(right) = RB_PARENT(node); 250 | if(node == RB_LEFT(RB_PARENT(node))){ 251 | RB_LEFT(RB_PARENT(node)) = right; 252 | }else{ 253 | RB_RIGHT(RB_PARENT(node)) = right; 254 | } 255 | RB_LEFT(right) = node; 256 | RB_PARENT(node) = right; 257 | } 258 | 259 | /* 260 | * rb_rotate_right - rotate node and children of node to the right 261 | */ 262 | static void rb_rotate_right(void *node){ 263 | void *left; 264 | 265 | left = RB_LEFT(node); 266 | RB_LEFT(node) = RB_RIGHT(left); 267 | if(RB_RIGHT(left) != rb_null) 268 | RB_PARENT(RB_RIGHT(left)) = node; 269 | 270 | RB_PARENT(left) = RB_PARENT(node); 271 | if(node == RB_LEFT(RB_PARENT(node))){ 272 | RB_LEFT(RB_PARENT(node)) = left; 273 | }else{ 274 | RB_RIGHT(RB_PARENT(node)) = left; 275 | } 276 | RB_RIGHT(left) = node; 277 | RB_PARENT(node) = left; 278 | } 279 | 280 | /* 281 | * rb_fix - restore properties of Red-black tree after deleting 282 | */ 283 | static void rb_fix(void *node){ 284 | void *root, *sib; 285 | root = RB_LEFT(rb_root); 286 | while(!RB_RED(node) && node != root){ 287 | if(node == RB_LEFT(RB_PARENT(node))){ 288 | sib = RB_RIGHT(RB_PARENT(node)); 289 | if(RB_RED(sib)){ 290 | RB_RED(sib) = 0; 291 | RB_RED(RB_PARENT(node)) = 1; 292 | rb_rotate_left(RB_PARENT(node)); 293 | sib = RB_RIGHT(RB_PARENT(node)); 294 | } 295 | if(!RB_RED(RB_RIGHT(sib)) && !RB_RED(RB_LEFT(sib))){ 296 | RB_RED(sib) = 1; 297 | node = RB_PARENT(node); 298 | }else{ 299 | if(!RB_RED(RB_RIGHT(sib))){ 300 | RB_RED(RB_LEFT(sib)) = 0; 301 | RB_RED(sib) = 1; 302 | rb_rotate_right(sib); 303 | sib = RB_RIGHT(RB_PARENT(node)); 304 | } 305 | RB_RED(sib) = RB_RED(RB_PARENT(node)); 306 | RB_RED(RB_PARENT(node)) = 0; 307 | RB_RED(RB_RIGHT(sib)) = 0; 308 | rb_rotate_left(RB_PARENT(node)); 309 | node = root; 310 | } 311 | }else{ 312 | sib = RB_LEFT(RB_PARENT(node)); 313 | if(RB_RED(sib)){ 314 | RB_RED(sib) = 0; 315 | RB_RED(RB_PARENT(node)) = 1; 316 | rb_rotate_right(RB_PARENT(node)); 317 | sib = RB_LEFT(RB_PARENT(node)); 318 | } 319 | if(!RB_RED(RB_RIGHT(sib)) && !RB_RED(RB_LEFT(sib))){ 320 | RB_RED(sib) = 1; 321 | node = RB_PARENT(node); 322 | }else{ 323 | if(!RB_RED(RB_LEFT(sib))){ 324 | RB_RED(RB_RIGHT(sib)) = 0; 325 | RB_RED(sib) = 1; 326 | rb_rotate_left(sib); 327 | sib = RB_LEFT(RB_PARENT(node)); 328 | } 329 | RB_RED(sib) = RB_RED(RB_PARENT(node)); 330 | RB_RED(RB_PARENT(node)) = 0; 331 | RB_RED(RB_LEFT(sib)) = 0; 332 | rb_rotate_right(RB_PARENT(node)); 333 | node = root; 334 | } 335 | } 336 | 337 | } 338 | RB_RED(node) = 0; 339 | } 340 | 341 | /* 342 | * rb_delete - delete node from Red-black tree 343 | */ 344 | static void rb_delete(void *node){ 345 | void *m, *c; 346 | m = RB_LEFT(node) == rb_null || RB_RIGHT(node) == rb_null ? node : rb_successor(node); 347 | c = RB_LEFT(m) == rb_null ? RB_RIGHT(m) : RB_LEFT(m); 348 | if((RB_PARENT(c) = RB_PARENT(m)) == rb_root){ 349 | RB_LEFT(rb_root) = c; 350 | }else{ 351 | if(RB_LEFT(RB_PARENT(m)) == m){ 352 | RB_LEFT(RB_PARENT(m)) = c; 353 | }else{ 354 | RB_RIGHT(RB_PARENT(m)) = c; 355 | } 356 | } 357 | if(m != node){ 358 | if(!RB_RED(m)) rb_fix(c); 359 | RB_LEFT(m) = RB_LEFT(node); 360 | RB_RIGHT(m) = RB_RIGHT(node); 361 | RB_PARENT(m) = RB_PARENT(node); 362 | RB_RED(m) = RB_RED(node); 363 | RB_PARENT(RB_LEFT(node)) = RB_PARENT(RB_RIGHT(node)) = m; 364 | if(node == RB_LEFT(RB_PARENT(node))){ 365 | RB_LEFT(RB_PARENT(node)) = m; 366 | }else{ 367 | RB_RIGHT(RB_PARENT(node)) = m; 368 | } 369 | }else{ 370 | if(!RB_RED(m)) rb_fix(c); 371 | } 372 | } 373 | 374 | /* 375 | * rb_insert - insert node into Red-black tree 376 | */ 377 | static void rb_insert(void *node){ 378 | void *parent, *child, *sib; 379 | 380 | RB_LEFT(node) = RB_RIGHT(node) = rb_null; 381 | parent = rb_root; 382 | child = RB_LEFT(rb_root); 383 | while(child != rb_null){ 384 | parent = child; 385 | if(CUR_SIZE_MASKED(child) > CUR_SIZE_MASKED(node)){ 386 | child = RB_LEFT(child); 387 | }else if(CUR_SIZE_MASKED(child) == CUR_SIZE_MASKED(node)){ 388 | if(child > node){ 389 | child = RB_LEFT(child); 390 | }else{ 391 | child = RB_RIGHT(child); 392 | } 393 | }else{ 394 | child = RB_RIGHT(child); 395 | } 396 | } 397 | RB_PARENT(node) = parent; 398 | if(parent == rb_root || CUR_SIZE_MASKED(parent) > CUR_SIZE_MASKED(node)){ 399 | RB_LEFT(parent) = node; 400 | }else if(CUR_SIZE_MASKED(parent) == CUR_SIZE_MASKED(node)){ 401 | if(parent > node){ 402 | RB_LEFT(parent) = node; 403 | }else{ 404 | RB_RIGHT(parent) = node; 405 | } 406 | }else{ 407 | RB_RIGHT(parent) = node; 408 | } 409 | 410 | RB_RED(node) = 1; 411 | while(RB_RED(RB_PARENT(node))){ 412 | if(RB_PARENT(node) == RB_LEFT(RB_PARENT(RB_PARENT(node)))){ 413 | sib = RB_RIGHT(RB_PARENT(RB_PARENT(node))); 414 | if(RB_RED(sib)){ 415 | RB_RED(RB_PARENT(node)) = 0; 416 | RB_RED(sib) = 0; 417 | RB_RED(RB_PARENT(RB_PARENT(node))) = 1; 418 | node = RB_PARENT(RB_PARENT(node)); 419 | }else{ 420 | if(node == RB_RIGHT(RB_PARENT(node))){ 421 | node = RB_PARENT(node); 422 | rb_rotate_left(node); 423 | } 424 | RB_RED(RB_PARENT(node)) = 0; 425 | RB_RED(RB_PARENT(RB_PARENT(node))) = 1; 426 | rb_rotate_right(RB_PARENT(RB_PARENT(node))); 427 | } 428 | }else{ 429 | sib = RB_LEFT(RB_PARENT(RB_PARENT(node))); 430 | if(RB_RED(sib)){ 431 | RB_RED(RB_PARENT(node)) = 0; 432 | RB_RED(sib) = 0; 433 | RB_RED(RB_PARENT(RB_PARENT(node))) = 1; 434 | node = RB_PARENT(RB_PARENT(node)); 435 | }else{ 436 | if(node == RB_LEFT(RB_PARENT(node))){ 437 | node = RB_PARENT(node); 438 | rb_rotate_right(node); 439 | } 440 | RB_RED(RB_PARENT(node)) = 0; 441 | RB_RED(RB_PARENT(RB_PARENT(node))) = 1; 442 | rb_rotate_left(RB_PARENT(RB_PARENT(node))); 443 | } 444 | } 445 | } 446 | RB_RED(RB_LEFT(rb_root)) = 0; 447 | } 448 | 449 | /* 450 | * rb_print_preorder_impl - recursion implementation of rb_print_preorder 451 | */ 452 | static void rb_print_preorder_impl(void *node){ 453 | if(RB_LEFT(node) != rb_null){ 454 | rb_print_preorder_impl(RB_LEFT(node)); 455 | } 456 | printf("%p : %u\n", node, CUR_SIZE_MASKED(node)); 457 | if(RB_RIGHT(node) != rb_null){ 458 | rb_print_preorder_impl(RB_RIGHT(node)); 459 | } 460 | } 461 | 462 | /* 463 | * rb_print_preorder - print nodes of Red-black tree in preorder 464 | */ 465 | static void rb_print_preorder(){ 466 | printf("rb_print_preorder() called\n"); 467 | if(RB_LEFT(rb_root) == rb_null){ 468 | printf("empty\n"); 469 | }else{ 470 | rb_print_preorder_impl(RB_LEFT(rb_root)); 471 | } 472 | } 473 | 474 | /* 475 | * rb_check_preorder_impl - recursion implementation of rb_check_preorder 476 | */ 477 | static int rb_check_preorder_impl(void *node){ 478 | if(RB_LEFT(node) != rb_null){ 479 | if(!rb_check_preorder_impl(RB_LEFT(node))){ 480 | return 0; 481 | } 482 | } 483 | if(!CUR_FREE(node)){ 484 | printf("%p is in Red-black tree, but is not free block.\n", node); 485 | return 0; 486 | } 487 | if(RB_RIGHT(node) != rb_null){ 488 | if(!rb_check_preorder_impl(RB_RIGHT(node))){ 489 | return 0; 490 | } 491 | } 492 | return 1; 493 | } 494 | 495 | /* 496 | * rb_check_preorder 497 | * 498 | * return 0 if there exists allocated block in Red-black tree, 1 otherwise. 499 | */ 500 | static int rb_check_preorder(){ 501 | if(RB_LEFT(rb_root) != rb_null){ 502 | return rb_check_preorder_impl(RB_LEFT(rb_root)); 503 | } 504 | return 1; 505 | } 506 | 507 | /* 508 | * mm_check - heap consistency checker. return 0 if something is wrong, 1 otherwise. 509 | */ 510 | int mm_check(void) 511 | { 512 | void *cur, *end; 513 | 514 | if(!rb_check_preorder()){ 515 | return 0; 516 | } 517 | 518 | cur = mem_heap_lo() + MIN_BLOCK_SIZE; 519 | end = mem_heap_hi() - 3; 520 | while(cur < end){ 521 | if(CUR_FREE(cur)){ // cur is free block 522 | if(PREV_FREE(cur)){ // contiguous free block 523 | printf("%p, %p are consecutive, but both are free.\n", 524 | PREV_BLOCK(cur, CUR_SIZE_MASKED(cur)), cur); 525 | return 0; 526 | } 527 | if(IS_IN_RB(cur) && !rb_find_exact(cur)){ // cur is not in Red-black tree 528 | printf("%p is free block, but is not in Red-black tree.\n", cur); 529 | return 0; 530 | } 531 | }else{ // cur is allocated block 532 | } 533 | cur = NEXT_BLOCK(cur, CUR_SIZE_MASKED(cur)); 534 | } 535 | return 1; 536 | } 537 | 538 | /* 539 | * mm_malloc - Allocate a block 540 | * 541 | * If there exists a free block where the request fits, get the smallest one, segment it and allocate. 542 | * If there is no such block, increase brk. 543 | */ 544 | void* mm_malloc(size_t size) 545 | { 546 | size_t block_size, next_block_size; 547 | void *free_block, *next_block; 548 | 549 | block_size = ALIGN(HEADER_SIZE + size); 550 | block_size = block_size < MIN_BLOCK_SIZE ? MIN_BLOCK_SIZE : block_size; 551 | 552 | free_block = rb_find(block_size); 553 | if(free_block == rb_null){ // proper free block not found 554 | /* set free_block to the end of last block in heap */ 555 | free_block = mem_heap_hi() - 3; 556 | if(PREV_FREE(free_block)){ // if the last block is free 557 | /* set free_block to the last block */ 558 | free_block -= PREV_SIZE_MASKED(free_block); 559 | if(IS_IN_RB(free_block)){ 560 | rb_delete(free_block); 561 | } 562 | /* this block is smaller than request, so increase brk */ 563 | mem_sbrk(block_size - CUR_SIZE_MASKED(free_block)); 564 | }else{ // if the last block is not free 565 | mem_sbrk(block_size); 566 | } 567 | }else{ 568 | /* will be allocated, so delete from tree first */ 569 | rb_delete(free_block); 570 | /* if the block is bigger than request, segment it */ 571 | if((next_block_size = CUR_SIZE_MASKED(free_block) - block_size) > 0){ 572 | next_block = NEXT_BLOCK(free_block, block_size); 573 | CUR_SIZE(next_block) = PREV_SIZE(NEXT_BLOCK(next_block, next_block_size)) = next_block_size | 1; 574 | if(IS_IN_RB(next_block)){ 575 | rb_insert(next_block); 576 | } 577 | } 578 | } 579 | CUR_SIZE(free_block) = PREV_SIZE(NEXT_BLOCK(free_block, block_size)) = block_size; 580 | 581 | #ifdef DEBUG 582 | printf("mm_malloc(%u) called\n", size); 583 | printf("free_block = %p\n", free_block); 584 | rb_print_preorder(); 585 | printf("\n"); 586 | #endif /* DEBUG */ 587 | 588 | #ifdef CHECK 589 | if(!mm_check()){ 590 | rb_print_preorder(); 591 | exit(0); 592 | } 593 | #endif /* CHECK */ 594 | 595 | return USER_BLOCK(free_block); 596 | } 597 | 598 | /* 599 | * mm_free - Coalesce with surrounding blocks, and put it to Red-black tree 600 | */ 601 | void mm_free(void *ptr) 602 | { 603 | size_t size, new_size; 604 | void *prev, *cur, *next, *new_block; 605 | 606 | cur = ptr - HEADER_SIZE; 607 | 608 | /* double free */ 609 | if(CUR_FREE(cur)){ 610 | printf("try to free a freed memory block(%p) is detected.\n", cur); 611 | return ; 612 | } 613 | 614 | new_block = cur; 615 | new_size = CUR_SIZE_MASKED(cur); 616 | 617 | /* coalesce with the previous block if free */ 618 | if(PREV_FREE(cur)){ 619 | size = PREV_SIZE_MASKED(cur); 620 | prev = PREV_BLOCK(cur, size); 621 | if(IS_IN_RB(prev)){ 622 | rb_delete(prev); 623 | } 624 | new_block = prev; 625 | new_size += size; 626 | } 627 | 628 | /* coalesce with the next block if exists and free */ 629 | size = CUR_SIZE_MASKED(cur); 630 | next = NEXT_BLOCK(cur, size); 631 | if(next + 4 <= mem_heap_hi() && CUR_FREE(next)){ 632 | size = CUR_SIZE_MASKED(next); 633 | if(IS_IN_RB(next)){ 634 | rb_delete(next); 635 | } 636 | new_size += size; 637 | } 638 | 639 | /* new free block setting */ 640 | CUR_SIZE(new_block) = PREV_SIZE(NEXT_BLOCK(new_block, new_size)) = new_size | 1; 641 | if(IS_IN_RB(new_block)){ 642 | rb_insert(new_block); 643 | } 644 | 645 | #ifdef DEBUG 646 | printf("mm_free(%p) called\n", ptr); 647 | printf("new_block = %p\n", new_block); 648 | rb_print_preorder(); 649 | printf("\n"); 650 | #endif /* DEBUG */ 651 | 652 | #ifdef CHECK 653 | if(!mm_check()){ 654 | rb_print_preorder(); 655 | exit(0); 656 | } 657 | #endif /* CHECK */ 658 | 659 | /* DON't MODIFY THIS STAGE AND LEAVE IT AS IT WAS */ 660 | if (gl_ranges) 661 | remove_range(gl_ranges, ptr); 662 | } 663 | 664 | /* 665 | * mm_realloc - empty implementation; YOU DO NOT NEED TO IMPLEMENT THIS 666 | */ 667 | void* mm_realloc(void *ptr, size_t t) 668 | { 669 | return NULL; 670 | } 671 | 672 | /* 673 | * mm_exit - finalize the malloc package. 674 | */ 675 | void mm_exit(void) 676 | { 677 | void *cur, *end; 678 | 679 | cur = mem_heap_lo() + MIN_BLOCK_SIZE; 680 | end = mem_heap_hi() - 3; 681 | while(cur < end){ 682 | /* check if there are allocated blocks remaining */ 683 | if(!CUR_FREE(cur)){ 684 | printf("memory leak at %p is detected.\n", cur); 685 | mm_free(cur + HEADER_SIZE); 686 | } 687 | cur = NEXT_BLOCK(cur, CUR_SIZE_MASKED(cur)); 688 | } 689 | } 690 | -------------------------------------------------------------------------------- /mm.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | /********************************************************* 4 | * Records the extent of each block's payload 5 | * for evaluate the validity of your allocator 6 | * DON'T MODIFY THIS STRUCT. 7 | ********************************************************/ 8 | typedef struct range_t { 9 | char *lo; /* low payload address */ 10 | char *hi; /* high payload address */ 11 | struct range_t *next; /* next list element */ 12 | } range_t; 13 | 14 | /* 15 | * Function lists which student should implement. 16 | */ 17 | extern int mm_init (range_t **ranges); 18 | extern void *mm_malloc (size_t size); 19 | extern void mm_free (void *ptr); 20 | extern void mm_exit (void); 21 | 22 | /* 23 | * Students work in teams of one or two. Teams enter their team name, 24 | * personal names and student IDs in a struct of this 25 | * type in their mm.c file. 26 | */ 27 | typedef struct { 28 | char *teamname; /* ID1+ID2 or ID1 */ 29 | char *name1; /* full name of first member */ 30 | char *id1; /* student ID of first member */ 31 | char *name2; /* full name of second member (if any) */ 32 | char *id2; /* student ID of second member */ 33 | } team_t; 34 | 35 | extern team_t team; 36 | 37 | // this is here for completeness, you don't need to implement this! 38 | extern void *mm_realloc(void *ptr, size_t size); 39 | -------------------------------------------------------------------------------- /random2-bal.rep: -------------------------------------------------------------------------------- 1 | 8493673 2 | 1024 3 | 2048 4 | 1 5 | a 0 13345 6 | a 1 463 7 | a 2 11978 8 | a 3 714 9 | a 4 11378 10 | a 5 2523 11 | a 6 7342 12 | a 7 5095 13 | a 8 3631 14 | a 9 226 15 | a 10 6664 16 | a 11 1515 17 | a 12 3883 18 | a 13 16081 19 | a 14 7567 20 | a 15 6030 21 | a 16 5674 22 | a 17 9149 23 | a 18 3435 24 | a 19 15774 25 | a 20 3719 26 | a 21 13843 27 | a 22 10077 28 | a 23 14670 29 | a 24 12284 30 | a 25 4677 31 | a 26 7919 32 | f 16 33 | a 27 11008 34 | a 28 10056 35 | a 29 13888 36 | a 30 7577 37 | a 31 13728 38 | a 32 5322 39 | a 33 9900 40 | a 34 12672 41 | a 35 6251 42 | a 36 10062 43 | a 37 15716 44 | a 38 2163 45 | a 39 4319 46 | a 40 5631 47 | a 41 2683 48 | a 42 12848 49 | a 43 5168 50 | a 44 11659 51 | a 45 15400 52 | a 46 6071 53 | a 47 7946 54 | a 48 1764 55 | a 49 14943 56 | a 50 8927 57 | a 51 5626 58 | a 52 5178 59 | a 53 9084 60 | a 54 3326 61 | a 55 6751 62 | a 56 4671 63 | a 57 11965 64 | a 58 9270 65 | a 59 2898 66 | a 60 5169 67 | a 61 13293 68 | a 62 10936 69 | f 51 70 | a 63 3021 71 | a 64 721 72 | a 65 5579 73 | a 66 6826 74 | a 67 13653 75 | a 68 13988 76 | a 69 3535 77 | f 15 78 | a 70 15456 79 | f 24 80 | a 71 16058 81 | a 72 8390 82 | a 73 3405 83 | a 74 7682 84 | a 75 4373 85 | a 76 10948 86 | a 77 896 87 | a 78 3334 88 | a 79 12873 89 | f 37 90 | a 80 15251 91 | a 81 7414 92 | a 82 8381 93 | a 83 13780 94 | a 84 3860 95 | a 85 8997 96 | a 86 11302 97 | a 87 13487 98 | a 88 1776 99 | a 89 6028 100 | a 90 9328 101 | a 91 10188 102 | a 92 12971 103 | f 89 104 | f 86 105 | a 93 4918 106 | a 94 13742 107 | a 95 4590 108 | a 96 6924 109 | a 97 16370 110 | a 98 8733 111 | a 99 5047 112 | a 100 207 113 | a 101 13654 114 | a 102 12453 115 | a 103 15768 116 | f 50 117 | a 104 11090 118 | a 105 6248 119 | a 106 2349 120 | a 107 16108 121 | a 108 12702 122 | a 109 3324 123 | a 110 255 124 | a 111 8229 125 | a 112 9329 126 | a 113 7479 127 | a 114 7614 128 | a 115 12681 129 | a 116 15628 130 | a 117 9080 131 | a 118 7115 132 | a 119 12938 133 | a 120 6553 134 | f 5 135 | a 121 6456 136 | a 122 3729 137 | a 123 15207 138 | a 124 10586 139 | a 125 4366 140 | f 102 141 | a 126 10697 142 | a 127 6076 143 | a 128 14930 144 | a 129 411 145 | a 130 5329 146 | a 131 12947 147 | a 132 9466 148 | a 133 12988 149 | a 134 2878 150 | a 135 10764 151 | f 127 152 | a 136 13689 153 | a 137 5988 154 | a 138 5046 155 | a 139 10548 156 | a 140 11202 157 | a 141 9869 158 | a 142 178 159 | a 143 15098 160 | f 45 161 | a 144 13145 162 | a 145 12343 163 | a 146 15323 164 | f 96 165 | a 147 6796 166 | a 148 464 167 | a 149 11325 168 | a 150 5916 169 | a 151 3758 170 | a 152 12313 171 | f 98 172 | a 153 15625 173 | a 154 11750 174 | a 155 12871 175 | a 156 4800 176 | a 157 15895 177 | f 131 178 | a 158 6838 179 | a 159 10432 180 | a 160 14615 181 | a 161 11362 182 | a 162 14822 183 | a 163 5849 184 | a 164 571 185 | a 165 7684 186 | a 166 672 187 | a 167 3761 188 | a 168 8969 189 | a 169 7911 190 | f 150 191 | a 170 9421 192 | a 171 1835 193 | a 172 13066 194 | a 173 11459 195 | a 174 51 196 | a 175 13519 197 | a 176 15375 198 | a 177 4110 199 | a 178 4846 200 | a 179 9623 201 | a 180 15459 202 | a 181 11639 203 | a 182 8145 204 | a 183 7434 205 | a 184 1080 206 | a 185 4540 207 | a 186 5766 208 | f 171 209 | a 187 13698 210 | f 99 211 | a 188 12596 212 | a 189 5527 213 | a 190 13728 214 | a 191 920 215 | a 192 6219 216 | a 193 2252 217 | f 134 218 | a 194 10984 219 | a 195 7851 220 | a 196 964 221 | a 197 14716 222 | a 198 10150 223 | a 199 3077 224 | a 200 13813 225 | f 87 226 | a 201 14711 227 | a 202 6367 228 | a 203 14520 229 | a 204 12315 230 | a 205 2019 231 | a 206 1880 232 | a 207 14779 233 | a 208 5559 234 | a 209 9643 235 | a 210 7825 236 | f 19 237 | a 211 13085 238 | f 187 239 | a 212 12816 240 | a 213 6799 241 | a 214 6066 242 | a 215 6580 243 | a 216 1647 244 | f 204 245 | a 217 1123 246 | a 218 15622 247 | a 219 8472 248 | a 220 8222 249 | a 221 10404 250 | a 222 4488 251 | a 223 8066 252 | f 28 253 | f 36 254 | f 158 255 | f 68 256 | a 224 16248 257 | a 225 12350 258 | a 226 16203 259 | a 227 1785 260 | a 228 4731 261 | a 229 7938 262 | a 230 14010 263 | a 231 5763 264 | a 232 452 265 | a 233 5256 266 | f 101 267 | a 234 10982 268 | a 235 15753 269 | a 236 1594 270 | a 237 3386 271 | a 238 3507 272 | a 239 10387 273 | a 240 7575 274 | a 241 6906 275 | a 242 3910 276 | f 73 277 | a 243 6651 278 | a 244 11911 279 | f 170 280 | f 209 281 | a 245 12725 282 | a 246 12644 283 | a 247 7712 284 | a 248 2559 285 | a 249 10656 286 | a 250 6509 287 | a 251 1084 288 | a 252 8807 289 | a 253 15783 290 | a 254 16094 291 | a 255 8226 292 | a 256 11297 293 | a 257 7998 294 | a 258 11060 295 | f 245 296 | a 259 840 297 | f 255 298 | a 260 2998 299 | a 261 10625 300 | a 262 4161 301 | a 263 11002 302 | a 264 14397 303 | f 264 304 | a 265 11712 305 | f 179 306 | a 266 14591 307 | a 267 1653 308 | a 268 11362 309 | a 269 9394 310 | a 270 9675 311 | f 252 312 | a 271 2513 313 | a 272 15128 314 | f 2 315 | f 199 316 | a 273 13624 317 | f 60 318 | a 274 7891 319 | a 275 5222 320 | a 276 14661 321 | f 246 322 | f 11 323 | a 277 3976 324 | a 278 6261 325 | a 279 7325 326 | a 280 6710 327 | a 281 5896 328 | f 88 329 | a 282 13663 330 | a 283 3022 331 | a 284 11826 332 | a 285 1030 333 | a 286 13920 334 | f 219 335 | a 287 6031 336 | a 288 12897 337 | f 241 338 | f 130 339 | a 289 8170 340 | a 290 12664 341 | a 291 1993 342 | f 206 343 | a 292 7493 344 | a 293 15040 345 | a 294 14399 346 | a 295 6436 347 | a 296 12127 348 | a 297 8333 349 | a 298 1081 350 | a 299 279 351 | a 300 5022 352 | a 301 4779 353 | a 302 6041 354 | f 203 355 | a 303 9398 356 | f 229 357 | f 30 358 | a 304 1279 359 | a 305 6036 360 | a 306 2030 361 | a 307 12061 362 | a 308 64 363 | a 309 12019 364 | a 310 12446 365 | a 311 519 366 | f 220 367 | f 226 368 | a 312 6406 369 | a 313 11473 370 | a 314 1436 371 | a 315 14111 372 | a 316 5590 373 | a 317 15383 374 | f 273 375 | a 318 1839 376 | f 178 377 | f 31 378 | f 152 379 | a 319 13974 380 | f 198 381 | a 320 11976 382 | a 321 11448 383 | a 322 2272 384 | f 26 385 | a 323 9638 386 | f 63 387 | a 324 9913 388 | f 300 389 | a 325 15711 390 | f 323 391 | a 326 15691 392 | a 327 1151 393 | f 185 394 | a 328 130 395 | a 329 13292 396 | a 330 2984 397 | a 331 15795 398 | a 332 15001 399 | f 41 400 | f 0 401 | f 110 402 | a 333 1542 403 | a 334 2622 404 | a 335 4800 405 | f 165 406 | a 336 10222 407 | a 337 3595 408 | a 338 276 409 | a 339 6875 410 | f 49 411 | f 8 412 | f 321 413 | a 340 6084 414 | a 341 13660 415 | a 342 3162 416 | f 1 417 | f 318 418 | a 343 7621 419 | f 284 420 | a 344 1743 421 | a 345 12227 422 | a 346 11939 423 | f 80 424 | a 347 14066 425 | a 348 11788 426 | a 349 13152 427 | f 257 428 | f 295 429 | a 350 9260 430 | f 259 431 | a 351 2888 432 | a 352 2428 433 | a 353 11124 434 | f 234 435 | a 354 5290 436 | a 355 6550 437 | a 356 16360 438 | a 357 800 439 | a 358 9906 440 | a 359 15207 441 | a 360 8399 442 | a 361 2168 443 | f 247 444 | a 362 8891 445 | a 363 3931 446 | f 268 447 | f 325 448 | a 364 3710 449 | a 365 2690 450 | a 366 7427 451 | f 145 452 | f 43 453 | f 70 454 | a 367 12611 455 | a 368 11813 456 | a 369 132 457 | a 370 6836 458 | a 371 5 459 | f 282 460 | f 142 461 | f 350 462 | a 372 12196 463 | f 352 464 | f 217 465 | a 373 11009 466 | a 374 15013 467 | a 375 12287 468 | a 376 4973 469 | f 355 470 | f 309 471 | f 184 472 | a 377 4959 473 | f 279 474 | a 378 5301 475 | f 32 476 | a 379 5818 477 | a 380 4462 478 | a 381 13567 479 | a 382 12437 480 | a 383 11707 481 | f 327 482 | a 384 10899 483 | a 385 8311 484 | a 386 4174 485 | a 387 11433 486 | a 388 1211 487 | a 389 8037 488 | a 390 2533 489 | a 391 1138 490 | a 392 4842 491 | a 393 1715 492 | a 394 8908 493 | a 395 1604 494 | f 276 495 | a 396 14593 496 | f 364 497 | a 397 16204 498 | f 381 499 | a 398 3985 500 | a 399 4445 501 | a 400 2172 502 | f 38 503 | a 401 11819 504 | a 402 8335 505 | a 403 13466 506 | f 35 507 | f 331 508 | a 404 7579 509 | f 103 510 | a 405 16285 511 | a 406 3088 512 | a 407 15896 513 | f 92 514 | a 408 6281 515 | f 315 516 | a 409 5197 517 | a 410 5882 518 | f 251 519 | a 411 4121 520 | a 412 8490 521 | f 250 522 | a 413 3687 523 | a 414 11228 524 | f 172 525 | f 53 526 | a 415 15133 527 | f 139 528 | a 416 16312 529 | f 253 530 | f 266 531 | a 417 14888 532 | a 418 3710 533 | a 419 1883 534 | f 161 535 | a 420 1573 536 | a 421 7677 537 | a 422 10018 538 | f 345 539 | f 233 540 | a 423 508 541 | a 424 4581 542 | a 425 11671 543 | a 426 6129 544 | f 263 545 | f 358 546 | a 427 9327 547 | f 403 548 | f 319 549 | a 428 15302 550 | f 405 551 | a 429 12761 552 | f 214 553 | a 430 6505 554 | a 431 1562 555 | a 432 14501 556 | f 400 557 | a 433 4370 558 | f 322 559 | a 434 7769 560 | f 238 561 | f 413 562 | a 435 13417 563 | a 436 7409 564 | a 437 15186 565 | a 438 12034 566 | a 439 3430 567 | a 440 7462 568 | a 441 778 569 | a 442 5628 570 | f 427 571 | f 335 572 | a 443 10408 573 | a 444 8951 574 | a 445 2127 575 | f 292 576 | a 446 7364 577 | f 143 578 | a 447 16114 579 | a 448 13061 580 | a 449 5305 581 | f 17 582 | f 211 583 | a 450 11113 584 | a 451 5861 585 | a 452 124 586 | f 194 587 | f 141 588 | f 275 589 | a 453 13859 590 | f 120 591 | a 454 11619 592 | f 114 593 | a 455 3086 594 | a 456 5479 595 | a 457 8544 596 | f 395 597 | a 458 2322 598 | a 459 11402 599 | a 460 14569 600 | f 310 601 | f 402 602 | a 461 15601 603 | f 242 604 | a 462 4260 605 | a 463 12507 606 | a 464 15529 607 | a 465 2569 608 | a 466 10143 609 | a 467 15224 610 | a 468 9059 611 | a 469 15303 612 | f 397 613 | f 277 614 | a 470 845 615 | f 349 616 | a 471 9253 617 | f 109 618 | f 227 619 | f 202 620 | f 382 621 | f 90 622 | a 472 625 623 | f 409 624 | a 473 7892 625 | f 106 626 | f 285 627 | a 474 9555 628 | a 475 14830 629 | f 85 630 | a 476 7248 631 | a 477 13287 632 | a 478 7094 633 | f 389 634 | f 58 635 | a 479 10916 636 | a 480 13088 637 | a 481 5663 638 | a 482 4673 639 | a 483 9420 640 | f 289 641 | a 484 14066 642 | a 485 6596 643 | a 486 1408 644 | f 482 645 | f 414 646 | a 487 8303 647 | f 380 648 | f 404 649 | f 351 650 | a 488 3877 651 | a 489 6809 652 | a 490 15158 653 | a 491 11018 654 | f 293 655 | a 492 2269 656 | f 221 657 | a 493 3086 658 | a 494 16358 659 | a 495 11266 660 | a 496 7079 661 | f 490 662 | f 186 663 | f 483 664 | a 497 13498 665 | f 21 666 | a 498 740 667 | a 499 8896 668 | a 500 11084 669 | a 501 7566 670 | a 502 1263 671 | a 503 12476 672 | a 504 14794 673 | a 505 8407 674 | a 506 2206 675 | f 166 676 | f 108 677 | f 261 678 | a 507 938 679 | a 508 2788 680 | a 509 11349 681 | a 510 7269 682 | a 511 15175 683 | a 512 11424 684 | a 513 596 685 | a 514 13812 686 | a 515 180 687 | f 183 688 | a 516 5220 689 | f 188 690 | a 517 259 691 | a 518 1184 692 | f 65 693 | a 519 2301 694 | a 520 389 695 | a 521 5481 696 | a 522 4127 697 | a 523 6546 698 | a 524 15740 699 | f 512 700 | f 442 701 | a 525 8934 702 | f 78 703 | a 526 2980 704 | a 527 13273 705 | f 527 706 | a 528 13265 707 | a 529 1038 708 | f 306 709 | a 530 6153 710 | a 531 7954 711 | f 149 712 | a 532 4874 713 | f 524 714 | f 460 715 | f 333 716 | a 533 12748 717 | f 121 718 | a 534 11810 719 | f 388 720 | a 535 14121 721 | f 122 722 | a 536 9246 723 | a 537 6040 724 | a 538 7089 725 | f 237 726 | f 467 727 | f 177 728 | a 539 10313 729 | f 444 730 | a 540 6738 731 | a 541 11356 732 | f 362 733 | a 542 5791 734 | a 543 11684 735 | a 544 5284 736 | a 545 10190 737 | f 138 738 | f 487 739 | a 546 7486 740 | f 262 741 | a 547 7275 742 | a 548 12631 743 | f 265 744 | a 549 4606 745 | f 195 746 | f 228 747 | a 550 9699 748 | f 344 749 | f 456 750 | f 83 751 | a 551 6214 752 | a 552 3988 753 | a 553 8477 754 | f 430 755 | f 466 756 | a 554 8209 757 | f 530 758 | a 555 15502 759 | f 439 760 | f 339 761 | a 556 12905 762 | a 557 2379 763 | a 558 1681 764 | a 559 11707 765 | f 544 766 | a 560 10668 767 | f 513 768 | f 189 769 | a 561 1722 770 | a 562 492 771 | a 563 593 772 | a 564 12705 773 | a 565 8219 774 | a 566 12453 775 | a 567 9408 776 | f 56 777 | a 568 14952 778 | f 338 779 | f 563 780 | a 569 12960 781 | a 570 1546 782 | a 571 13233 783 | f 224 784 | f 123 785 | f 298 786 | a 572 14111 787 | a 573 6234 788 | f 71 789 | f 547 790 | f 375 791 | f 160 792 | a 574 11886 793 | f 126 794 | f 459 795 | f 48 796 | f 498 797 | f 12 798 | a 575 8320 799 | f 296 800 | a 576 9397 801 | f 137 802 | a 577 1091 803 | a 578 8667 804 | f 418 805 | f 169 806 | a 579 14912 807 | f 434 808 | f 519 809 | f 446 810 | f 347 811 | f 243 812 | f 146 813 | f 508 814 | a 580 8011 815 | f 95 816 | f 248 817 | a 581 1235 818 | a 582 11083 819 | f 236 820 | a 583 7266 821 | a 584 9780 822 | a 585 12280 823 | f 67 824 | a 586 12013 825 | a 587 6939 826 | f 23 827 | a 588 2713 828 | f 232 829 | f 531 830 | a 589 15155 831 | a 590 5472 832 | a 591 11641 833 | f 33 834 | f 119 835 | f 336 836 | a 592 6288 837 | f 303 838 | f 420 839 | a 593 13355 840 | a 594 9037 841 | a 595 7898 842 | f 399 843 | f 506 844 | f 532 845 | f 302 846 | f 445 847 | f 424 848 | a 596 169 849 | a 597 5293 850 | a 598 9799 851 | f 374 852 | f 535 853 | f 587 854 | a 599 10786 855 | f 222 856 | a 600 8074 857 | a 601 7790 858 | a 602 6527 859 | f 580 860 | f 540 861 | a 603 3130 862 | a 604 7913 863 | a 605 7290 864 | f 421 865 | a 606 15216 866 | f 568 867 | a 607 1318 868 | f 181 869 | f 520 870 | f 443 871 | f 515 872 | f 94 873 | a 608 10216 874 | a 609 411 875 | f 4 876 | a 610 788 877 | f 97 878 | a 611 3475 879 | f 278 880 | f 313 881 | f 200 882 | f 291 883 | f 74 884 | f 377 885 | a 612 6454 886 | a 613 9187 887 | f 62 888 | a 614 1510 889 | a 615 10250 890 | a 616 7817 891 | f 59 892 | a 617 1854 893 | f 401 894 | f 332 895 | f 384 896 | a 618 7297 897 | f 287 898 | a 619 12572 899 | f 615 900 | a 620 15151 901 | a 621 15642 902 | f 462 903 | a 622 449 904 | f 416 905 | a 623 6408 906 | f 574 907 | f 107 908 | a 624 9314 909 | a 625 8603 910 | a 626 7918 911 | f 269 912 | f 598 913 | f 153 914 | f 163 915 | a 627 11583 916 | a 628 15210 917 | a 629 6834 918 | f 239 919 | a 630 6320 920 | a 631 15222 921 | f 280 922 | f 457 923 | f 406 924 | a 632 15187 925 | f 562 926 | a 633 4254 927 | a 634 15416 928 | a 635 11760 929 | a 636 3553 930 | a 637 16168 931 | f 622 932 | a 638 3954 933 | a 639 15917 934 | f 572 935 | f 447 936 | a 640 14645 937 | a 641 11061 938 | a 642 11133 939 | a 643 11677 940 | f 305 941 | a 644 14673 942 | f 112 943 | a 645 2136 944 | f 599 945 | f 288 946 | a 646 9527 947 | a 647 4592 948 | a 648 14757 949 | f 464 950 | a 649 12160 951 | f 311 952 | f 148 953 | a 650 12312 954 | a 651 15273 955 | a 652 919 956 | f 176 957 | f 495 958 | f 480 959 | f 230 960 | f 458 961 | a 653 13451 962 | f 631 963 | a 654 7316 964 | f 497 965 | a 655 2663 966 | f 585 967 | f 426 968 | f 3 969 | a 656 3223 970 | f 613 971 | a 657 16237 972 | f 18 973 | f 316 974 | a 658 4856 975 | f 448 976 | a 659 5165 977 | f 586 978 | f 503 979 | f 594 980 | f 614 981 | a 660 4942 982 | a 661 769 983 | a 662 111 984 | a 663 5856 985 | a 664 16086 986 | f 173 987 | f 196 988 | f 390 989 | f 539 990 | a 665 9305 991 | a 666 15836 992 | a 667 4121 993 | a 668 10623 994 | f 516 995 | a 669 1989 996 | a 670 7240 997 | a 671 3206 998 | a 672 4893 999 | f 522 1000 | f 410 1001 | f 225 1002 | a 673 15202 1003 | a 674 2556 1004 | a 675 14988 1005 | a 676 5150 1006 | f 555 1007 | a 677 13032 1008 | a 678 3562 1009 | a 679 2649 1010 | f 297 1011 | a 680 5501 1012 | f 415 1013 | f 657 1014 | a 681 1322 1015 | f 523 1016 | f 61 1017 | f 25 1018 | a 682 8016 1019 | f 644 1020 | f 647 1021 | f 356 1022 | a 683 16291 1023 | a 684 13011 1024 | a 685 9466 1025 | f 428 1026 | f 538 1027 | f 360 1028 | a 686 3945 1029 | a 687 4038 1030 | a 688 8304 1031 | f 670 1032 | f 601 1033 | a 689 16077 1034 | a 690 14235 1035 | a 691 12961 1036 | f 425 1037 | a 692 6528 1038 | f 76 1039 | f 607 1040 | a 693 14064 1041 | f 290 1042 | a 694 6973 1043 | a 695 12602 1044 | a 696 12787 1045 | a 697 9984 1046 | f 694 1047 | f 105 1048 | f 576 1049 | a 698 14340 1050 | a 699 5355 1051 | f 662 1052 | f 616 1053 | f 582 1054 | f 491 1055 | f 144 1056 | a 700 2170 1057 | a 701 6556 1058 | f 517 1059 | f 543 1060 | f 210 1061 | a 702 6379 1062 | a 703 10938 1063 | a 704 4225 1064 | f 578 1065 | f 346 1066 | a 705 8480 1067 | a 706 7685 1068 | a 707 5324 1069 | a 708 6314 1070 | a 709 8413 1071 | f 286 1072 | f 697 1073 | a 710 6063 1074 | f 596 1075 | a 711 9971 1076 | a 712 15118 1077 | a 713 2379 1078 | a 714 12331 1079 | a 715 10906 1080 | f 191 1081 | f 367 1082 | a 716 6685 1083 | f 393 1084 | a 717 12503 1085 | a 718 15673 1086 | a 719 10735 1087 | f 320 1088 | f 471 1089 | f 84 1090 | a 720 13434 1091 | f 566 1092 | a 721 16264 1093 | f 588 1094 | f 550 1095 | a 722 243 1096 | f 630 1097 | a 723 3165 1098 | a 724 15828 1099 | a 725 6026 1100 | f 671 1101 | f 129 1102 | f 370 1103 | a 726 14737 1104 | a 727 10513 1105 | f 208 1106 | a 728 10790 1107 | f 724 1108 | a 729 13592 1109 | a 730 6638 1110 | f 621 1111 | a 731 9113 1112 | f 698 1113 | f 628 1114 | f 708 1115 | f 216 1116 | f 54 1117 | f 133 1118 | a 732 14334 1119 | f 579 1120 | f 643 1121 | a 733 8985 1122 | a 734 1491 1123 | f 46 1124 | f 553 1125 | f 673 1126 | a 735 13953 1127 | f 609 1128 | f 625 1129 | f 79 1130 | a 736 16070 1131 | a 737 7700 1132 | f 659 1133 | f 429 1134 | f 591 1135 | f 546 1136 | f 124 1137 | a 738 5924 1138 | f 354 1139 | a 739 1690 1140 | f 312 1141 | f 270 1142 | f 533 1143 | a 740 5658 1144 | a 741 15698 1145 | f 201 1146 | a 742 12913 1147 | f 357 1148 | a 743 1268 1149 | f 618 1150 | a 744 9687 1151 | f 567 1152 | f 197 1153 | a 745 4777 1154 | a 746 5730 1155 | a 747 11758 1156 | f 154 1157 | a 748 3252 1158 | a 749 16100 1159 | f 116 1160 | a 750 4706 1161 | a 751 10484 1162 | f 304 1163 | f 649 1164 | f 600 1165 | f 561 1166 | f 723 1167 | f 593 1168 | f 655 1169 | a 752 14667 1170 | a 753 9775 1171 | a 754 9255 1172 | a 755 14476 1173 | a 756 751 1174 | f 665 1175 | f 705 1176 | f 597 1177 | f 668 1178 | f 604 1179 | f 571 1180 | f 729 1181 | a 757 2275 1182 | f 235 1183 | a 758 9062 1184 | a 759 8148 1185 | a 760 2711 1186 | a 761 1912 1187 | a 762 16242 1188 | a 763 3208 1189 | f 730 1190 | f 485 1191 | a 764 7716 1192 | a 765 314 1193 | a 766 12431 1194 | f 691 1195 | f 499 1196 | f 22 1197 | a 767 2175 1198 | a 768 8502 1199 | f 719 1200 | a 769 7372 1201 | f 754 1202 | f 385 1203 | a 770 10166 1204 | f 132 1205 | a 771 16340 1206 | f 678 1207 | f 564 1208 | f 294 1209 | f 595 1210 | a 772 1643 1211 | f 706 1212 | a 773 3778 1213 | a 774 4798 1214 | a 775 8551 1215 | a 776 9341 1216 | f 125 1217 | f 693 1218 | f 634 1219 | f 77 1220 | f 753 1221 | f 726 1222 | f 477 1223 | f 492 1224 | f 113 1225 | f 637 1226 | a 777 16135 1227 | f 772 1228 | f 658 1229 | f 162 1230 | f 674 1231 | a 778 11254 1232 | a 779 13357 1233 | f 656 1234 | f 159 1235 | f 190 1236 | f 717 1237 | f 770 1238 | f 55 1239 | a 780 3317 1240 | f 584 1241 | a 781 9161 1242 | f 747 1243 | a 782 9179 1244 | a 783 1807 1245 | a 784 4995 1246 | f 469 1247 | f 449 1248 | a 785 14954 1249 | f 34 1250 | a 786 8146 1251 | f 629 1252 | f 738 1253 | f 669 1254 | f 749 1255 | a 787 12996 1256 | a 788 1963 1257 | a 789 2503 1258 | a 790 13380 1259 | f 147 1260 | a 791 6485 1261 | f 782 1262 | f 435 1263 | f 559 1264 | a 792 11623 1265 | f 712 1266 | f 514 1267 | f 353 1268 | a 793 4275 1269 | a 794 13104 1270 | a 795 6104 1271 | f 376 1272 | f 611 1273 | f 175 1274 | f 437 1275 | f 193 1276 | a 796 6566 1277 | a 797 14145 1278 | a 798 5796 1279 | f 640 1280 | f 422 1281 | f 695 1282 | f 231 1283 | a 799 6732 1284 | a 800 1428 1285 | a 801 7993 1286 | a 802 10998 1287 | f 168 1288 | a 803 1036 1289 | f 774 1290 | f 775 1291 | a 804 15999 1292 | f 111 1293 | f 308 1294 | f 14 1295 | a 805 195 1296 | f 548 1297 | f 797 1298 | a 806 9579 1299 | f 592 1300 | f 771 1301 | a 807 2001 1302 | f 660 1303 | f 433 1304 | a 808 12994 1305 | a 809 1208 1306 | a 810 9476 1307 | f 760 1308 | f 801 1309 | a 811 4279 1310 | a 812 1716 1311 | f 556 1312 | a 813 12261 1313 | f 648 1314 | f 788 1315 | f 692 1316 | a 814 15801 1317 | a 815 8653 1318 | f 650 1319 | a 816 5380 1320 | f 117 1321 | f 721 1322 | a 817 11680 1323 | f 155 1324 | f 814 1325 | a 818 10139 1326 | a 819 11813 1327 | a 820 1472 1328 | f 91 1329 | f 783 1330 | f 267 1331 | a 821 14233 1332 | a 822 3724 1333 | a 823 384 1334 | a 824 5697 1335 | a 825 2761 1336 | f 118 1337 | f 581 1338 | a 826 15367 1339 | f 741 1340 | f 81 1341 | f 494 1342 | f 641 1343 | f 299 1344 | a 827 7710 1345 | f 398 1346 | a 828 16086 1347 | f 727 1348 | a 829 6837 1349 | f 781 1350 | f 57 1351 | f 549 1352 | f 826 1353 | a 830 1954 1354 | a 831 6856 1355 | a 832 2564 1356 | a 833 9577 1357 | a 834 15929 1358 | f 702 1359 | f 684 1360 | a 835 10961 1361 | f 509 1362 | f 44 1363 | f 558 1364 | f 394 1365 | f 500 1366 | f 610 1367 | f 64 1368 | a 836 9056 1369 | f 732 1370 | f 802 1371 | f 653 1372 | f 7 1373 | f 779 1374 | f 620 1375 | f 605 1376 | f 365 1377 | f 366 1378 | a 837 10767 1379 | a 838 10887 1380 | a 839 14081 1381 | a 840 11437 1382 | f 793 1383 | f 666 1384 | f 244 1385 | a 841 1120 1386 | f 757 1387 | a 842 7895 1388 | f 526 1389 | f 529 1390 | a 843 2458 1391 | f 511 1392 | f 672 1393 | f 256 1394 | f 249 1395 | f 274 1396 | f 714 1397 | a 844 14032 1398 | a 845 363 1399 | a 846 226 1400 | f 780 1401 | a 847 12669 1402 | a 848 14202 1403 | f 213 1404 | f 676 1405 | f 829 1406 | f 575 1407 | a 849 10697 1408 | f 573 1409 | f 769 1410 | f 455 1411 | f 626 1412 | a 850 4900 1413 | f 681 1414 | a 851 2774 1415 | f 821 1416 | a 852 9642 1417 | f 182 1418 | a 853 7806 1419 | a 854 1538 1420 | f 796 1421 | a 855 14414 1422 | f 822 1423 | a 856 3622 1424 | a 857 5390 1425 | a 858 5573 1426 | a 859 2923 1427 | f 473 1428 | a 860 4568 1429 | f 830 1430 | f 536 1431 | a 861 4997 1432 | a 862 9856 1433 | f 617 1434 | f 752 1435 | a 863 4249 1436 | f 606 1437 | f 386 1438 | f 417 1439 | a 864 13351 1440 | f 577 1441 | f 476 1442 | a 865 11401 1443 | a 866 11632 1444 | f 501 1445 | f 565 1446 | a 867 4683 1447 | f 569 1448 | a 868 1221 1449 | f 39 1450 | f 789 1451 | a 869 11977 1452 | f 489 1453 | a 870 6016 1454 | a 871 7213 1455 | a 872 15099 1456 | f 115 1457 | a 873 15117 1458 | f 815 1459 | f 818 1460 | a 874 10812 1461 | f 632 1462 | a 875 7093 1463 | a 876 8204 1464 | f 40 1465 | f 776 1466 | f 583 1467 | f 742 1468 | a 877 15017 1469 | a 878 12294 1470 | f 748 1471 | a 879 7887 1472 | f 502 1473 | f 140 1474 | f 541 1475 | f 849 1476 | f 785 1477 | a 880 14355 1478 | f 689 1479 | f 436 1480 | f 834 1481 | f 372 1482 | f 627 1483 | a 881 2194 1484 | f 603 1485 | f 862 1486 | f 734 1487 | a 882 12322 1488 | f 759 1489 | a 883 3502 1490 | a 884 2000 1491 | f 412 1492 | a 885 13750 1493 | a 886 8602 1494 | f 856 1495 | f 419 1496 | a 887 1030 1497 | a 888 2171 1498 | f 551 1499 | f 342 1500 | a 889 603 1501 | a 890 13590 1502 | a 891 11398 1503 | a 892 7697 1504 | a 893 4234 1505 | f 484 1506 | f 451 1507 | f 845 1508 | f 743 1509 | f 680 1510 | a 894 10812 1511 | f 804 1512 | f 272 1513 | a 895 10996 1514 | f 887 1515 | f 718 1516 | f 868 1517 | f 713 1518 | f 100 1519 | a 896 14713 1520 | f 755 1521 | f 735 1522 | a 897 9755 1523 | a 898 4847 1524 | f 590 1525 | a 899 9216 1526 | f 762 1527 | f 156 1528 | a 900 15577 1529 | f 6 1530 | f 740 1531 | f 407 1532 | a 901 7936 1533 | f 667 1534 | f 504 1535 | a 902 8337 1536 | f 709 1537 | a 903 1095 1538 | f 894 1539 | f 664 1540 | a 904 6352 1541 | f 858 1542 | f 737 1543 | f 368 1544 | f 212 1545 | a 905 13440 1546 | f 359 1547 | f 798 1548 | f 886 1549 | f 205 1550 | f 326 1551 | f 329 1552 | a 906 12562 1553 | a 907 6426 1554 | f 72 1555 | a 908 11555 1556 | f 850 1557 | f 707 1558 | f 9 1559 | f 328 1560 | f 880 1561 | f 373 1562 | f 890 1563 | f 82 1564 | f 151 1565 | f 192 1566 | a 909 15532 1567 | f 639 1568 | a 910 3044 1569 | f 810 1570 | a 911 5828 1571 | f 29 1572 | f 281 1573 | f 612 1574 | a 912 13439 1575 | f 761 1576 | a 913 4789 1577 | f 808 1578 | a 914 6086 1579 | a 915 14890 1580 | a 916 8933 1581 | f 479 1582 | a 917 10320 1583 | f 507 1584 | f 379 1585 | f 271 1586 | a 918 5248 1587 | f 710 1588 | f 633 1589 | f 474 1590 | a 919 2477 1591 | f 69 1592 | f 716 1593 | a 920 12634 1594 | f 733 1595 | f 851 1596 | f 383 1597 | f 645 1598 | f 361 1599 | f 790 1600 | a 921 14198 1601 | f 715 1602 | f 832 1603 | f 438 1604 | a 922 14017 1605 | a 923 9843 1606 | f 685 1607 | f 778 1608 | f 136 1609 | a 924 2790 1610 | f 13 1611 | f 855 1612 | f 343 1613 | f 722 1614 | f 542 1615 | a 925 4150 1616 | f 623 1617 | f 307 1618 | a 926 15790 1619 | f 314 1620 | a 927 8365 1621 | a 928 6382 1622 | f 800 1623 | f 93 1624 | f 927 1625 | f 682 1626 | f 877 1627 | a 929 1912 1628 | f 654 1629 | f 816 1630 | a 930 2668 1631 | f 773 1632 | f 696 1633 | a 931 3054 1634 | f 838 1635 | a 932 13640 1636 | f 602 1637 | f 704 1638 | f 505 1639 | f 411 1640 | f 848 1641 | a 933 12659 1642 | f 557 1643 | f 240 1644 | f 908 1645 | f 408 1646 | f 831 1647 | f 919 1648 | f 896 1649 | f 701 1650 | f 873 1651 | f 461 1652 | a 934 2410 1653 | f 135 1654 | f 589 1655 | f 925 1656 | f 918 1657 | a 935 9112 1658 | f 534 1659 | f 157 1660 | f 371 1661 | a 936 4767 1662 | f 450 1663 | f 537 1664 | f 803 1665 | f 703 1666 | f 52 1667 | f 883 1668 | a 937 7604 1669 | f 933 1670 | a 938 5917 1671 | f 764 1672 | f 207 1673 | f 806 1674 | a 939 428 1675 | f 651 1676 | a 940 8223 1677 | f 799 1678 | a 941 1547 1679 | f 10 1680 | f 745 1681 | f 765 1682 | f 768 1683 | a 942 7862 1684 | f 888 1685 | a 943 15567 1686 | f 787 1687 | f 820 1688 | f 608 1689 | f 872 1690 | a 944 10543 1691 | a 945 10134 1692 | f 258 1693 | a 946 10076 1694 | a 947 11931 1695 | f 20 1696 | f 174 1697 | f 330 1698 | f 938 1699 | a 948 6041 1700 | f 852 1701 | f 889 1702 | a 949 2558 1703 | f 341 1704 | f 27 1705 | f 941 1706 | a 950 3682 1707 | a 951 11204 1708 | a 952 1313 1709 | a 953 14791 1710 | a 954 6671 1711 | f 944 1712 | f 744 1713 | f 854 1714 | f 812 1715 | a 955 14379 1716 | f 950 1717 | f 930 1718 | f 525 1719 | f 926 1720 | a 956 3501 1721 | f 766 1722 | f 554 1723 | f 843 1724 | f 809 1725 | a 957 7559 1726 | f 935 1727 | a 958 7848 1728 | a 959 15735 1729 | a 960 9682 1730 | f 947 1731 | f 892 1732 | f 510 1733 | f 844 1734 | f 893 1735 | f 337 1736 | f 463 1737 | f 836 1738 | f 867 1739 | a 961 4490 1740 | f 871 1741 | f 42 1742 | f 835 1743 | a 962 5954 1744 | a 963 468 1745 | f 955 1746 | f 642 1747 | a 964 12666 1748 | a 965 15000 1749 | f 949 1750 | f 956 1751 | a 966 7449 1752 | a 967 5015 1753 | f 900 1754 | a 968 7776 1755 | a 969 6064 1756 | f 624 1757 | a 970 13850 1758 | f 683 1759 | f 619 1760 | f 675 1761 | f 260 1762 | a 971 13824 1763 | f 841 1764 | a 972 12015 1765 | f 751 1766 | f 878 1767 | f 936 1768 | f 912 1769 | f 942 1770 | f 465 1771 | f 901 1772 | a 973 5627 1773 | a 974 5880 1774 | f 840 1775 | a 975 6985 1776 | a 976 12499 1777 | f 518 1778 | f 223 1779 | f 711 1780 | a 977 11557 1781 | f 934 1782 | f 521 1783 | f 962 1784 | f 348 1785 | f 922 1786 | f 396 1787 | f 967 1788 | f 817 1789 | f 218 1790 | a 978 15408 1791 | a 979 8852 1792 | f 392 1793 | f 833 1794 | f 440 1795 | f 496 1796 | f 481 1797 | f 794 1798 | a 980 6517 1799 | f 560 1800 | a 981 6216 1801 | f 254 1802 | a 982 764 1803 | f 937 1804 | f 959 1805 | f 898 1806 | f 686 1807 | a 983 12098 1808 | f 923 1809 | f 180 1810 | f 906 1811 | f 475 1812 | f 932 1813 | f 885 1814 | f 968 1815 | f 948 1816 | f 301 1817 | f 961 1818 | f 970 1819 | f 441 1820 | f 720 1821 | f 957 1822 | f 976 1823 | f 839 1824 | f 897 1825 | f 677 1826 | f 978 1827 | f 636 1828 | f 486 1829 | f 687 1830 | f 825 1831 | f 725 1832 | f 493 1833 | f 805 1834 | f 913 1835 | a 984 4412 1836 | f 973 1837 | f 945 1838 | f 857 1839 | f 920 1840 | f 454 1841 | a 985 3641 1842 | f 917 1843 | a 986 9859 1844 | f 891 1845 | a 987 9896 1846 | f 786 1847 | f 334 1848 | a 988 6373 1849 | a 989 8513 1850 | f 882 1851 | f 837 1852 | a 990 7242 1853 | a 991 15730 1854 | f 552 1855 | a 992 9193 1856 | f 989 1857 | f 340 1858 | a 993 12488 1859 | f 363 1860 | f 736 1861 | f 884 1862 | f 969 1863 | f 824 1864 | f 652 1865 | f 283 1866 | f 638 1867 | f 943 1868 | f 387 1869 | f 904 1870 | f 758 1871 | f 954 1872 | f 966 1873 | f 104 1874 | f 128 1875 | f 795 1876 | f 391 1877 | f 432 1878 | f 915 1879 | f 895 1880 | a 994 7669 1881 | a 995 1223 1882 | f 792 1883 | f 905 1884 | f 985 1885 | f 864 1886 | a 996 15909 1887 | f 977 1888 | f 750 1889 | f 453 1890 | a 997 16350 1891 | f 369 1892 | f 975 1893 | f 167 1894 | f 995 1895 | f 861 1896 | f 859 1897 | f 953 1898 | f 991 1899 | f 470 1900 | f 819 1901 | f 807 1902 | f 317 1903 | f 960 1904 | f 215 1905 | f 946 1906 | a 998 11578 1907 | f 997 1908 | f 431 1909 | f 791 1910 | f 899 1911 | f 66 1912 | f 739 1913 | f 646 1914 | a 999 9988 1915 | f 756 1916 | a 1000 11515 1917 | f 813 1918 | f 842 1919 | a 1001 10897 1920 | f 881 1921 | f 964 1922 | f 958 1923 | f 763 1924 | f 909 1925 | f 688 1926 | f 986 1927 | f 847 1928 | f 929 1929 | f 990 1930 | f 940 1931 | a 1002 5393 1932 | a 1003 9343 1933 | f 921 1934 | f 982 1935 | f 468 1936 | f 911 1937 | f 478 1938 | a 1004 11585 1939 | f 979 1940 | f 528 1941 | f 1004 1942 | a 1005 13223 1943 | f 663 1944 | f 1002 1945 | f 784 1946 | a 1006 4443 1947 | f 846 1948 | a 1007 12811 1949 | a 1008 9497 1950 | f 866 1951 | a 1009 10225 1952 | f 1003 1953 | f 876 1954 | f 690 1955 | f 75 1956 | f 992 1957 | f 916 1958 | f 164 1959 | f 423 1960 | f 853 1961 | f 903 1962 | f 731 1963 | f 700 1964 | f 661 1965 | a 1010 4782 1966 | f 1000 1967 | f 472 1968 | f 902 1969 | f 1005 1970 | f 951 1971 | f 869 1972 | f 879 1973 | f 874 1974 | f 699 1975 | f 983 1976 | f 910 1977 | f 47 1978 | f 1009 1979 | a 1011 10143 1980 | a 1012 3336 1981 | f 865 1982 | f 1012 1983 | f 811 1984 | f 928 1985 | f 963 1986 | a 1013 10214 1987 | a 1014 2275 1988 | f 635 1989 | f 931 1990 | f 452 1991 | f 984 1992 | a 1015 1733 1993 | f 545 1994 | f 924 1995 | f 907 1996 | a 1016 15928 1997 | f 998 1998 | f 939 1999 | f 863 2000 | f 988 2001 | f 971 2002 | f 1016 2003 | a 1017 2157 2004 | f 980 2005 | f 996 2006 | a 1018 7373 2007 | f 324 2008 | f 728 2009 | f 1007 2010 | f 679 2011 | f 999 2012 | f 1006 2013 | a 1019 13081 2014 | f 488 2015 | f 1019 2016 | f 994 2017 | f 828 2018 | f 1011 2019 | f 972 2020 | f 1015 2021 | f 1014 2022 | f 827 2023 | f 860 2024 | f 1008 2025 | f 1010 2026 | f 914 2027 | a 1020 10415 2028 | f 1018 2029 | a 1021 10078 2030 | f 987 2031 | f 952 2032 | f 378 2033 | f 974 2034 | f 823 2035 | f 570 2036 | f 875 2037 | f 1021 2038 | f 1013 2039 | f 1020 2040 | f 981 2041 | f 993 2042 | f 965 2043 | f 1001 2044 | f 746 2045 | f 1017 2046 | f 870 2047 | f 767 2048 | f 777 2049 | a 1022 5285 2050 | f 1022 2051 | a 1023 5874 2052 | f 1023 2053 | -------------------------------------------------------------------------------- /random3-bal.rep: -------------------------------------------------------------------------------- 1 | 8207767 2 | 2048 3 | 4096 4 | 1 5 | a 0 5644 6 | a 1 1695 7 | a 2 702 8 | a 3 2884 9 | a 4 1727 10 | a 5 4113 11 | a 6 337 12 | a 7 852 13 | a 8 6495 14 | a 9 492 15 | a 10 1149 16 | a 11 5983 17 | a 12 3235 18 | a 13 3016 19 | a 14 767 20 | a 15 5217 21 | a 16 6460 22 | a 17 3720 23 | a 18 6379 24 | a 19 8102 25 | a 20 2900 26 | a 21 4824 27 | a 22 3208 28 | a 23 7457 29 | a 24 1729 30 | a 25 7296 31 | a 26 8117 32 | a 27 5419 33 | a 28 5689 34 | a 29 454 35 | a 30 7681 36 | a 31 5527 37 | a 32 2613 38 | a 33 1994 39 | a 34 1948 40 | f 0 41 | a 35 4914 42 | a 36 5237 43 | a 37 3500 44 | a 38 530 45 | a 39 1640 46 | a 40 3021 47 | a 41 7432 48 | a 42 1610 49 | a 43 7374 50 | a 44 7196 51 | a 45 7190 52 | a 46 7334 53 | a 47 4349 54 | a 48 6070 55 | a 49 6579 56 | a 50 7917 57 | a 51 6095 58 | a 52 2705 59 | a 53 3096 60 | a 54 5455 61 | a 55 1810 62 | a 56 40 63 | a 57 1695 64 | a 58 4210 65 | a 59 839 66 | a 60 368 67 | a 61 2099 68 | a 62 3073 69 | a 63 4907 70 | a 64 221 71 | a 65 843 72 | a 66 6466 73 | a 67 7841 74 | a 68 4780 75 | a 69 172 76 | a 70 621 77 | a 71 3774 78 | a 72 5396 79 | a 73 6399 80 | a 74 2127 81 | a 75 7706 82 | a 76 1698 83 | a 77 3828 84 | a 78 1165 85 | a 79 7947 86 | a 80 3000 87 | a 81 5695 88 | a 82 4604 89 | a 83 534 90 | a 84 1024 91 | a 85 7359 92 | a 86 74 93 | a 87 3860 94 | a 88 3359 95 | a 89 1432 96 | a 90 5011 97 | a 91 4293 98 | a 92 7082 99 | a 93 7309 100 | a 94 1726 101 | a 95 6956 102 | a 96 6757 103 | a 97 3688 104 | a 98 6319 105 | a 99 3116 106 | a 100 4549 107 | a 101 3412 108 | a 102 204 109 | a 103 554 110 | a 104 4113 111 | a 105 4796 112 | a 106 5111 113 | a 107 2673 114 | a 108 4429 115 | a 109 2071 116 | a 110 5445 117 | a 111 4158 118 | a 112 1104 119 | a 113 2795 120 | a 114 3976 121 | a 115 4907 122 | a 116 2256 123 | a 117 5159 124 | a 118 6212 125 | a 119 6417 126 | a 120 5342 127 | a 121 5651 128 | a 122 298 129 | a 123 4646 130 | a 124 7406 131 | a 125 5619 132 | a 126 6580 133 | a 127 6332 134 | a 128 302 135 | f 57 136 | f 10 137 | a 129 5697 138 | a 130 2930 139 | a 131 3800 140 | a 132 2188 141 | a 133 7207 142 | f 48 143 | f 68 144 | a 134 3200 145 | a 135 5815 146 | a 136 802 147 | a 137 5998 148 | a 138 1753 149 | a 139 1940 150 | a 140 2727 151 | a 141 6169 152 | a 142 2091 153 | a 143 2566 154 | a 144 7009 155 | a 145 4645 156 | a 146 5282 157 | a 147 4173 158 | a 148 1804 159 | a 149 4183 160 | a 150 5163 161 | a 151 814 162 | a 152 5578 163 | a 153 5401 164 | a 154 6510 165 | a 155 1666 166 | a 156 305 167 | a 157 5979 168 | a 158 7824 169 | a 159 1762 170 | a 160 1890 171 | a 161 1164 172 | a 162 3632 173 | a 163 3744 174 | a 164 6076 175 | f 102 176 | a 165 1102 177 | a 166 5914 178 | a 167 2939 179 | a 168 4257 180 | a 169 2766 181 | a 170 7201 182 | a 171 807 183 | a 172 848 184 | a 173 6376 185 | a 174 1054 186 | a 175 5034 187 | f 7 188 | a 176 1473 189 | a 177 2780 190 | a 178 4939 191 | f 131 192 | a 179 606 193 | a 180 5225 194 | a 181 1396 195 | a 182 2094 196 | a 183 2596 197 | f 21 198 | a 184 571 199 | a 185 1131 200 | a 186 6914 201 | a 187 7524 202 | f 58 203 | a 188 594 204 | a 189 6920 205 | a 190 5562 206 | f 165 207 | a 191 3121 208 | a 192 7536 209 | a 193 108 210 | a 194 194 211 | a 195 4634 212 | a 196 4134 213 | a 197 5137 214 | a 198 6491 215 | f 37 216 | a 199 7286 217 | a 200 5117 218 | a 201 3459 219 | a 202 922 220 | a 203 4386 221 | a 204 7501 222 | a 205 3146 223 | a 206 5084 224 | a 207 893 225 | a 208 1013 226 | f 146 227 | a 209 3438 228 | a 210 2404 229 | a 211 6681 230 | a 212 963 231 | a 213 2903 232 | a 214 4742 233 | a 215 4291 234 | f 125 235 | a 216 4575 236 | a 217 5878 237 | a 218 3779 238 | a 219 4564 239 | a 220 4281 240 | a 221 2094 241 | a 222 3718 242 | f 67 243 | a 223 7563 244 | a 224 4368 245 | a 225 7032 246 | a 226 7157 247 | a 227 322 248 | a 228 2926 249 | a 229 1924 250 | a 230 7115 251 | a 231 427 252 | f 179 253 | a 232 7021 254 | a 233 5032 255 | a 234 5716 256 | a 235 1888 257 | a 236 505 258 | a 237 3209 259 | a 238 5123 260 | f 161 261 | a 239 6953 262 | a 240 917 263 | a 241 5299 264 | a 242 2369 265 | a 243 5490 266 | f 133 267 | a 244 5410 268 | a 245 317 269 | a 246 5081 270 | a 247 6795 271 | a 248 6093 272 | a 249 5488 273 | a 250 6471 274 | a 251 2669 275 | a 252 6798 276 | a 253 675 277 | a 254 3841 278 | a 255 6153 279 | a 256 1272 280 | a 257 6872 281 | a 258 243 282 | a 259 4445 283 | a 260 1909 284 | a 261 7488 285 | a 262 4849 286 | a 263 2372 287 | a 264 3658 288 | a 265 7031 289 | f 74 290 | a 266 6385 291 | a 267 1616 292 | f 99 293 | f 189 294 | a 268 3713 295 | a 269 7999 296 | a 270 2218 297 | a 271 819 298 | a 272 329 299 | a 273 2862 300 | f 73 301 | a 274 988 302 | a 275 5639 303 | f 69 304 | a 276 4220 305 | a 277 6039 306 | a 278 833 307 | a 279 2405 308 | a 280 3359 309 | a 281 2824 310 | f 222 311 | a 282 503 312 | a 283 3748 313 | a 284 4504 314 | a 285 1212 315 | f 90 316 | a 286 2908 317 | a 287 504 318 | f 60 319 | a 288 4392 320 | a 289 3199 321 | a 290 4663 322 | a 291 2570 323 | a 292 5205 324 | a 293 6478 325 | a 294 7970 326 | a 295 7394 327 | a 296 4101 328 | a 297 5130 329 | a 298 7054 330 | a 299 7874 331 | a 300 1824 332 | a 301 6720 333 | a 302 2720 334 | a 303 5501 335 | a 304 7014 336 | a 305 3162 337 | a 306 1184 338 | a 307 6332 339 | a 308 6909 340 | a 309 4097 341 | a 310 3568 342 | a 311 3715 343 | a 312 67 344 | a 313 2619 345 | a 314 8131 346 | a 315 294 347 | a 316 8117 348 | a 317 4939 349 | a 318 7421 350 | a 319 772 351 | f 166 352 | a 320 7134 353 | a 321 6283 354 | a 322 1596 355 | a 323 4961 356 | a 324 1293 357 | a 325 1570 358 | a 326 8191 359 | a 327 523 360 | a 328 4032 361 | a 329 1092 362 | a 330 1865 363 | a 331 1249 364 | a 332 224 365 | f 272 366 | a 333 2720 367 | a 334 7244 368 | a 335 1803 369 | a 336 1334 370 | a 337 2586 371 | a 338 3809 372 | a 339 7795 373 | a 340 5890 374 | a 341 849 375 | a 342 4727 376 | a 343 7774 377 | f 249 378 | a 344 6362 379 | a 345 6610 380 | a 346 7043 381 | a 347 3926 382 | a 348 6647 383 | f 113 384 | a 349 7094 385 | a 350 2346 386 | a 351 888 387 | a 352 6944 388 | a 353 7878 389 | f 195 390 | a 354 948 391 | a 355 7488 392 | a 356 4794 393 | a 357 958 394 | a 358 2947 395 | a 359 1454 396 | a 360 5250 397 | a 361 469 398 | a 362 2413 399 | a 363 54 400 | a 364 4617 401 | a 365 3554 402 | a 366 5670 403 | a 367 204 404 | a 368 2759 405 | a 369 1606 406 | a 370 3308 407 | f 253 408 | a 371 5601 409 | a 372 7848 410 | a 373 7625 411 | a 374 1960 412 | a 375 6093 413 | a 376 75 414 | a 377 6641 415 | a 378 6121 416 | a 379 1525 417 | a 380 606 418 | a 381 3121 419 | a 382 1876 420 | a 383 676 421 | a 384 3822 422 | a 385 4163 423 | a 386 5997 424 | a 387 4022 425 | a 388 645 426 | a 389 5370 427 | a 390 6328 428 | a 391 730 429 | a 392 5650 430 | f 368 431 | a 393 2147 432 | a 394 3130 433 | a 395 2271 434 | a 396 6444 435 | f 142 436 | a 397 3394 437 | a 398 6868 438 | a 399 6032 439 | a 400 5501 440 | a 401 4184 441 | a 402 181 442 | a 403 5771 443 | a 404 2303 444 | f 326 445 | a 405 366 446 | a 406 7966 447 | f 149 448 | f 40 449 | a 407 3655 450 | a 408 7897 451 | a 409 4434 452 | a 410 3870 453 | a 411 6869 454 | a 412 2101 455 | a 413 5655 456 | f 381 457 | a 414 5895 458 | a 415 5218 459 | f 114 460 | a 416 1040 461 | f 2 462 | a 417 5398 463 | a 418 5080 464 | a 419 5250 465 | a 420 7707 466 | a 421 6880 467 | a 422 3603 468 | a 423 5250 469 | a 424 4716 470 | a 425 208 471 | a 426 3409 472 | a 427 483 473 | f 421 474 | a 428 2765 475 | f 344 476 | a 429 2844 477 | f 333 478 | f 343 479 | a 430 751 480 | a 431 4899 481 | a 432 292 482 | a 433 5948 483 | a 434 1577 484 | a 435 7387 485 | f 217 486 | a 436 2527 487 | a 437 7792 488 | a 438 4964 489 | a 439 1848 490 | a 440 7549 491 | a 441 4757 492 | a 442 5625 493 | a 443 7112 494 | a 444 5899 495 | a 445 2666 496 | a 446 5498 497 | a 447 5562 498 | a 448 3975 499 | a 449 3646 500 | f 303 501 | a 450 2590 502 | a 451 2503 503 | a 452 3805 504 | a 453 3635 505 | f 232 506 | f 214 507 | a 454 869 508 | a 455 623 509 | a 456 4057 510 | a 457 2205 511 | a 458 440 512 | a 459 155 513 | a 460 5549 514 | a 461 4731 515 | a 462 4178 516 | a 463 5241 517 | a 464 4531 518 | a 465 7998 519 | a 466 5922 520 | a 467 5977 521 | f 53 522 | f 320 523 | a 468 7259 524 | a 469 4554 525 | a 470 4531 526 | a 471 6789 527 | a 472 7233 528 | a 473 2495 529 | a 474 5341 530 | a 475 4758 531 | a 476 1107 532 | a 477 102 533 | a 478 696 534 | a 479 2211 535 | a 480 4764 536 | a 481 921 537 | a 482 3307 538 | a 483 3529 539 | a 484 2967 540 | a 485 1804 541 | a 486 1900 542 | f 470 543 | a 487 6471 544 | f 412 545 | a 488 7078 546 | f 39 547 | a 489 2419 548 | a 490 6023 549 | a 491 4423 550 | a 492 3515 551 | a 493 6333 552 | a 494 6440 553 | a 495 2825 554 | a 496 6575 555 | a 497 3097 556 | a 498 247 557 | a 499 5381 558 | f 478 559 | f 443 560 | f 369 561 | a 500 2006 562 | a 501 6631 563 | a 502 3937 564 | a 503 1572 565 | a 504 3402 566 | a 505 457 567 | a 506 1579 568 | a 507 3618 569 | a 508 2967 570 | a 509 5695 571 | f 353 572 | a 510 1641 573 | a 511 1772 574 | a 512 6028 575 | a 513 3591 576 | a 514 3277 577 | a 515 5087 578 | a 516 2282 579 | f 467 580 | f 81 581 | f 321 582 | a 517 673 583 | a 518 6417 584 | f 517 585 | a 519 7613 586 | a 520 5499 587 | f 427 588 | f 193 589 | a 521 4297 590 | a 522 1333 591 | f 388 592 | a 523 2235 593 | a 524 3481 594 | a 525 356 595 | a 526 6781 596 | a 527 2361 597 | f 96 598 | a 528 293 599 | a 529 3874 600 | a 530 7083 601 | a 531 1229 602 | f 363 603 | a 532 4017 604 | a 533 4480 605 | a 534 6878 606 | a 535 1241 607 | f 91 608 | a 536 1152 609 | a 537 4696 610 | f 529 611 | f 43 612 | f 480 613 | a 538 2658 614 | a 539 166 615 | f 219 616 | a 540 2396 617 | a 541 7165 618 | a 542 1101 619 | a 543 7229 620 | a 544 5851 621 | a 545 3498 622 | a 546 7731 623 | a 547 4726 624 | f 254 625 | a 548 7245 626 | a 549 5924 627 | f 364 628 | f 56 629 | f 497 630 | a 550 1082 631 | a 551 2783 632 | a 552 5970 633 | a 553 6060 634 | f 155 635 | a 554 5749 636 | a 555 4914 637 | f 181 638 | a 556 7881 639 | a 557 5114 640 | f 66 641 | a 558 639 642 | a 559 2044 643 | a 560 7498 644 | a 561 2459 645 | a 562 4803 646 | f 209 647 | a 563 5668 648 | a 564 7586 649 | a 565 132 650 | f 420 651 | a 566 6237 652 | f 208 653 | a 567 6160 654 | f 361 655 | a 568 3029 656 | f 466 657 | a 569 1431 658 | f 34 659 | f 89 660 | a 570 469 661 | a 571 793 662 | a 572 1176 663 | a 573 6259 664 | a 574 4153 665 | a 575 5949 666 | a 576 5444 667 | a 577 7229 668 | a 578 6418 669 | a 579 6711 670 | a 580 439 671 | a 581 1483 672 | a 582 4663 673 | a 583 2938 674 | a 584 2577 675 | a 585 2720 676 | a 586 1742 677 | a 587 4158 678 | a 588 6269 679 | a 589 5153 680 | a 590 603 681 | a 591 2430 682 | f 286 683 | f 447 684 | f 310 685 | a 592 2240 686 | a 593 4893 687 | a 594 4018 688 | f 258 689 | a 595 2751 690 | a 596 5802 691 | a 597 4912 692 | a 598 6682 693 | a 599 5343 694 | a 600 3119 695 | a 601 1576 696 | f 347 697 | f 494 698 | a 602 7170 699 | a 603 3499 700 | a 604 5836 701 | f 440 702 | f 245 703 | a 605 6234 704 | a 606 4563 705 | a 607 470 706 | a 608 2627 707 | a 609 2971 708 | a 610 544 709 | a 611 1622 710 | a 612 5074 711 | f 185 712 | a 613 6887 713 | a 614 7655 714 | a 615 7854 715 | a 616 5820 716 | a 617 427 717 | a 618 6584 718 | a 619 3030 719 | a 620 1274 720 | f 169 721 | a 621 3001 722 | a 622 6077 723 | a 623 2814 724 | a 624 3181 725 | a 625 5160 726 | f 314 727 | a 626 5613 728 | a 627 2409 729 | a 628 2721 730 | a 629 1858 731 | a 630 1086 732 | a 631 1054 733 | a 632 6889 734 | a 633 1343 735 | a 634 3220 736 | f 400 737 | a 635 5478 738 | a 636 711 739 | a 637 6028 740 | a 638 2004 741 | f 104 742 | a 639 4246 743 | a 640 8008 744 | f 601 745 | a 641 87 746 | f 633 747 | a 642 3516 748 | a 643 5621 749 | a 644 1780 750 | a 645 3123 751 | a 646 7007 752 | a 647 6042 753 | a 648 1106 754 | a 649 6264 755 | a 650 113 756 | a 651 1160 757 | a 652 7590 758 | a 653 5932 759 | a 654 7658 760 | a 655 5567 761 | f 550 762 | a 656 2303 763 | a 657 1236 764 | f 541 765 | a 658 157 766 | a 659 509 767 | a 660 3696 768 | a 661 8006 769 | f 514 770 | a 662 3170 771 | a 663 1441 772 | f 498 773 | a 664 7169 774 | a 665 2258 775 | f 454 776 | a 666 5614 777 | a 667 7921 778 | f 252 779 | f 394 780 | a 668 2552 781 | f 627 782 | a 669 5213 783 | a 670 6906 784 | f 134 785 | a 671 6458 786 | f 339 787 | f 613 788 | a 672 6025 789 | a 673 6268 790 | a 674 3181 791 | f 282 792 | a 675 7854 793 | a 676 5772 794 | a 677 1326 795 | a 678 841 796 | a 679 2084 797 | f 129 798 | a 680 4672 799 | a 681 5796 800 | a 682 7511 801 | f 479 802 | a 683 3785 803 | a 684 3517 804 | a 685 984 805 | a 686 5757 806 | f 278 807 | f 17 808 | a 687 7965 809 | a 688 4363 810 | a 689 8088 811 | a 690 4587 812 | a 691 4734 813 | f 612 814 | a 692 4319 815 | a 693 3087 816 | a 694 1208 817 | a 695 1692 818 | a 696 2267 819 | f 366 820 | a 697 4598 821 | a 698 6516 822 | f 151 823 | f 299 824 | a 699 5741 825 | f 268 826 | f 47 827 | a 700 4207 828 | a 701 7448 829 | a 702 4247 830 | f 552 831 | a 703 77 832 | a 704 4201 833 | a 705 3695 834 | a 706 4353 835 | a 707 2108 836 | f 455 837 | a 708 5465 838 | f 614 839 | a 709 4512 840 | f 528 841 | a 710 4559 842 | a 711 1767 843 | f 519 844 | a 712 8057 845 | a 713 6169 846 | a 714 5379 847 | a 715 1382 848 | a 716 2954 849 | a 717 4249 850 | a 718 6600 851 | a 719 1988 852 | a 720 971 853 | f 623 854 | f 137 855 | a 721 6209 856 | f 559 857 | a 722 1022 858 | f 558 859 | a 723 7504 860 | f 101 861 | f 372 862 | a 724 6670 863 | f 138 864 | f 649 865 | a 725 7235 866 | f 580 867 | f 204 868 | f 492 869 | a 726 721 870 | a 727 6934 871 | a 728 2984 872 | a 729 2898 873 | a 730 7512 874 | f 243 875 | a 731 7285 876 | f 403 877 | f 449 878 | f 473 879 | a 732 8053 880 | f 437 881 | f 625 882 | a 733 1942 883 | a 734 3258 884 | f 160 885 | a 735 3562 886 | a 736 2705 887 | f 493 888 | a 737 2021 889 | f 267 890 | a 738 82 891 | f 592 892 | f 35 893 | a 739 320 894 | a 740 4129 895 | f 547 896 | a 741 5691 897 | f 183 898 | f 103 899 | a 742 2365 900 | f 205 901 | a 743 65 902 | a 744 3633 903 | a 745 1438 904 | a 746 7395 905 | f 31 906 | a 747 5905 907 | a 748 6242 908 | a 749 116 909 | a 750 7883 910 | a 751 2556 911 | a 752 6269 912 | a 753 1787 913 | a 754 2937 914 | a 755 144 915 | a 756 1411 916 | a 757 531 917 | a 758 4603 918 | a 759 2701 919 | a 760 8048 920 | a 761 4022 921 | a 762 6170 922 | a 763 6208 923 | f 678 924 | f 567 925 | f 450 926 | a 764 5836 927 | f 735 928 | a 765 761 929 | f 673 930 | a 766 5118 931 | f 602 932 | a 767 6570 933 | a 768 2966 934 | a 769 266 935 | a 770 6818 936 | a 771 7470 937 | f 345 938 | f 50 939 | a 772 4885 940 | a 773 1889 941 | f 262 942 | f 621 943 | a 774 2092 944 | f 535 945 | f 293 946 | f 606 947 | a 775 637 948 | f 338 949 | a 776 5167 950 | a 777 3449 951 | a 778 6029 952 | a 779 280 953 | a 780 5930 954 | a 781 3937 955 | a 782 2778 956 | a 783 1832 957 | a 784 2663 958 | f 591 959 | a 785 6013 960 | a 786 7104 961 | a 787 7815 962 | a 788 1758 963 | a 789 7942 964 | a 790 337 965 | a 791 8109 966 | a 792 1210 967 | a 793 6351 968 | a 794 4510 969 | f 560 970 | a 795 7906 971 | a 796 7299 972 | a 797 5000 973 | a 798 7417 974 | f 20 975 | f 22 976 | a 799 7582 977 | a 800 2128 978 | f 207 979 | a 801 953 980 | f 464 981 | f 108 982 | f 380 983 | a 802 3747 984 | f 433 985 | f 469 986 | f 251 987 | f 324 988 | a 803 2898 989 | f 148 990 | a 804 475 991 | a 805 3584 992 | f 647 993 | a 806 860 994 | a 807 5408 995 | a 808 1990 996 | a 809 3126 997 | a 810 3747 998 | a 811 1836 999 | f 378 1000 | a 812 2429 1001 | a 813 6451 1002 | a 814 6351 1003 | a 815 1107 1004 | a 816 5485 1005 | a 817 3167 1006 | a 818 7354 1007 | a 819 1870 1008 | f 524 1009 | a 820 2351 1010 | a 821 1525 1011 | a 822 7508 1012 | a 823 2865 1013 | a 824 6860 1014 | f 666 1015 | f 671 1016 | a 825 1538 1017 | a 826 2536 1018 | f 328 1019 | a 827 8107 1020 | f 259 1021 | f 499 1022 | a 828 7034 1023 | a 829 2217 1024 | f 199 1025 | a 830 329 1026 | a 831 121 1027 | f 564 1028 | a 832 1989 1029 | a 833 6878 1030 | a 834 1556 1031 | a 835 5882 1032 | a 836 4651 1033 | a 837 2714 1034 | a 838 4903 1035 | a 839 2904 1036 | f 824 1037 | f 697 1038 | f 178 1039 | f 77 1040 | f 371 1041 | f 224 1042 | a 840 6511 1043 | a 841 5516 1044 | a 842 6750 1045 | a 843 6232 1046 | a 844 897 1047 | a 845 681 1048 | a 846 2035 1049 | a 847 1513 1050 | a 848 4953 1051 | f 203 1052 | f 702 1053 | a 849 1665 1054 | a 850 589 1055 | a 851 4986 1056 | a 852 6378 1057 | f 772 1058 | a 853 787 1059 | a 854 1344 1060 | f 542 1061 | a 855 2521 1062 | a 856 3485 1063 | a 857 2907 1064 | a 858 5488 1065 | f 356 1066 | a 859 1446 1067 | a 860 116 1068 | f 536 1069 | a 861 7416 1070 | a 862 7740 1071 | a 863 1745 1072 | a 864 3770 1073 | a 865 4597 1074 | a 866 7168 1075 | a 867 187 1076 | f 569 1077 | f 352 1078 | a 868 6421 1079 | a 869 1636 1080 | a 870 1178 1081 | a 871 385 1082 | a 872 2557 1083 | a 873 3431 1084 | a 874 1721 1085 | a 875 4371 1086 | a 876 1609 1087 | f 830 1088 | f 778 1089 | a 877 5261 1090 | f 657 1091 | f 597 1092 | a 878 627 1093 | a 879 6788 1094 | f 644 1095 | a 880 2487 1096 | a 881 157 1097 | f 656 1098 | a 882 5476 1099 | a 883 8187 1100 | a 884 2164 1101 | a 885 6693 1102 | f 782 1103 | a 886 3037 1104 | a 887 7563 1105 | a 888 2130 1106 | f 575 1107 | a 889 6315 1108 | a 890 7973 1109 | f 27 1110 | a 891 7738 1111 | a 892 1497 1112 | f 826 1113 | a 893 4230 1114 | f 275 1115 | f 636 1116 | f 848 1117 | a 894 5414 1118 | f 740 1119 | f 52 1120 | f 785 1121 | f 685 1122 | f 849 1123 | f 704 1124 | a 895 7045 1125 | a 896 991 1126 | f 432 1127 | a 897 4257 1128 | a 898 3239 1129 | f 436 1130 | a 899 222 1131 | f 507 1132 | f 630 1133 | f 489 1134 | a 900 6884 1135 | f 190 1136 | a 901 649 1137 | a 902 7716 1138 | a 903 5593 1139 | f 737 1140 | a 904 3443 1141 | a 905 266 1142 | a 906 1592 1143 | a 907 2664 1144 | a 908 4328 1145 | f 71 1146 | a 909 6409 1147 | f 906 1148 | f 163 1149 | f 434 1150 | f 85 1151 | a 910 2944 1152 | a 911 1259 1153 | a 912 6225 1154 | a 913 3829 1155 | a 914 7855 1156 | a 915 6933 1157 | a 916 8028 1158 | a 917 2776 1159 | a 918 5144 1160 | a 919 2448 1161 | a 920 7277 1162 | f 397 1163 | f 626 1164 | a 921 2235 1165 | a 922 8186 1166 | a 923 5358 1167 | f 115 1168 | a 924 7694 1169 | a 925 3375 1170 | a 926 6982 1171 | a 927 8004 1172 | a 928 7330 1173 | a 929 627 1174 | f 117 1175 | a 930 3829 1176 | f 292 1177 | f 791 1178 | a 931 741 1179 | f 502 1180 | f 670 1181 | a 932 3488 1182 | f 186 1183 | f 281 1184 | a 933 5517 1185 | a 934 2036 1186 | f 815 1187 | a 935 3145 1188 | a 936 2691 1189 | a 937 4183 1190 | a 938 591 1191 | a 939 1611 1192 | a 940 6166 1193 | a 941 2829 1194 | f 240 1195 | a 942 1294 1196 | a 943 5402 1197 | a 944 6230 1198 | f 624 1199 | a 945 4895 1200 | f 523 1201 | f 620 1202 | a 946 745 1203 | a 947 4723 1204 | a 948 1071 1205 | a 949 2856 1206 | f 921 1207 | a 950 6428 1208 | f 88 1209 | a 951 492 1210 | a 952 3474 1211 | a 953 2209 1212 | a 954 7210 1213 | f 802 1214 | f 25 1215 | a 955 5187 1216 | a 956 3188 1217 | a 957 1303 1218 | f 951 1219 | a 958 2393 1220 | f 844 1221 | f 130 1222 | f 762 1223 | f 318 1224 | f 505 1225 | a 959 3883 1226 | a 960 673 1227 | a 961 6851 1228 | a 962 1967 1229 | a 963 2611 1230 | a 964 7729 1231 | a 965 1744 1232 | a 966 2019 1233 | a 967 3409 1234 | a 968 1690 1235 | a 969 5941 1236 | f 126 1237 | f 78 1238 | a 970 6514 1239 | a 971 2317 1240 | a 972 5248 1241 | a 973 2008 1242 | a 974 7467 1243 | f 853 1244 | f 84 1245 | a 975 130 1246 | a 976 7183 1247 | a 977 5109 1248 | a 978 200 1249 | f 230 1250 | a 979 4707 1251 | f 225 1252 | a 980 4322 1253 | a 981 2045 1254 | f 527 1255 | a 982 4634 1256 | f 375 1257 | a 983 7643 1258 | a 984 4584 1259 | a 985 1846 1260 | a 986 5643 1261 | f 442 1262 | f 703 1263 | f 6 1264 | a 987 7096 1265 | f 374 1266 | f 65 1267 | a 988 7422 1268 | a 989 6979 1269 | a 990 6851 1270 | f 389 1271 | a 991 4749 1272 | a 992 430 1273 | f 861 1274 | f 863 1275 | a 993 1203 1276 | f 749 1277 | f 750 1278 | a 994 1577 1279 | a 995 4056 1280 | a 996 2088 1281 | a 997 6188 1282 | a 998 276 1283 | f 300 1284 | f 662 1285 | a 999 4116 1286 | f 116 1287 | f 901 1288 | f 588 1289 | f 919 1290 | f 950 1291 | a 1000 3744 1292 | a 1001 1816 1293 | f 191 1294 | a 1002 6842 1295 | f 867 1296 | f 263 1297 | f 562 1298 | f 288 1299 | f 796 1300 | a 1003 4068 1301 | f 139 1302 | a 1004 6063 1303 | f 271 1304 | f 941 1305 | a 1005 4771 1306 | f 123 1307 | a 1006 4872 1308 | f 850 1309 | a 1007 2387 1310 | a 1008 8010 1311 | a 1009 2470 1312 | a 1010 151 1313 | f 379 1314 | a 1011 1582 1315 | a 1012 501 1316 | a 1013 7126 1317 | f 383 1318 | a 1014 433 1319 | a 1015 7540 1320 | a 1016 5932 1321 | f 686 1322 | f 981 1323 | a 1017 7344 1324 | f 132 1325 | a 1018 1672 1326 | f 565 1327 | a 1019 6890 1328 | a 1020 2672 1329 | a 1021 1621 1330 | a 1022 3170 1331 | f 635 1332 | f 206 1333 | a 1023 8152 1334 | a 1024 3722 1335 | a 1025 3909 1336 | a 1026 6830 1337 | a 1027 2421 1338 | a 1028 4120 1339 | f 244 1340 | f 652 1341 | a 1029 3516 1342 | f 586 1343 | f 234 1344 | f 940 1345 | f 491 1346 | f 509 1347 | a 1030 1825 1348 | a 1031 8069 1349 | a 1032 3148 1350 | a 1033 165 1351 | a 1034 3883 1352 | f 698 1353 | a 1035 5283 1354 | f 313 1355 | a 1036 6040 1356 | f 553 1357 | a 1037 6764 1358 | a 1038 905 1359 | f 350 1360 | f 1026 1361 | a 1039 1272 1362 | f 768 1363 | a 1040 6222 1364 | f 727 1365 | f 157 1366 | a 1041 3548 1367 | f 1025 1368 | f 914 1369 | a 1042 1380 1370 | a 1043 2446 1371 | a 1044 4116 1372 | a 1045 2979 1373 | f 643 1374 | f 771 1375 | a 1046 239 1376 | a 1047 4701 1377 | a 1048 7245 1378 | f 808 1379 | f 273 1380 | f 827 1381 | f 94 1382 | a 1049 6742 1383 | a 1050 2875 1384 | a 1051 470 1385 | a 1052 824 1386 | a 1053 7522 1387 | f 659 1388 | f 584 1389 | a 1054 2804 1390 | a 1055 2202 1391 | a 1056 5678 1392 | f 500 1393 | f 14 1394 | a 1057 1445 1395 | a 1058 5760 1396 | a 1059 2373 1397 | a 1060 4258 1398 | f 399 1399 | a 1061 956 1400 | a 1062 5368 1401 | f 431 1402 | a 1063 2741 1403 | f 875 1404 | a 1064 6171 1405 | f 459 1406 | f 418 1407 | a 1065 7542 1408 | f 825 1409 | a 1066 165 1410 | f 792 1411 | a 1067 3718 1412 | a 1068 196 1413 | f 851 1414 | f 882 1415 | a 1069 4579 1416 | a 1070 3465 1417 | f 720 1418 | f 937 1419 | a 1071 4518 1420 | f 75 1421 | a 1072 6531 1422 | f 156 1423 | a 1073 21 1424 | a 1074 4044 1425 | f 223 1426 | a 1075 6987 1427 | f 571 1428 | a 1076 1148 1429 | f 184 1430 | a 1077 6573 1431 | f 889 1432 | f 898 1433 | a 1078 5627 1434 | f 711 1435 | a 1079 7080 1436 | a 1080 4029 1437 | a 1081 4691 1438 | a 1082 6696 1439 | f 486 1440 | a 1083 5681 1441 | a 1084 7402 1442 | a 1085 7923 1443 | a 1086 296 1444 | f 856 1445 | a 1087 7325 1446 | a 1088 1472 1447 | f 913 1448 | f 539 1449 | a 1089 890 1450 | a 1090 1400 1451 | f 642 1452 | f 883 1453 | f 957 1454 | a 1091 1863 1455 | a 1092 2581 1456 | a 1093 651 1457 | a 1094 5962 1458 | f 695 1459 | f 1014 1460 | f 61 1461 | a 1095 4155 1462 | a 1096 6122 1463 | f 600 1464 | a 1097 6665 1465 | a 1098 3685 1466 | a 1099 34 1467 | a 1100 7961 1468 | a 1101 2414 1469 | f 257 1470 | a 1102 7607 1471 | a 1103 2838 1472 | a 1104 5034 1473 | a 1105 3590 1474 | f 958 1475 | f 969 1476 | f 215 1477 | f 105 1478 | a 1106 629 1479 | a 1107 240 1480 | a 1108 6111 1481 | f 1080 1482 | f 290 1483 | a 1109 7858 1484 | a 1110 1624 1485 | a 1111 1238 1486 | a 1112 591 1487 | f 162 1488 | a 1113 1971 1489 | f 538 1490 | f 594 1491 | f 238 1492 | f 828 1493 | a 1114 2838 1494 | f 764 1495 | f 915 1496 | f 16 1497 | f 1048 1498 | f 885 1499 | a 1115 7668 1500 | a 1116 1631 1501 | a 1117 536 1502 | a 1118 5454 1503 | f 809 1504 | a 1119 5176 1505 | a 1120 6934 1506 | f 865 1507 | f 1006 1508 | a 1121 5486 1509 | a 1122 4424 1510 | f 832 1511 | a 1123 902 1512 | f 1013 1513 | f 297 1514 | a 1124 1202 1515 | a 1125 209 1516 | a 1126 6819 1517 | a 1127 5316 1518 | a 1128 6695 1519 | f 239 1520 | a 1129 4028 1521 | f 895 1522 | a 1130 7989 1523 | a 1131 631 1524 | a 1132 3405 1525 | a 1133 6997 1526 | a 1134 4631 1527 | f 546 1528 | f 761 1529 | f 63 1530 | a 1135 3667 1531 | a 1136 2243 1532 | f 935 1533 | a 1137 4148 1534 | f 668 1535 | f 745 1536 | f 1042 1537 | a 1138 6165 1538 | a 1139 2975 1539 | a 1140 3075 1540 | a 1141 6418 1541 | a 1142 5317 1542 | f 831 1543 | a 1143 6122 1544 | f 351 1545 | f 664 1546 | f 1041 1547 | a 1144 7876 1548 | f 905 1549 | f 677 1550 | f 242 1551 | a 1145 5746 1552 | a 1146 1668 1553 | a 1147 3829 1554 | f 274 1555 | f 173 1556 | a 1148 2153 1557 | a 1149 424 1558 | f 236 1559 | f 342 1560 | f 990 1561 | a 1150 1695 1562 | f 86 1563 | a 1151 4523 1564 | f 920 1565 | a 1152 3576 1566 | a 1153 5578 1567 | a 1154 7773 1568 | a 1155 4479 1569 | f 1131 1570 | a 1156 5514 1571 | f 1002 1572 | f 42 1573 | f 93 1574 | f 783 1575 | a 1157 953 1576 | f 1071 1577 | a 1158 3357 1578 | a 1159 5310 1579 | a 1160 7599 1580 | a 1161 3833 1581 | f 1150 1582 | a 1162 308 1583 | a 1163 7456 1584 | a 1164 6887 1585 | f 781 1586 | f 1158 1587 | a 1165 6675 1588 | a 1166 1300 1589 | f 972 1590 | a 1167 7343 1591 | a 1168 8072 1592 | a 1169 2717 1593 | f 1122 1594 | a 1170 6959 1595 | a 1171 3603 1596 | a 1172 4076 1597 | a 1173 545 1598 | a 1174 6863 1599 | f 276 1600 | f 842 1601 | f 1021 1602 | f 590 1603 | f 513 1604 | a 1175 4783 1605 | f 180 1606 | a 1176 5619 1607 | f 1010 1608 | f 847 1609 | a 1177 955 1610 | a 1178 2629 1611 | a 1179 5032 1612 | a 1180 1332 1613 | f 663 1614 | a 1181 4501 1615 | f 1012 1616 | a 1182 6700 1617 | f 1137 1618 | f 1028 1619 | a 1183 2466 1620 | a 1184 475 1621 | a 1185 5427 1622 | f 766 1623 | a 1186 4703 1624 | a 1187 7341 1625 | a 1188 5646 1626 | a 1189 3422 1627 | a 1190 952 1628 | a 1191 291 1629 | f 534 1630 | f 1019 1631 | a 1192 5699 1632 | f 407 1633 | f 747 1634 | f 787 1635 | a 1193 2428 1636 | a 1194 1849 1637 | f 953 1638 | a 1195 7077 1639 | f 1147 1640 | a 1196 6390 1641 | a 1197 4279 1642 | f 135 1643 | f 1086 1644 | f 448 1645 | a 1198 4167 1646 | f 336 1647 | f 287 1648 | f 430 1649 | a 1199 3551 1650 | a 1200 1933 1651 | a 1201 386 1652 | f 1170 1653 | a 1202 3931 1654 | f 1054 1655 | a 1203 5040 1656 | f 1188 1657 | a 1204 7863 1658 | a 1205 6554 1659 | a 1206 3560 1660 | f 989 1661 | f 814 1662 | f 800 1663 | f 1096 1664 | f 1199 1665 | a 1207 3852 1666 | f 959 1667 | a 1208 3980 1668 | f 713 1669 | a 1209 1586 1670 | a 1210 5051 1671 | f 582 1672 | a 1211 5376 1673 | a 1212 1597 1674 | a 1213 3697 1675 | f 54 1676 | f 819 1677 | f 886 1678 | a 1214 1903 1679 | f 726 1680 | f 708 1681 | a 1215 737 1682 | a 1216 4191 1683 | a 1217 8071 1684 | f 665 1685 | f 955 1686 | a 1218 5202 1687 | a 1219 5679 1688 | a 1220 7714 1689 | f 964 1690 | f 159 1691 | f 226 1692 | f 891 1693 | a 1221 2371 1694 | f 1193 1695 | a 1222 4943 1696 | a 1223 5990 1697 | f 724 1698 | a 1224 7580 1699 | a 1225 7349 1700 | f 1202 1701 | f 651 1702 | a 1226 5093 1703 | a 1227 4069 1704 | a 1228 7505 1705 | a 1229 1395 1706 | a 1230 5844 1707 | a 1231 292 1708 | f 834 1709 | a 1232 7679 1710 | a 1233 4702 1711 | f 932 1712 | a 1234 7224 1713 | a 1235 2240 1714 | f 413 1715 | a 1236 2314 1716 | f 170 1717 | f 942 1718 | a 1237 5941 1719 | a 1238 55 1720 | f 598 1721 | f 188 1722 | a 1239 3716 1723 | f 405 1724 | a 1240 3969 1725 | f 692 1726 | a 1241 5751 1727 | a 1242 8112 1728 | a 1243 6511 1729 | f 1132 1730 | f 718 1731 | f 1051 1732 | a 1244 2291 1733 | f 604 1734 | a 1245 5882 1735 | a 1246 5233 1736 | f 729 1737 | a 1247 7424 1738 | f 579 1739 | f 1092 1740 | f 220 1741 | a 1248 7258 1742 | f 705 1743 | a 1249 3295 1744 | f 1233 1745 | a 1250 5721 1746 | a 1251 7053 1747 | f 1224 1748 | a 1252 4334 1749 | f 836 1750 | f 501 1751 | a 1253 1790 1752 | a 1254 3371 1753 | a 1255 1154 1754 | f 296 1755 | f 879 1756 | f 1040 1757 | a 1256 298 1758 | f 1033 1759 | a 1257 3158 1760 | f 596 1761 | a 1258 584 1762 | a 1259 4524 1763 | f 609 1764 | a 1260 3209 1765 | f 279 1766 | f 707 1767 | f 563 1768 | a 1261 3654 1769 | a 1262 1890 1770 | a 1263 7590 1771 | f 537 1772 | f 1121 1773 | f 1085 1774 | a 1264 776 1775 | f 124 1776 | f 1135 1777 | f 250 1778 | f 645 1779 | a 1265 241 1780 | f 97 1781 | f 793 1782 | a 1266 2566 1783 | a 1267 968 1784 | a 1268 6433 1785 | a 1269 4692 1786 | a 1270 3317 1787 | f 1104 1788 | f 599 1789 | f 526 1790 | f 192 1791 | f 1058 1792 | a 1271 6354 1793 | a 1272 15 1794 | a 1273 6069 1795 | a 1274 4043 1796 | a 1275 2314 1797 | f 1156 1798 | a 1276 6637 1799 | f 1276 1800 | a 1277 8160 1801 | f 187 1802 | a 1278 4511 1803 | f 1044 1804 | a 1279 3669 1805 | a 1280 7555 1806 | f 908 1807 | f 1164 1808 | f 406 1809 | a 1281 3754 1810 | a 1282 6422 1811 | a 1283 1703 1812 | a 1284 3129 1813 | f 860 1814 | a 1285 4850 1815 | a 1286 3899 1816 | f 1050 1817 | f 717 1818 | a 1287 803 1819 | f 1047 1820 | a 1288 7263 1821 | f 358 1822 | f 583 1823 | a 1289 7410 1824 | a 1290 7208 1825 | f 961 1826 | a 1291 2916 1827 | f 589 1828 | a 1292 6770 1829 | a 1293 1990 1830 | a 1294 1466 1831 | a 1295 4587 1832 | f 202 1833 | a 1296 4035 1834 | a 1297 2151 1835 | a 1298 8137 1836 | f 1091 1837 | f 18 1838 | f 974 1839 | f 544 1840 | a 1299 3 1841 | f 928 1842 | a 1300 400 1843 | f 309 1844 | f 1061 1845 | a 1301 4056 1846 | a 1302 123 1847 | f 164 1848 | f 1255 1849 | f 1022 1850 | a 1303 7590 1851 | a 1304 4196 1852 | f 1238 1853 | f 1172 1854 | a 1305 2139 1855 | f 1274 1856 | f 1226 1857 | a 1306 1454 1858 | f 1066 1859 | f 482 1860 | f 404 1861 | a 1307 1728 1862 | f 291 1863 | a 1308 3783 1864 | f 414 1865 | f 1216 1866 | f 465 1867 | a 1309 4506 1868 | a 1310 1329 1869 | a 1311 2294 1870 | f 1251 1871 | f 522 1872 | f 516 1873 | f 938 1874 | a 1312 5321 1875 | f 1222 1876 | f 141 1877 | f 1167 1878 | f 409 1879 | f 947 1880 | f 1115 1881 | f 540 1882 | f 845 1883 | f 435 1884 | a 1313 2284 1885 | a 1314 6316 1886 | a 1315 5817 1887 | a 1316 2672 1888 | a 1317 7481 1889 | f 496 1890 | f 485 1891 | a 1318 6118 1892 | a 1319 1266 1893 | f 200 1894 | a 1320 4021 1895 | a 1321 7877 1896 | a 1322 3568 1897 | a 1323 992 1898 | a 1324 4432 1899 | f 632 1900 | a 1325 7688 1901 | a 1326 3080 1902 | f 803 1903 | f 1223 1904 | a 1327 609 1905 | a 1328 7399 1906 | a 1329 180 1907 | f 1312 1908 | f 979 1909 | a 1330 4905 1910 | a 1331 6391 1911 | a 1332 1671 1912 | a 1333 1554 1913 | a 1334 3038 1914 | f 1005 1915 | a 1335 2431 1916 | f 533 1917 | f 876 1918 | f 734 1919 | a 1336 6117 1920 | f 1171 1921 | a 1337 2797 1922 | f 1331 1923 | a 1338 940 1924 | f 1296 1925 | f 1337 1926 | f 963 1927 | f 557 1928 | a 1339 3781 1929 | f 660 1930 | f 634 1931 | a 1340 3741 1932 | f 943 1933 | a 1341 98 1934 | a 1342 5691 1935 | a 1343 5850 1936 | a 1344 6457 1937 | f 1320 1938 | f 1023 1939 | a 1345 1949 1940 | f 1285 1941 | a 1346 4958 1942 | a 1347 644 1943 | a 1348 1863 1944 | a 1349 7841 1945 | a 1350 3462 1946 | a 1351 5890 1947 | f 1179 1948 | f 1270 1949 | f 1240 1950 | f 769 1951 | f 1043 1952 | f 362 1953 | a 1352 1081 1954 | f 1302 1955 | f 933 1956 | a 1353 6303 1957 | a 1354 2100 1958 | a 1355 5456 1959 | f 229 1960 | f 1070 1961 | a 1356 3998 1962 | a 1357 6064 1963 | a 1358 5044 1964 | a 1359 5915 1965 | f 773 1966 | f 248 1967 | f 1209 1968 | f 1008 1969 | f 1105 1970 | a 1360 2563 1971 | f 1003 1972 | a 1361 2038 1973 | f 367 1974 | f 28 1975 | f 543 1976 | a 1362 6616 1977 | a 1363 5937 1978 | f 1354 1979 | f 1093 1980 | a 1364 4558 1981 | a 1365 1750 1982 | f 1348 1983 | f 581 1984 | f 1128 1985 | a 1366 5180 1986 | f 1256 1987 | a 1367 7592 1988 | a 1368 3608 1989 | a 1369 5890 1990 | f 1056 1991 | f 923 1992 | f 1007 1993 | a 1370 805 1994 | a 1371 2571 1995 | f 1279 1996 | f 1343 1997 | a 1372 6440 1998 | a 1373 3659 1999 | f 1370 2000 | f 1049 2001 | f 795 2002 | f 1139 2003 | f 1017 2004 | a 1374 1881 2005 | a 1375 7462 2006 | f 911 2007 | f 1069 2008 | f 1329 2009 | f 691 2010 | a 1376 3478 2011 | f 1068 2012 | f 177 2013 | f 213 2014 | a 1377 40 2015 | a 1378 6612 2016 | f 152 2017 | f 359 2018 | f 461 2019 | f 751 2020 | f 577 2021 | a 1379 917 2022 | f 1107 2023 | f 907 2024 | a 1380 5885 2025 | f 1087 2026 | f 308 2027 | f 1183 2028 | f 218 2029 | f 1221 2030 | a 1381 3025 2031 | f 1313 2032 | a 1382 2419 2033 | f 977 2034 | a 1383 4448 2035 | f 228 2036 | f 1351 2037 | f 738 2038 | f 72 2039 | f 198 2040 | f 51 2041 | f 605 2042 | a 1384 3017 2043 | a 1385 739 2044 | f 709 2045 | f 1254 2046 | a 1386 7900 2047 | f 1295 2048 | f 1265 2049 | f 1136 2050 | a 1387 337 2051 | a 1388 3200 2052 | f 1201 2053 | a 1389 4884 2054 | f 924 2055 | f 1036 2056 | a 1390 5600 2057 | f 1227 2058 | f 945 2059 | f 532 2060 | a 1391 6309 2061 | f 41 2062 | f 967 2063 | a 1392 5463 2064 | a 1393 10 2065 | a 1394 3242 2066 | f 5 2067 | a 1395 7708 2068 | a 1396 343 2069 | a 1397 8107 2070 | a 1398 3485 2071 | f 1242 2072 | f 852 2073 | f 595 2074 | a 1399 6998 2075 | a 1400 1832 2076 | f 897 2077 | f 1219 2078 | f 398 2079 | a 1401 599 2080 | f 900 2081 | f 76 2082 | f 1020 2083 | a 1402 4221 2084 | a 1403 1765 2085 | a 1404 7287 2086 | f 890 2087 | f 1194 2088 | f 136 2089 | a 1405 1922 2090 | f 1365 2091 | a 1406 4348 2092 | a 1407 5767 2093 | f 723 2094 | f 476 2095 | f 1116 2096 | f 1310 2097 | f 475 2098 | f 341 2099 | f 425 2100 | f 453 2101 | f 1127 2102 | a 1408 3716 2103 | a 1409 3846 2104 | f 110 2105 | f 858 2106 | f 637 2107 | f 19 2108 | a 1410 6394 2109 | a 1411 2738 2110 | f 62 2111 | f 669 2112 | f 956 2113 | a 1412 68 2114 | f 1308 2115 | a 1413 1672 2116 | a 1414 5829 2117 | f 1073 2118 | a 1415 441 2119 | a 1416 3560 2120 | f 1095 2121 | a 1417 690 2122 | f 610 2123 | f 246 2124 | f 674 2125 | a 1418 5617 2126 | a 1419 4637 2127 | f 337 2128 | a 1420 4808 2129 | f 1037 2130 | f 332 2131 | a 1421 1420 2132 | a 1422 5001 2133 | f 1004 2134 | f 1380 2135 | a 1423 3060 2136 | f 349 2137 | a 1424 5213 2138 | a 1425 4150 2139 | f 1031 2140 | a 1426 3139 2141 | a 1427 2808 2142 | f 1118 2143 | a 1428 109 2144 | a 1429 37 2145 | f 1346 2146 | a 1430 4473 2147 | f 153 2148 | f 962 2149 | a 1431 4580 2150 | a 1432 1294 2151 | f 474 2152 | f 1332 2153 | f 304 2154 | a 1433 4610 2155 | f 260 2156 | f 1278 2157 | f 838 2158 | f 1204 2159 | a 1434 7351 2160 | f 968 2161 | a 1435 1734 2162 | a 1436 2379 2163 | a 1437 2212 2164 | a 1438 2905 2165 | f 681 2166 | a 1439 5311 2167 | a 1440 2390 2168 | f 1097 2169 | f 731 2170 | f 887 2171 | a 1441 387 2172 | f 788 2173 | f 4 2174 | f 92 2175 | a 1442 3456 2176 | a 1443 3419 2177 | f 1397 2178 | f 410 2179 | f 1015 2180 | f 1098 2181 | a 1444 2232 2182 | a 1445 7428 2183 | f 818 2184 | f 916 2185 | f 1283 2186 | f 357 2187 | f 694 2188 | a 1446 5280 2189 | f 1262 2190 | f 1372 2191 | f 1030 2192 | f 1383 2193 | f 79 2194 | a 1447 297 2195 | f 585 2196 | f 444 2197 | f 1124 2198 | a 1448 4408 2199 | f 1160 2200 | a 1449 5422 2201 | a 1450 3070 2202 | a 1451 6361 2203 | a 1452 677 2204 | a 1453 3288 2205 | a 1454 5437 2206 | a 1455 7547 2207 | f 1405 2208 | f 255 2209 | f 1243 2210 | f 147 2211 | f 1407 2212 | f 799 2213 | a 1456 7391 2214 | f 311 2215 | f 1248 2216 | a 1457 6910 2217 | a 1458 5992 2218 | a 1459 5362 2219 | a 1460 7054 2220 | a 1461 5707 2221 | f 770 2222 | a 1462 222 2223 | a 1463 45 2224 | a 1464 3419 2225 | f 1101 2226 | f 1252 2227 | f 111 2228 | a 1465 973 2229 | f 654 2230 | a 1466 5295 2231 | f 1410 2232 | a 1467 4388 2233 | f 1305 2234 | a 1468 5649 2235 | f 997 2236 | a 1469 7993 2237 | f 934 2238 | f 1205 2239 | f 23 2240 | f 1140 2241 | a 1470 6130 2242 | a 1471 6466 2243 | f 1067 2244 | a 1472 2944 2245 | f 790 2246 | f 743 2247 | a 1473 7056 2248 | f 1315 2249 | a 1474 4349 2250 | f 1412 2251 | f 422 2252 | a 1475 7288 2253 | f 1475 2254 | a 1476 1043 2255 | f 158 2256 | a 1477 1920 2257 | f 1206 2258 | f 927 2259 | a 1478 3115 2260 | a 1479 1320 2261 | a 1480 4495 2262 | f 1088 2263 | a 1481 6886 2264 | a 1482 4640 2265 | a 1483 6409 2266 | a 1484 2538 2267 | f 1294 2268 | f 765 2269 | f 1260 2270 | f 477 2271 | f 1345 2272 | f 32 2273 | f 1214 2274 | f 1035 2275 | a 1485 687 2276 | a 1486 4736 2277 | f 1230 2278 | a 1487 2915 2279 | a 1488 3775 2280 | a 1489 6153 2281 | a 1490 757 2282 | a 1491 7773 2283 | a 1492 7899 2284 | f 732 2285 | f 706 2286 | f 1377 2287 | f 1457 2288 | a 1493 4405 2289 | f 1326 2290 | a 1494 564 2291 | f 112 2292 | f 1480 2293 | f 922 2294 | a 1495 6406 2295 | f 629 2296 | f 576 2297 | f 1174 2298 | a 1496 5016 2299 | a 1497 8106 2300 | f 1448 2301 | f 194 2302 | f 483 2303 | f 554 2304 | f 1273 2305 | f 615 2306 | f 1257 2307 | a 1498 3565 2308 | f 944 2309 | f 1479 2310 | f 1177 2311 | f 1340 2312 | f 1455 2313 | f 980 2314 | f 551 2315 | a 1499 7028 2316 | f 965 2317 | f 1356 2318 | f 999 2319 | a 1500 130 2320 | a 1501 5198 2321 | f 1249 2322 | a 1502 6856 2323 | f 1112 2324 | f 1324 2325 | a 1503 5376 2326 | a 1504 6821 2327 | f 472 2328 | a 1505 2512 2329 | f 495 2330 | a 1506 4274 2331 | a 1507 5152 2332 | f 1406 2333 | f 617 2334 | f 1175 2335 | f 1272 2336 | a 1508 5600 2337 | f 1389 2338 | a 1509 5080 2339 | f 1039 2340 | f 1311 2341 | f 1157 2342 | a 1510 2602 2343 | a 1511 7062 2344 | a 1512 4784 2345 | f 29 2346 | a 1513 4950 2347 | a 1514 431 2348 | a 1515 4383 2349 | f 926 2350 | f 912 2351 | f 684 2352 | a 1516 768 2353 | a 1517 611 2354 | f 452 2355 | f 445 2356 | a 1518 4292 2357 | f 1398 2358 | a 1519 7897 2359 | f 305 2360 | a 1520 3662 2361 | a 1521 568 2362 | f 121 2363 | f 1142 2364 | f 446 2365 | a 1522 869 2366 | f 714 2367 | a 1523 1806 2368 | f 340 2369 | a 1524 3880 2370 | f 1152 2371 | f 1074 2372 | a 1525 6581 2373 | f 329 2374 | a 1526 2724 2375 | f 1472 2376 | f 1134 2377 | f 1072 2378 | f 680 2379 | f 877 2380 | a 1527 6885 2381 | f 312 2382 | a 1528 2133 2383 | f 1236 2384 | f 1445 2385 | f 1078 2386 | a 1529 332 2387 | a 1530 6439 2388 | f 167 2389 | f 415 2390 | a 1531 5711 2391 | f 175 2392 | a 1532 7638 2393 | f 211 2394 | a 1533 4400 2395 | f 1456 2396 | a 1534 4903 2397 | f 993 2398 | f 1178 2399 | a 1535 8005 2400 | a 1536 1353 2401 | f 742 2402 | f 196 2403 | f 316 2404 | a 1537 4012 2405 | a 1538 7655 2406 | a 1539 5249 2407 | f 1465 2408 | a 1540 5610 2409 | a 1541 3918 2410 | f 823 2411 | f 725 2412 | f 1420 2413 | a 1542 3115 2414 | f 1065 2415 | a 1543 489 2416 | f 995 2417 | a 1544 8095 2418 | a 1545 6289 2419 | a 1546 8067 2420 | a 1547 4135 2421 | f 9 2422 | f 1186 2423 | f 870 2424 | a 1548 2668 2425 | f 1113 2426 | f 1404 2427 | f 1466 2428 | f 1374 2429 | f 1198 2430 | f 439 2431 | f 1298 2432 | f 1094 2433 | f 1269 2434 | a 1549 4272 2435 | f 1267 2436 | a 1550 2567 2437 | f 1489 2438 | a 1551 1164 2439 | f 811 2440 | f 985 2441 | f 813 2442 | f 1341 2443 | f 1119 2444 | f 1387 2445 | a 1552 8017 2446 | a 1553 2509 2447 | f 325 2448 | a 1554 6157 2449 | a 1555 4044 2450 | a 1556 3507 2451 | f 227 2452 | a 1557 4400 2453 | a 1558 795 2454 | f 763 2455 | a 1559 2706 2456 | a 1560 7372 2457 | f 424 2458 | f 30 2459 | a 1561 2516 2460 | a 1562 2645 2461 | f 12 2462 | f 1424 2463 | f 1229 2464 | f 154 2465 | f 896 2466 | a 1563 4013 2467 | f 266 2468 | f 1418 2469 | f 1220 2470 | a 1564 2474 2471 | a 1565 3655 2472 | f 197 2473 | f 949 2474 | a 1566 1042 2475 | f 323 2476 | f 1301 2477 | a 1567 5056 2478 | f 1503 2479 | f 322 2480 | f 1059 2481 | f 1077 2482 | f 1468 2483 | f 1400 2484 | f 36 2485 | f 840 2486 | f 83 2487 | a 1568 7192 2488 | f 1293 2489 | f 1185 2490 | f 241 2491 | f 261 2492 | f 871 2493 | f 801 2494 | a 1569 406 2495 | f 1518 2496 | a 1570 2033 2497 | f 1062 2498 | a 1571 5092 2499 | a 1572 1850 2500 | a 1573 7779 2501 | f 233 2502 | f 733 2503 | f 1471 2504 | a 1574 4453 2505 | a 1575 1906 2506 | f 1385 2507 | f 1444 2508 | f 1208 2509 | f 386 2510 | f 1519 2511 | f 1155 2512 | a 1576 1694 2513 | a 1577 2820 2514 | f 676 2515 | a 1578 7394 2516 | a 1579 2208 2517 | a 1580 6907 2518 | f 846 2519 | a 1581 5544 2520 | f 760 2521 | a 1582 2835 2522 | f 1546 2523 | a 1583 5172 2524 | a 1584 4255 2525 | a 1585 6845 2526 | f 1232 2527 | a 1586 2026 2528 | f 118 2529 | f 888 2530 | f 1484 2531 | f 1187 2532 | f 730 2533 | a 1587 7920 2534 | f 1411 2535 | a 1588 5752 2536 | f 1574 2537 | f 1371 2538 | f 1291 2539 | f 140 2540 | a 1589 1677 2541 | a 1590 6385 2542 | a 1591 262 2543 | f 1416 2544 | f 1394 2545 | f 1151 2546 | a 1592 2857 2547 | f 1286 2548 | f 1555 2549 | a 1593 2485 2550 | f 247 2551 | f 1215 2552 | a 1594 1643 2553 | a 1595 6731 2554 | f 1414 2555 | f 1328 2556 | a 1596 880 2557 | a 1597 7179 2558 | f 382 2559 | f 1415 2560 | f 1083 2561 | f 701 2562 | a 1598 7246 2563 | a 1599 1959 2564 | f 1344 2565 | f 1583 2566 | f 1393 2567 | a 1600 993 2568 | f 221 2569 | f 1549 2570 | f 237 2571 | a 1601 7009 2572 | a 1602 4045 2573 | f 44 2574 | f 1299 2575 | f 1130 2576 | f 722 2577 | a 1603 6621 2578 | a 1604 4537 2579 | f 1264 2580 | f 1358 2581 | a 1605 4841 2582 | f 531 2583 | f 1316 2584 | f 429 2585 | f 954 2586 | a 1606 7971 2587 | f 1126 2588 | a 1607 2770 2589 | f 1300 2590 | a 1608 444 2591 | f 1281 2592 | f 1530 2593 | f 484 2594 | f 710 2595 | f 468 2596 | f 687 2597 | f 1154 2598 | a 1609 7519 2599 | f 1306 2600 | f 1576 2601 | f 1490 2602 | f 1168 2603 | a 1610 1542 2604 | f 1247 2605 | f 1146 2606 | f 946 2607 | a 1611 4196 2608 | f 817 2609 | f 682 2610 | a 1612 144 2611 | f 1419 2612 | a 1613 6327 2613 | f 1568 2614 | f 712 2615 | a 1614 6489 2616 | f 1495 2617 | f 284 2618 | a 1615 5971 2619 | f 1572 2620 | a 1616 2141 2621 | f 426 2622 | a 1617 1825 2623 | a 1618 14 2624 | f 1607 2625 | a 1619 5658 2626 | f 1108 2627 | a 1620 2339 2628 | a 1621 4422 2629 | f 960 2630 | a 1622 2608 2631 | f 150 2632 | f 837 2633 | f 384 2634 | a 1623 7274 2635 | a 1624 4977 2636 | f 603 2637 | f 1552 2638 | f 757 2639 | f 939 2640 | a 1625 4769 2641 | f 987 2642 | f 1244 2643 | a 1626 1716 2644 | f 931 2645 | f 1565 2646 | f 881 2647 | a 1627 2598 2648 | a 1628 2706 2649 | f 1184 2650 | f 1138 2651 | f 1144 2652 | f 978 2653 | f 1532 2654 | f 1524 2655 | f 143 2656 | f 628 2657 | a 1629 5672 2658 | f 1103 2659 | f 1153 2660 | f 270 2661 | f 1212 2662 | f 1539 2663 | f 15 2664 | f 545 2665 | a 1630 3608 2666 | a 1631 1530 2667 | a 1632 4123 2668 | a 1633 715 2669 | a 1634 1384 2670 | a 1635 5007 2671 | f 570 2672 | f 521 2673 | a 1636 3705 2674 | a 1637 4115 2675 | f 1577 2676 | f 520 2677 | f 402 2678 | f 616 2679 | a 1638 2275 2680 | a 1639 643 2681 | a 1640 7190 2682 | a 1641 4253 2683 | a 1642 3655 2684 | f 1034 2685 | f 878 2686 | f 1637 2687 | a 1643 7610 2688 | f 1261 2689 | a 1644 4489 2690 | a 1645 3794 2691 | f 991 2692 | a 1646 4208 2693 | a 1647 7938 2694 | f 1563 2695 | a 1648 226 2696 | f 1379 2697 | f 1618 2698 | f 1180 2699 | a 1649 1469 2700 | a 1650 949 2701 | a 1651 2312 2702 | f 1600 2703 | a 1652 3232 2704 | f 59 2705 | a 1653 672 2706 | f 917 2707 | a 1654 7539 2708 | a 1655 1075 2709 | f 107 2710 | a 1656 7433 2711 | f 1517 2712 | f 1500 2713 | f 936 2714 | a 1657 418 2715 | f 1446 2716 | f 1381 2717 | f 1327 2718 | f 171 2719 | f 1619 2720 | f 1207 2721 | a 1658 455 2722 | f 679 2723 | f 1436 2724 | f 1543 2725 | a 1659 5662 2726 | a 1660 2347 2727 | f 1494 2728 | a 1661 4271 2729 | f 1592 2730 | f 1350 2731 | f 899 2732 | a 1662 1638 2733 | f 1032 2734 | a 1663 742 2735 | a 1664 5660 2736 | f 365 2737 | f 3 2738 | a 1665 1551 2739 | a 1666 7804 2740 | f 1011 2741 | f 752 2742 | f 930 2743 | a 1667 4371 2744 | f 574 2745 | f 1399 2746 | a 1668 5777 2747 | f 872 2748 | f 1451 2749 | a 1669 3268 2750 | a 1670 3076 2751 | a 1671 129 2752 | a 1672 935 2753 | a 1673 4132 2754 | a 1674 2532 2755 | a 1675 4493 2756 | f 1117 2757 | a 1676 7890 2758 | a 1677 2749 2759 | f 416 2760 | a 1678 1838 2761 | f 1493 2762 | f 1163 2763 | a 1679 6374 2764 | f 756 2765 | f 1196 2766 | a 1680 1588 2767 | f 1362 2768 | f 1491 2769 | f 1478 2770 | f 988 2771 | f 1569 2772 | f 1626 2773 | f 1663 2774 | f 1643 2775 | a 1681 5301 2776 | f 1322 2777 | f 1655 2778 | a 1682 7672 2779 | a 1683 1426 2780 | f 810 2781 | f 1624 2782 | f 1620 2783 | f 451 2784 | a 1684 7509 2785 | f 929 2786 | f 1250 2787 | f 1673 2788 | a 1685 7412 2789 | f 210 2790 | a 1686 5491 2791 | f 401 2792 | a 1687 4187 2793 | f 1659 2794 | a 1688 3298 2795 | a 1689 4429 2796 | f 1422 2797 | f 779 2798 | f 639 2799 | f 608 2800 | f 1672 2801 | a 1690 2598 2802 | f 774 2803 | f 1634 2804 | a 1691 3767 2805 | a 1692 7520 2806 | a 1693 3957 2807 | f 556 2808 | a 1694 5087 2809 | a 1695 5709 2810 | a 1696 2274 2811 | a 1697 1707 2812 | f 348 2813 | a 1698 5909 2814 | a 1699 7171 2815 | f 530 2816 | a 1700 1192 2817 | f 1506 2818 | f 1461 2819 | f 1538 2820 | a 1701 1008 2821 | f 294 2822 | f 1609 2823 | f 982 2824 | f 1536 2825 | f 1596 2826 | f 1211 2827 | a 1702 3869 2828 | f 1390 2829 | f 1689 2830 | f 307 2831 | a 1703 285 2832 | a 1704 6080 2833 | f 1617 2834 | a 1705 7697 2835 | a 1706 1391 2836 | a 1707 7857 2837 | f 1560 2838 | f 1615 2839 | a 1708 2702 2840 | f 1342 2841 | a 1709 8059 2842 | f 317 2843 | f 1586 2844 | a 1710 3178 2845 | f 690 2846 | f 1321 2847 | f 503 2848 | a 1711 4934 2849 | f 216 2850 | a 1712 1063 2851 | f 1570 2852 | f 1651 2853 | f 1440 2854 | f 269 2855 | a 1713 4183 2856 | f 265 2857 | a 1714 1309 2858 | f 1512 2859 | f 334 2860 | a 1715 7357 2861 | f 864 2862 | a 1716 5615 2863 | f 1376 2864 | f 1438 2865 | a 1717 301 2866 | f 1585 2867 | a 1718 4134 2868 | f 1258 2869 | a 1719 961 2870 | f 1501 2871 | f 419 2872 | f 998 2873 | a 1720 55 2874 | f 1525 2875 | f 816 2876 | f 1392 2877 | f 1687 2878 | a 1721 1055 2879 | a 1722 4724 2880 | a 1723 6646 2881 | f 1417 2882 | f 1162 2883 | f 1707 2884 | f 1690 2885 | f 370 2886 | a 1724 4450 2887 | a 1725 6028 2888 | f 301 2889 | a 1726 3427 2890 | f 1228 2891 | f 1304 2892 | a 1727 3435 2893 | f 1508 2894 | f 264 2895 | f 777 2896 | a 1728 3460 2897 | f 327 2898 | a 1729 57 2899 | a 1730 2987 2900 | f 618 2901 | f 1462 2902 | a 1731 5920 2903 | f 1266 2904 | f 1268 2905 | f 1148 2906 | f 1528 2907 | f 1660 2908 | f 1277 2909 | f 1470 2910 | f 172 2911 | a 1732 6415 2912 | f 759 2913 | f 302 2914 | f 1550 2915 | a 1733 791 2916 | f 1710 2917 | f 1452 2918 | a 1734 5367 2919 | f 784 2920 | f 719 2921 | f 1001 2922 | f 952 2923 | f 1722 2924 | a 1735 5344 2925 | f 1335 2926 | a 1736 1061 2927 | a 1737 8091 2928 | f 508 2929 | a 1738 2770 2930 | a 1739 7774 2931 | a 1740 5469 2932 | f 1605 2933 | f 1289 2934 | f 1454 2935 | f 1458 2936 | a 1741 1238 2937 | a 1742 2903 2938 | a 1743 62 2939 | a 1744 5403 2940 | a 1745 3595 2941 | a 1746 8066 2942 | a 1747 7417 2943 | f 1664 2944 | a 1748 729 2945 | f 1640 2946 | a 1749 588 2947 | a 1750 393 2948 | f 1038 2949 | f 699 2950 | f 1027 2951 | f 395 2952 | a 1751 2465 2953 | a 1752 7163 2954 | f 1717 2955 | f 1064 2956 | a 1753 5869 2957 | f 1459 2958 | a 1754 1871 2959 | f 1674 2960 | f 1597 2961 | a 1755 1126 2962 | a 1756 4607 2963 | f 423 2964 | a 1757 2781 2965 | a 1758 2103 2966 | f 1602 2967 | f 1120 2968 | f 909 2969 | a 1759 913 2970 | f 128 2971 | a 1760 6215 2972 | f 1729 2973 | f 1483 2974 | a 1761 7026 2975 | a 1762 7403 2976 | a 1763 5918 2977 | a 1764 4239 2978 | f 1684 2979 | a 1765 1774 2980 | a 1766 4891 2981 | f 1507 2982 | a 1767 5540 2983 | f 1661 2984 | a 1768 6331 2985 | a 1769 6557 2986 | a 1770 1019 2987 | a 1771 441 2988 | f 1439 2989 | f 1541 2990 | f 1589 2991 | f 1682 2992 | a 1772 4685 2993 | a 1773 3589 2994 | f 1079 2995 | f 1616 2996 | a 1774 1922 2997 | f 1771 2998 | f 1509 2999 | f 1742 3000 | a 1775 2068 3001 | a 1776 354 3002 | f 8 3003 | f 910 3004 | f 456 3005 | f 1606 3006 | f 1421 3007 | f 1333 3008 | a 1777 2914 3009 | a 1778 6713 3010 | f 506 3011 | f 1610 3012 | f 1303 3013 | f 360 3014 | f 1505 3015 | f 1523 3016 | a 1779 3446 3017 | f 611 3018 | f 1725 3019 | f 1502 3020 | f 1442 3021 | f 568 3022 | a 1780 4172 3023 | f 683 3024 | f 1733 3025 | f 873 3026 | f 1271 3027 | a 1781 3882 3028 | a 1782 6655 3029 | a 1783 1590 3030 | f 1593 3031 | f 1745 3032 | f 315 3033 | f 622 3034 | f 1649 3035 | a 1784 226 3036 | f 1656 3037 | f 1527 3038 | a 1785 2943 3039 | f 1662 3040 | f 64 3041 | f 33 3042 | a 1786 3782 3043 | a 1787 5939 3044 | a 1788 5094 3045 | f 1621 3046 | f 1581 3047 | f 1763 3048 | f 1693 3049 | f 1535 3050 | f 1778 3051 | f 55 3052 | f 376 3053 | a 1789 7650 3054 | f 1159 3055 | f 983 3056 | f 1751 3057 | f 1423 3058 | f 1642 3059 | f 1533 3060 | f 1133 3061 | f 391 3062 | a 1790 3542 3063 | a 1791 4630 3064 | f 804 3065 | f 1428 3066 | f 1783 3067 | a 1792 581 3068 | f 1744 3069 | f 1708 3070 | f 1657 3071 | f 975 3072 | f 1203 3073 | f 1378 3074 | f 833 3075 | a 1793 7499 3076 | f 1275 3077 | f 566 3078 | f 460 3079 | f 1741 3080 | f 880 3081 | f 1554 3082 | f 1453 3083 | a 1794 3350 3084 | a 1795 1158 3085 | f 1245 3086 | f 1060 3087 | f 1396 3088 | f 1584 3089 | f 786 3090 | a 1796 7617 3091 | a 1797 5663 3092 | a 1798 7179 3093 | f 1716 3094 | f 1738 3095 | f 1366 3096 | f 1545 3097 | a 1799 5811 3098 | f 1441 3099 | f 1681 3100 | f 1669 3101 | f 330 3102 | f 392 3103 | a 1800 3561 3104 | f 1309 3105 | a 1801 3383 3106 | f 1318 3107 | f 1325 3108 | f 1161 3109 | a 1802 2853 3110 | a 1803 4228 3111 | f 1338 3112 | a 1804 4451 3113 | a 1805 636 3114 | a 1806 112 3115 | f 1355 3116 | f 487 3117 | f 1759 3118 | f 1125 3119 | f 948 3120 | a 1807 6828 3121 | f 918 3122 | f 1785 3123 | a 1808 7986 3124 | a 1809 323 3125 | a 1810 307 3126 | f 1510 3127 | f 1307 3128 | a 1811 6810 3129 | f 1463 3130 | f 638 3131 | f 1433 3132 | f 1653 3133 | f 1809 3134 | f 1685 3135 | a 1812 776 3136 | a 1813 573 3137 | f 1608 3138 | f 1263 3139 | a 1814 2144 3140 | a 1815 2672 3141 | f 1016 3142 | f 256 3143 | a 1816 5119 3144 | a 1817 6977 3145 | f 1246 3146 | f 640 3147 | f 331 3148 | a 1818 7544 3149 | a 1819 879 3150 | a 1820 6015 3151 | f 1053 3152 | f 1548 3153 | f 1813 3154 | f 587 3155 | f 98 3156 | a 1821 6020 3157 | f 1052 3158 | f 1802 3159 | f 736 3160 | f 1190 3161 | f 462 3162 | a 1822 349 3163 | f 675 3164 | f 1765 3165 | a 1823 1873 3166 | a 1824 1982 3167 | a 1825 561 3168 | f 646 3169 | a 1826 1792 3170 | a 1827 5826 3171 | a 1828 5403 3172 | f 1632 3173 | f 700 3174 | f 1739 3175 | f 1728 3176 | f 1284 3177 | f 1100 3178 | f 438 3179 | f 373 3180 | f 1129 3181 | f 1648 3182 | f 212 3183 | f 1580 3184 | f 1353 3185 | f 515 3186 | f 1817 3187 | f 1737 3188 | a 1829 2606 3189 | f 1259 3190 | f 1075 3191 | f 1529 3192 | a 1830 3353 3193 | f 176 3194 | f 1784 3195 | f 746 3196 | f 658 3197 | a 1831 28 3198 | f 1349 3199 | a 1832 1415 3200 | f 835 3201 | f 335 3202 | a 1833 1176 3203 | f 1650 3204 | f 1110 3205 | f 168 3206 | a 1834 6336 3207 | a 1835 1271 3208 | f 174 3209 | a 1836 4297 3210 | a 1837 2259 3211 | f 1169 3212 | f 1598 3213 | a 1838 3288 3214 | f 408 3215 | a 1839 4125 3216 | a 1840 853 3217 | a 1841 2872 3218 | f 1766 3219 | f 1767 3220 | a 1842 2319 3221 | f 1099 3222 | f 1788 3223 | a 1843 929 3224 | f 1633 3225 | a 1844 2976 3226 | a 1845 1937 3227 | f 1522 3228 | f 11 3229 | f 1695 3230 | f 1599 3231 | f 1799 3232 | f 1430 3233 | f 572 3234 | f 1712 3235 | f 1562 3236 | f 1819 3237 | f 1613 3238 | f 780 3239 | f 1225 3240 | a 1846 1939 3241 | f 355 3242 | f 1753 3243 | f 1775 3244 | f 1432 3245 | f 1090 3246 | f 1724 3247 | f 1671 3248 | a 1847 6870 3249 | f 1792 3250 | a 1848 3094 3251 | f 1573 3252 | f 631 3253 | f 648 3254 | f 1450 3255 | f 1636 3256 | f 1700 3257 | f 1114 3258 | a 1849 541 3259 | f 775 3260 | f 1841 3261 | a 1850 4428 3262 | f 1781 3263 | f 458 3264 | f 1622 3265 | f 1200 3266 | f 1774 3267 | f 1678 3268 | f 1677 3269 | a 1851 4718 3270 | f 1658 3271 | f 1837 3272 | f 1334 3273 | f 82 3274 | f 1181 3275 | f 457 3276 | a 1852 7013 3277 | f 1191 3278 | f 387 3279 | a 1853 2832 3280 | f 996 3281 | a 1854 1175 3282 | a 1855 5315 3283 | f 1623 3284 | f 741 3285 | a 1856 7948 3286 | f 1807 3287 | f 1683 3288 | a 1857 5479 3289 | f 1603 3290 | f 696 3291 | f 1210 3292 | a 1858 7858 3293 | f 1706 3294 | f 1 3295 | f 1749 3296 | f 672 3297 | f 1314 3298 | f 120 3299 | f 1369 3300 | a 1859 6219 3301 | f 1834 3302 | a 1860 7054 3303 | f 806 3304 | a 1861 5748 3305 | f 1000 3306 | f 490 3307 | f 1627 3308 | f 1843 3309 | f 1796 3310 | a 1862 4055 3311 | f 145 3312 | f 38 3313 | a 1863 1305 3314 | f 1361 3315 | a 1864 6266 3316 | f 1192 3317 | f 1464 3318 | f 578 3319 | f 1488 3320 | a 1865 8162 3321 | f 798 3322 | f 1486 3323 | f 1811 3324 | f 549 3325 | f 1241 3326 | a 1866 7932 3327 | a 1867 5285 3328 | f 1364 3329 | f 1803 3330 | f 1237 3331 | f 744 3332 | f 1768 3333 | a 1868 1171 3334 | f 1176 3335 | f 1726 3336 | f 904 3337 | a 1869 5076 3338 | f 1676 3339 | a 1870 7556 3340 | a 1871 2148 3341 | f 1699 3342 | a 1872 4696 3343 | a 1873 4832 3344 | f 1547 3345 | a 1874 6800 3346 | a 1875 6475 3347 | f 1718 3348 | f 298 3349 | f 1481 3350 | f 1793 3351 | f 1635 3352 | a 1876 1139 3353 | f 1852 3354 | f 1395 3355 | f 1644 3356 | f 1553 3357 | f 1831 3358 | a 1877 2266 3359 | f 80 3360 | f 1833 3361 | f 1665 3362 | f 1384 3363 | a 1878 2013 3364 | a 1879 6525 3365 | f 1403 3366 | f 1734 3367 | f 976 3368 | f 119 3369 | f 1373 3370 | f 1231 3371 | f 1165 3372 | f 1849 3373 | a 1880 4988 3374 | f 1497 3375 | f 1769 3376 | f 1287 3377 | a 1881 4465 3378 | a 1882 452 3379 | f 1437 3380 | f 346 3381 | f 1102 3382 | a 1883 2889 3383 | a 1884 3460 3384 | f 1680 3385 | f 1645 3386 | a 1885 7248 3387 | f 1559 3388 | f 755 3389 | f 1829 3390 | a 1886 3243 3391 | f 1857 3392 | f 1797 3393 | a 1887 1116 3394 | a 1888 6193 3395 | a 1889 5258 3396 | f 1641 3397 | f 1730 3398 | f 1195 3399 | f 1694 3400 | f 1880 3401 | f 1780 3402 | a 1890 7087 3403 | f 1789 3404 | f 1009 3405 | f 812 3406 | a 1891 996 3407 | f 1772 3408 | f 1832 3409 | a 1892 1995 3410 | a 1893 7497 3411 | f 1770 3412 | f 1704 3413 | f 1885 3414 | f 1888 3415 | f 1713 3416 | f 1743 3417 | f 1806 3418 | f 1675 3419 | f 504 3420 | f 1591 3421 | f 820 3422 | f 607 3423 | f 1614 3424 | f 1388 3425 | a 1894 7986 3426 | a 1895 1442 3427 | f 1612 3428 | a 1896 236 3429 | f 1111 3430 | f 1824 3431 | f 739 3432 | f 1782 3433 | f 874 3434 | a 1897 4661 3435 | f 1705 3436 | f 87 3437 | a 1898 754 3438 | f 984 3439 | f 1280 3440 | f 1590 3441 | f 385 3442 | f 1427 3443 | f 869 3444 | a 1899 5781 3445 | f 1688 3446 | f 1347 3447 | f 868 3448 | f 1892 3449 | f 1628 3450 | a 1900 1330 3451 | f 902 3452 | a 1901 414 3453 | a 1902 6093 3454 | f 319 3455 | a 1903 6710 3456 | a 1904 632 3457 | f 1800 3458 | a 1905 3961 3459 | f 1521 3460 | f 1647 3461 | f 1804 3462 | a 1906 4016 3463 | f 1721 3464 | f 1473 3465 | f 1786 3466 | f 1359 3467 | a 1907 7612 3468 | f 1542 3469 | f 1469 3470 | f 201 3471 | f 1855 3472 | f 1727 3473 | a 1908 2618 3474 | f 715 3475 | f 1869 3476 | f 70 3477 | a 1909 4003 3478 | a 1910 960 3479 | f 1881 3480 | f 428 3481 | f 884 3482 | f 1426 3483 | f 1764 3484 | f 100 3485 | f 1859 3486 | a 1911 810 3487 | f 1835 3488 | a 1912 3747 3489 | f 1487 3490 | f 1856 3491 | f 1740 3492 | f 1794 3493 | f 843 3494 | a 1913 6948 3495 | f 1561 3496 | a 1914 5630 3497 | f 1762 3498 | f 1540 3499 | f 1449 3500 | f 1702 3501 | f 805 3502 | a 1915 7550 3503 | a 1916 2769 3504 | a 1917 7632 3505 | f 1816 3506 | a 1918 5737 3507 | f 1760 3508 | a 1919 1239 3509 | a 1920 5376 3510 | a 1921 3879 3511 | f 1567 3512 | f 1401 3513 | a 1922 7375 3514 | a 1923 2830 3515 | f 1899 3516 | f 1845 3517 | a 1924 1570 3518 | a 1925 835 3519 | f 1924 3520 | a 1926 38 3521 | f 1882 3522 | f 1773 3523 | a 1927 2839 3524 | f 1823 3525 | f 1575 3526 | f 1746 3527 | f 1874 3528 | a 1928 4381 3529 | f 1679 3530 | f 1024 3531 | f 1084 3532 | a 1929 7885 3533 | a 1930 873 3534 | f 1667 3535 | f 1860 3536 | a 1931 5741 3537 | f 661 3538 | f 1895 3539 | f 280 3540 | f 1913 3541 | f 1866 3542 | f 1757 3543 | f 1836 3544 | f 1485 3545 | f 1556 3546 | f 1904 3547 | f 463 3548 | f 1818 3549 | f 1697 3550 | a 1932 5240 3551 | f 1810 3552 | f 1723 3553 | f 1719 3554 | f 1868 3555 | f 1234 3556 | f 1848 3557 | f 970 3558 | f 1474 3559 | f 1604 3560 | f 693 3561 | f 1429 3562 | f 1629 3563 | f 1317 3564 | f 1686 3565 | f 1820 3566 | f 1368 3567 | f 1919 3568 | a 1933 7415 3569 | f 1055 3570 | a 1934 6070 3571 | a 1935 252 3572 | f 1582 3573 | f 992 3574 | a 1936 7702 3575 | f 1736 3576 | f 481 3577 | f 1477 3578 | a 1937 2451 3579 | f 1498 3580 | f 1840 3581 | f 561 3582 | f 1777 3583 | f 1408 3584 | f 1761 3585 | f 1460 3586 | f 1735 3587 | f 1894 3588 | f 1801 3589 | a 1938 4680 3590 | f 1732 3591 | f 1754 3592 | f 894 3593 | f 26 3594 | a 1939 5491 3595 | a 1940 8003 3596 | f 1891 3597 | f 971 3598 | f 1897 3599 | f 1511 3600 | f 1382 3601 | a 1941 3492 3602 | f 1698 3603 | a 1942 4225 3604 | a 1943 3975 3605 | f 1696 3606 | f 306 3607 | a 1944 5947 3608 | f 754 3609 | f 1918 3610 | a 1945 1246 3611 | f 1588 3612 | f 1282 3613 | f 862 3614 | a 1946 4170 3615 | f 1467 3616 | f 1915 3617 | f 1844 3618 | f 289 3619 | f 1858 3620 | f 1290 3621 | a 1947 177 3622 | f 1646 3623 | f 235 3624 | f 1877 3625 | f 1889 3626 | a 1948 7592 3627 | f 973 3628 | a 1949 6442 3629 | f 1189 3630 | f 1883 3631 | f 1933 3632 | f 728 3633 | f 1871 3634 | f 1935 3635 | a 1950 2619 3636 | f 1887 3637 | f 1795 3638 | f 1668 3639 | f 1551 3640 | f 1830 3641 | f 1923 3642 | f 767 3643 | f 396 3644 | f 1853 3645 | f 1516 3646 | f 13 3647 | f 721 3648 | a 1951 7495 3649 | f 573 3650 | f 1386 3651 | f 1865 3652 | f 417 3653 | a 1952 2547 3654 | f 182 3655 | f 1557 3656 | f 1825 3657 | a 1953 4736 3658 | f 1758 3659 | f 1936 3660 | f 1945 3661 | f 1292 3662 | f 1652 3663 | f 1747 3664 | f 1867 3665 | a 1954 1477 3666 | f 1434 3667 | a 1955 5513 3668 | f 1143 3669 | f 285 3670 | f 776 3671 | a 1956 3854 3672 | f 1217 3673 | f 1911 3674 | a 1957 4247 3675 | f 1922 3676 | f 390 3677 | a 1958 7691 3678 | a 1959 4102 3679 | f 1861 3680 | f 1928 3681 | f 1875 3682 | f 1045 3683 | f 1520 3684 | f 1339 3685 | f 1879 3686 | a 1960 1762 3687 | f 1752 3688 | f 892 3689 | f 1812 3690 | f 893 3691 | f 1297 3692 | a 1961 1618 3693 | f 109 3694 | a 1962 7493 3695 | f 1878 3696 | a 1963 1219 3697 | a 1964 2378 3698 | a 1965 4275 3699 | a 1966 2477 3700 | f 1791 3701 | f 510 3702 | a 1967 6621 3703 | f 1330 3704 | f 1514 3705 | a 1968 5856 3706 | f 1253 3707 | f 1808 3708 | f 518 3709 | f 1851 3710 | f 619 3711 | f 1692 3712 | f 1029 3713 | a 1969 4824 3714 | f 1515 3715 | f 354 3716 | f 1106 3717 | a 1970 3180 3718 | a 1971 6495 3719 | f 859 3720 | f 689 3721 | f 1970 3722 | f 794 3723 | f 1901 3724 | f 1218 3725 | f 807 3726 | f 821 3727 | f 283 3728 | a 1972 2364 3729 | f 1691 3730 | f 1413 3731 | f 1955 3732 | f 1703 3733 | f 1714 3734 | f 994 3735 | f 866 3736 | f 1863 3737 | f 1962 3738 | f 1748 3739 | f 1886 3740 | f 1950 3741 | a 1973 6962 3742 | f 144 3743 | f 1929 3744 | a 1974 6738 3745 | a 1975 1158 3746 | f 1173 3747 | f 1425 3748 | f 1526 3749 | a 1976 7169 3750 | f 1905 3751 | f 1638 3752 | f 1482 3753 | f 1601 3754 | f 1443 3755 | f 1063 3756 | f 1896 3757 | a 1977 4955 3758 | f 471 3759 | f 1838 3760 | f 1900 3761 | f 1846 3762 | f 829 3763 | a 1978 8035 3764 | a 1979 6534 3765 | f 986 3766 | f 525 3767 | a 1980 2760 3768 | f 46 3769 | f 1941 3770 | f 1756 3771 | f 650 3772 | f 1956 3773 | f 1975 3774 | a 1981 4492 3775 | a 1982 8104 3776 | a 1983 6077 3777 | f 1963 3778 | f 1779 3779 | a 1984 6039 3780 | f 277 3781 | f 295 3782 | f 1496 3783 | f 1213 3784 | f 1960 3785 | f 1822 3786 | f 1927 3787 | f 1750 3788 | a 1985 4454 3789 | f 1909 3790 | a 1986 1599 3791 | f 1949 3792 | a 1987 2562 3793 | f 667 3794 | f 1145 3795 | a 1988 81 3796 | f 548 3797 | a 1989 4254 3798 | f 24 3799 | a 1990 6810 3800 | f 1082 3801 | a 1991 802 3802 | f 1971 3803 | f 1391 3804 | f 1447 3805 | f 1965 3806 | f 855 3807 | f 1957 3808 | f 748 3809 | f 1755 3810 | f 1961 3811 | f 1986 3812 | f 1828 3813 | a 1992 3000 3814 | a 1993 5171 3815 | f 1932 3816 | a 1994 7568 3817 | a 1995 5264 3818 | f 1367 3819 | f 1076 3820 | f 1910 3821 | f 1847 3822 | f 1537 3823 | a 1996 4581 3824 | f 1402 3825 | a 1997 7484 3826 | f 1977 3827 | f 1504 3828 | f 1893 3829 | f 1969 3830 | f 1375 3831 | f 1988 3832 | f 1964 3833 | f 1952 3834 | f 1958 3835 | f 1944 3836 | f 441 3837 | a 1998 3046 3838 | a 1999 8188 3839 | f 1921 3840 | f 1976 3841 | f 1996 3842 | f 1916 3843 | f 1630 3844 | a 2000 6536 3845 | f 555 3846 | f 1997 3847 | f 1197 3848 | f 593 3849 | f 1435 3850 | f 1959 3851 | f 1089 3852 | f 925 3853 | f 1884 3854 | f 1711 3855 | f 1239 3856 | f 95 3857 | f 1336 3858 | a 2001 513 3859 | a 2002 6740 3860 | f 1798 3861 | f 1790 3862 | f 1595 3863 | f 106 3864 | f 1821 3865 | f 488 3866 | f 1902 3867 | f 1994 3868 | a 2003 6682 3869 | f 789 3870 | f 1587 3871 | f 1934 3872 | f 1666 3873 | a 2004 6569 3874 | f 1974 3875 | f 1499 3876 | f 2004 3877 | f 1787 3878 | f 1972 3879 | f 1123 3880 | f 1544 3881 | f 1954 3882 | a 2005 7122 3883 | f 1981 3884 | f 1967 3885 | a 2006 7186 3886 | f 1982 3887 | a 2007 3289 3888 | a 2008 5410 3889 | f 1890 3890 | f 1912 3891 | f 2007 3892 | f 1814 3893 | f 1908 3894 | f 1720 3895 | f 1839 3896 | f 1670 3897 | f 1631 3898 | a 2009 7653 3899 | f 1776 3900 | f 1990 3901 | a 2010 1353 3902 | f 393 3903 | f 1363 3904 | f 1947 3905 | f 841 3906 | f 511 3907 | f 2009 3908 | f 1654 3909 | f 1951 3910 | f 1991 3911 | f 1715 3912 | f 231 3913 | f 1937 3914 | f 1360 3915 | a 2011 5038 3916 | f 1288 3917 | f 1862 3918 | f 1639 3919 | f 822 3920 | a 2012 7402 3921 | f 1701 3922 | f 1431 3923 | f 1409 3924 | f 1109 3925 | f 1979 3926 | f 1872 3927 | f 1182 3928 | a 2013 4169 3929 | f 641 3930 | a 2014 4240 3931 | f 1966 3932 | a 2015 4864 3933 | a 2016 3231 3934 | f 1149 3935 | f 1826 3936 | f 1564 3937 | f 2011 3938 | a 2017 6204 3939 | f 839 3940 | f 1492 3941 | a 2018 2725 3942 | f 1914 3943 | f 1625 3944 | f 1989 3945 | f 2010 3946 | f 1973 3947 | f 1594 3948 | f 2017 3949 | a 2019 4055 3950 | a 2020 2231 3951 | f 1987 3952 | f 854 3953 | f 1319 3954 | f 903 3955 | f 411 3956 | f 1870 3957 | f 1323 3958 | f 2012 3959 | f 1985 3960 | f 2000 3961 | f 1953 3962 | a 2021 8053 3963 | f 1984 3964 | f 1940 3965 | f 1057 3966 | f 1827 3967 | f 2001 3968 | f 2014 3969 | f 2015 3970 | f 1968 3971 | a 2022 372 3972 | f 1731 3973 | f 45 3974 | f 1983 3975 | f 1942 3976 | f 1513 3977 | f 1476 3978 | f 1946 3979 | a 2023 5446 3980 | f 1531 3981 | f 1898 3982 | f 1709 3983 | f 1993 3984 | f 753 3985 | a 2024 4476 3986 | f 1578 3987 | f 1842 3988 | f 653 3989 | f 1566 3990 | f 512 3991 | f 2006 3992 | f 2013 3993 | f 2023 3994 | f 1998 3995 | f 1815 3996 | a 2025 7225 3997 | a 2026 4383 3998 | f 2002 3999 | f 1352 4000 | f 2003 4001 | f 122 4002 | f 1931 4003 | f 1938 4004 | f 1978 4005 | f 2020 4006 | f 1992 4007 | f 688 4008 | f 1903 4009 | f 2024 4010 | a 2027 5565 4011 | f 2005 4012 | a 2028 7375 4013 | f 127 4014 | f 49 4015 | f 1046 4016 | f 2008 4017 | f 716 4018 | f 758 4019 | f 2028 4020 | f 2018 4021 | f 1925 4022 | f 797 4023 | f 1141 4024 | f 1611 4025 | f 1579 4026 | a 2029 66 4027 | a 2030 1881 4028 | a 2031 6086 4029 | f 1235 4030 | a 2032 4649 4031 | f 377 4032 | f 1948 4033 | f 1850 4034 | f 1357 4035 | a 2033 734 4036 | f 1907 4037 | f 1854 4038 | f 1999 4039 | f 1873 4040 | f 2025 4041 | f 2019 4042 | a 2034 3572 4043 | f 2033 4044 | f 1995 4045 | f 2027 4046 | f 1805 4047 | f 1571 4048 | f 1864 4049 | f 1943 4050 | a 2035 1088 4051 | f 857 4052 | f 1930 4053 | f 2022 4054 | a 2036 4348 4055 | a 2037 6379 4056 | a 2038 691 4057 | a 2039 401 4058 | f 1534 4059 | f 2030 4060 | f 2034 4061 | f 1917 4062 | a 2040 7486 4063 | f 1876 4064 | f 2038 4065 | f 2021 4066 | f 966 4067 | f 2016 4068 | f 1980 4069 | f 655 4070 | f 1018 4071 | f 2032 4072 | a 2041 6632 4073 | f 1166 4074 | f 2037 4075 | a 2042 953 4076 | f 1558 4077 | f 1920 4078 | f 2035 4079 | f 2039 4080 | a 2043 249 4081 | f 2041 4082 | f 2042 4083 | f 1926 4084 | f 2043 4085 | f 2029 4086 | a 2044 7936 4087 | f 2026 4088 | f 1906 4089 | a 2045 2972 4090 | f 2045 4091 | f 2031 4092 | f 2044 4093 | f 2036 4094 | a 2046 3052 4095 | f 1081 4096 | f 2046 4097 | f 1939 4098 | f 2040 4099 | a 2047 2941 4100 | f 2047 4101 | -------------------------------------------------------------------------------- /short1-bal.rep: -------------------------------------------------------------------------------- 1 | 20000 2 | 6 3 | 12 4 | 1 5 | a 0 2040 6 | a 1 2040 7 | f 1 8 | a 2 48 9 | a 3 4072 10 | f 3 11 | a 4 4072 12 | f 0 13 | f 2 14 | a 5 4072 15 | f 4 16 | f 5 17 | -------------------------------------------------------------------------------- /short2-bal.rep: -------------------------------------------------------------------------------- 1 | 20000 2 | 6 3 | 12 4 | 1 5 | a 0 2040 6 | a 1 4010 7 | a 2 48 8 | a 3 4072 9 | a 4 4072 10 | a 5 4072 11 | f 0 12 | f 1 13 | f 2 14 | f 3 15 | f 4 16 | f 5 17 | --------------------------------------------------------------------------------