diff --git a/CloudComputingLabs b/CloudComputingLabs new file mode 160000 index 00000000..68b10498 --- /dev/null +++ b/CloudComputingLabs @@ -0,0 +1 @@ +Subproject commit 68b1049824ce81b2a7104794ef97137233ccc8b4 diff --git a/Lab1/Advanced_version/Makefile b/Lab1/Advanced_version/Makefile new file mode 100755 index 00000000..742d097d --- /dev/null +++ b/Lab1/Advanced_version/Makefile @@ -0,0 +1,8 @@ +CXXFLAGS+=-O2 -ggdb -DDEBUG +CXXFLAGS+=-Wall -Wextra + +all: sudoku_solve + +sudoku_solve: main.cc neighbor.cc sudoku_basic.cc + g++ -o $@ $^ -O2 -lpthread + diff --git a/Lab1/Advanced_version/Makefile.win b/Lab1/Advanced_version/Makefile.win new file mode 100755 index 00000000..db229c01 --- /dev/null +++ b/Lab1/Advanced_version/Makefile.win @@ -0,0 +1,34 @@ +# Project: soudu +# Makefile created by Dev-C++ 5.11 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +OBJ = main.o neighbor.o sudoku_basic.o +LINKOBJ = main.o neighbor.o sudoku_basic.o +LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3 +INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" +CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" +BIN = soudu.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm.exe -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before $(BIN) all-after + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) + +main.o: main.cc + $(CPP) -c main.cc -o main.o $(CXXFLAGS) + +neighbor.o: neighbor.cc + $(CPP) -c neighbor.cc -o neighbor.o $(CXXFLAGS) + +sudoku_basic.o: sudoku_basic.cc + $(CPP) -c sudoku_basic.cc -o sudoku_basic.o $(CXXFLAGS) diff --git a/Lab1/Advanced_version/README.md b/Lab1/Advanced_version/README.md new file mode 100644 index 00000000..f80fdbe8 --- /dev/null +++ b/Lab1/Advanced_version/README.md @@ -0,0 +1,10 @@ +### 动态输入版本 + +**运行方法如下:** + +1.输入./sudoku_solve n 按回车键其中n为线程数目,在不输入n的情况下默认n为2)。 + +2.输入./测试文件名 按一次回车键即可运行,测试文件即为当前文件夹中test开头的文件。 + +3.运行期间可按照 2 中方法动态输入其他需要测试的文件,输入完毕后按回车键等待执行。 + diff --git a/Lab1/Advanced_version/main.cc b/Lab1/Advanced_version/main.cc new file mode 100755 index 00000000..7dec4cb6 --- /dev/null +++ b/Lab1/Advanced_version/main.cc @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "sudoku.h" + +char puzzle[MaxNumPuzzle][128]; +char solution[MaxNumPuzzle][N+1]; +int board[MaxNumPuzzle][N]; +int spaces[MaxNumPuzzle][N]; +bool EndInputFlag=false; + +int total=0;// +int total_solved = 0;//ѾĿ +bool (*solve)(int, int, int*, int*) = solve_sudoku_basic;//basic +int numOfWorkerThread=2;//̵߳ĿĬ˫߳ +pthread_t* WorkThreads; +pthread_t AddTaskToQueue; +long int threadID; + +int nextPuzzleWillSolve=0; +pthread_mutex_t WorkThreadMutex=PTHREAD_MUTEX_INITIALIZER; + +//time + +int64_t start=0; +int64_t end=0; + +const char outputFileName[10]="outfile"; +int64_t now() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +void* read_data(void* args) { //ļ + + char *file_name=(char*)malloc(256*sizeof(char)); + FILE *fp; + while(fgets(file_name, 256, stdin)) { + + if(file_name[0]=='\n') { + EndInputFlag=true; + start = now();//ʼʱ + printf("please wait...\n"); + break; + } + + if(file_name[strlen(file_name)-1]=='\n') file_name[strlen(file_name)-1]='\0'; + + fp = fopen(file_name, "r"); + + if(fp==NULL) { + printf("%s does not exist.please try again\n",file_name); + continue; + } + while(fgets(puzzle[total],1024,fp)) { + // printf("%s",puzzle[total]); + if(strlen(puzzle[total])>=N) { + ++total; + } + } + } + //printf("total:%d\n",total); +} +int recvOnePuzzzle(){ + int currentPuzzleID=0; + pthread_mutex_lock(&WorkThreadMutex); + while(nextPuzzleWillSolve>=total) + { if(EndInputFlag){ + pthread_mutex_unlock(&WorkThreadMutex); + return -1; + } + else{ + sleep(0); + } + } + currentPuzzleID=nextPuzzleWillSolve; + nextPuzzleWillSolve++; + pthread_mutex_unlock(&WorkThreadMutex); + return currentPuzzleID; +} +void* Thread_solve(void* CurThread) { + long int my_CurThread = (long int) CurThread; + + int currentPuzzleID=0; + int *PuzzleHaveSolved=(int*)malloc(MaxNumPuzzle*sizeof(int));//ǰ̳̽id + long int CurThreadHaveSolvedNum=0;//ǰ߳̽Ŀ + + while(true){ + currentPuzzleID = recvOnePuzzzle(); + if(currentPuzzleID==-1) + break; + + PuzzleHaveSolved[CurThreadHaveSolvedNum]=currentPuzzleID; + CurThreadHaveSolvedNum++; + + + int nspaces = input(puzzle[currentPuzzleID],board[currentPuzzleID],spaces[currentPuzzleID]); + + if(solve(0,nspaces,board[currentPuzzleID],spaces[currentPuzzleID])) { + + ++total_solved; + + if (!solved(board[currentPuzzleID])); + //assert(0); + } else { + printf("currentPuzzleID:%d;NoSolution: %s", currentPuzzleID,puzzle[currentPuzzleID]); + } + + for(int j=0; j0) printf(","); + printf("%d",PuzzleHaveSolved[i]); + } + printf("CurThreadHaveSolvedNum: %d\n",CurThreadHaveSolvedNum); + } + return NULL; +} +void outputToFile() { + FILE *fp = fopen(outputFileName,"w"); + for(int i=0; i=2) + numOfWorkerThread=atoi(argv[1]);//빤߳ + + init_neighbors(); + + + WorkThreads = (pthread_t *)malloc(numOfWorkerThread*sizeof(pthread_t)); + + for(threadID=0;threadID +#include +#include + +#include "sudoku.h" + +#include +int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± +//ڶάϱǷھ adjacent[i][j]Ϊtrueʾ[i][j]Ƿ[row][col]ھ +static void mark_adjacent(bool adjacent[ROW][COL], int row, int col) +{ + for (int i = 0; i < NUM; ++i) {//С + adjacent[row][i] = true; + adjacent[i][col] = true; + } + int top = (row/3)*3;// + int left = (col/3)*3; + adjacent[top][left] = true; + adjacent[top][left+1] = true; + adjacent[top][left+2] = true; + adjacent[top+1][left] = true; + adjacent[top+1][left+1] = true; + adjacent[top+1][left+2] = true; + adjacent[top+2][left] = true; + adjacent[top+2][left+1] = true; + adjacent[top+2][left+2] = true; +} +// һάͳƷھӵ± +static void collect_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + int n = 0; + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (adjacent[y][x] && !(y == row && x == col)) { + //assert(n < NEIGHBOR); + myneighbors[n++] = y*COL + x; + } + } + } + //assert(n == NEIGHBOR); +} +//Ϣ +static void print_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (y == row && x == col)//ڷ X + putchar('X'); + else + putchar(adjacent[y][x] ? 'o' : '.');//o ,. + } + printf("\n"); + } + for (int i = 0; i < NEIGHBOR; ++i) { + printf("%2d, ", myneighbors[i]); + } + puts("\n"); +} + void init_neighbors() +{ + for (int row = 0; row < ROW; ++row) { + for (int col = 0; col < COL; ++col) { + bool adjacent[ROW][COL]; + bzero(adjacent, sizeof adjacent);//ÿζҪ + mark_adjacent(adjacent, row, col);//ÿ20ھӣԼ21 81 + + int me = row*COL + col;//õһά± + collect_neighbors(adjacent, row, col, neighbors[me]); + + if (DEBUG_MODE) + print_neighbors(adjacent, row, col, neighbors[me]); + } + } +} + +bool solved(int board[N])//жǷȷ +{ + int (*chess)[COL] = (int (*)[COL])board; + for (int row = 0; row < ROW; ++row) { + // + int occurs[10] = { 0 }; + for (int col = 0; col < COL; ++col) { + int val = chess[row][col]; + //assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int col = 0; col < COL; ++col) { + // + int occurs[10] = { 0 }; + for (int row = 0; row < ROW; ++row) { + int val = chess[row][col]; + // assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int row = 0; row < ROW; row += 3) { + //鹬 + for (int col = 0; col < COL; col += 3) { + int occurs[10] = { 0 }; + ++occurs[chess[row ][col]]; + ++occurs[chess[row ][col+1]]; + ++occurs[chess[row ][col+2]]; + ++occurs[chess[row+1][col]]; + ++occurs[chess[row+1][col+1]]; + ++occurs[chess[row+1][col+2]]; + ++occurs[chess[row+2][col]]; + ++occurs[chess[row+2][col+1]]; + ++occurs[chess[row+2][col+2]]; + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + } + return true; +} diff --git a/Lab1/Advanced_version/outfile b/Lab1/Advanced_version/outfile new file mode 100755 index 00000000..8aa1f537 --- /dev/null +++ b/Lab1/Advanced_version/outfile @@ -0,0 +1,114 @@ +693784512487512936125963874932651487568247391741398625319475268856129743274836159 +<<<<<<< HEAD +======= +574962183913857624682413795765128349231549876498376512359281467827634951146795238 +584762193913458726672913845865129374231547689497386512359271468728634951146895237 +835267194427913658196854372563748921281695743974132586648571239712389465359426817 +857962134942315867613748952391876245284531796765294381536129478429687513178453629 +563279184724861359198354276287436915935187462641925837316542798872693541459718623 +538762194297481365146953782985216473324597618761834529873649251619325847452178936 +752638194941752863386491752463917285298546371175823946519384627827165439634279518 +832756194914832675576491832465978213293614587187523946651349728328167459749285361 +967385124285941763314627598649752381871493256532168947798534612126879435453216879 +635872194782149356194563782469735821328691547517428963241957638856314279973286415 +825943167467218593139756284298364751371529846546187932612495378983672415754831629 +965824137834971265127563498619248753352197846748635912571486329493752681286319574 +542863197987125643136479852269731584451286739873954216725348961398617425614592378 +354672198629518374718943625541396782896721543273854916467239851185467239932185467 +345672198629418375718953624271345986896721453453896712567239841184567239932184567 +537926148819437562264581397143798625975612834628345719791864253486253971352179486 +469725138137689452258341679326854791584197263971263845615438927892576314743912586 +435927168918635742267481395541398627689712534723546819196874253854263971372159486 +463297158789451623125368794651739842937824516248516937372185469816943275594672381 +293547168648291753517638492821475639736912584459863217162384975985726341374159826 +493657128258491763617238594821576439734912685569843217142385976986724351375169842 +439572168278316459651849237912754683847163925563928714195237846386491572724685391 +946352178231786954875194362583467291169238547724915683612879435398541726457623819 +672345198351968247894217563928753614417896325536421789285679431169534872743182956 +925743168468219573137856294289364751371528946546197832612475389793682415854931627 +476532198518947236392618754734156829251489673689273415945821367827365941163794582 +493756128518294367276831495964127853825349716137568249382615974641973582759482631 +425736198618294573379851462234169857957348216186572349893615724741923685562487931 +439572168658314297271896453912758634847963521563421789195237846386145972724689315 +542376198791485236368129457159738642483652971276914583827591364635247819914863725 +475962138918347625362518794734159862291486573586273419649821357827635941153794286 +473952168918647523562318794754169832291483675386275419649821357827536941135794286 +527843169819265374346971825971426583685397412432158796253719648798634251164582937 +824736159375491268619528473796342581153879642248165397961284735432957816587613924 +537246189419837562862591347143789625275614938986325714721968453698453271354172896 +278654139541293768936178452697485321124936587853721694319542876765819243482367915 +586437129249681753137259486762913548451768932398524617975842361814376295623195874 +765238149382419675941567283827956314134872596659341827513724968496185732278693451 +852734169436951287197826354324189576561247938978365412613472895285693741749518623 +632874159478159236195623487583491762967285314214736598349567821726318945851942673 +586234179729618543134759268362471985418592736957386421873145692295867314641923857 +542378169761495238389126457158739642493652871276814593927561384835247916614983725 +748536129529841736631927584257369418386415297914278365872194653493652871165783942 +475386129963512847821479635248961573137258964659743218594127386382694751716835492 +548973126216854973793162854869325741437681295125497638674519382382746519951238467 +549873126216954387378162954967325841483691275125487639634518792892746513751239468 +568749132791283645423165897614378529235914786987526413176492358859631274342857961 +496752138821439567573168249934671825762583491158924673289316754315247986647895312 +285694137941723568673518249538471926724936851196285473862359714459167382317842695 +298467135347215689651839472184372596936154827725986341873591264419623758562748913 +659478132281693745734521698945817326376249851812356974593162487127984563468735219 +527469138431875962896213745183546297759328614264197853342981576615732489978654321 +659487132871623945234591687945718326386249751712356894593162478128974563467835219 +927846135648153927315279648736498512891527364452631879283914756164785293579362481 +927684135648135972315297648756423819891576324432819567283941756164758293579362481 +629748135847153962315269847736482519981576324452931678293814756174695283568327491 +942857136587631492136492857825743961369218574471569328754986213618325749293174685 +285976143193824567476513928632157489954382671718469235561748392347291856829635714 +632875149197324658845619723451962387729583461368147295984736512576291834213458976 +567238149428179635319546872974365218235781496186492357751624983693817524842953761 +237849156186325794459716832692571483874293615315468279761954328943182567528637941 +427386159936715284518942637842569713791238465653174928275693841389421576164857392 +492835167817269543536147289941726835275384691683591472758613924324958716169472358 +389425167421769538567138924675812349918643752234957816192586473746391285853274691 +237458169946721853158369274392145687715986432684273915471632598829517346563894721 +784395162261748593953612748649531827837264951512879634378926415426157389195483276 +897253164246871593351469827173628945425197638689534271534916782918742356762385419 +897452163216873594354169827173628945425791638689534271531946782948217356762385419 +342759168857416293691823745485972631719635482263184957134298576576341829928567314 +592836174873214659614759283951427836246385791387691542768143925425968317139572468 +386425179421976538579138624695812347718643952234597816152789463947361285863254791 +459362178836741925271598643684135792927486531315927864193654287748219356562873419 +829365174741892653365147892936521748258476931174983526493718265582639417617254389 +236984175749615238815732964584176392162593487973428651621357849397841526458269713 +925764183837215694146893257412387569789651432563429871358942716694178325271536948 +625439187387512694194867523561274839279358416438691752712945368943186275856723941 +625437189387912654194865723468291537279358416531674892712549368943186275856723941 +726538194398412765145976823671245938284369517539781642812653479453197286967824351 +459783261763921584281654937174236859395817642826549713632175498517498326948362175 +875346291296781453341952768938274516562819374417635829754163982123598647689427135 +673584291219376485845129763436718952597432618182695374924861537351947826768253149 +937864251254139768186725934375916482618243579429587316541398627893672145762451893 +947368251215794863638125749123487596456932187789516324561879432394251678872643915 +974368251215794368638125974123487695546932187789516423461879532397251846852643719 +567389241189254763432716589643192875871465932295873416328541697716928354954637128 +475389261638172459912465873723958146891746325546213987267891534359624718184537692 +763498251842531967519726384654372819137985642928164573271853496486219735395647128 +459867231762431859813295674246973185587126493391584762138749526624358917975612348 +359476281672318945814529376461897532798235614523641798945782163186953427237164859 +596437281781952634423816975634271598219568743875349126967184352342695817158723469 +359476281682319745714528396461897532897235614523641879945782163176953428238164957 +495368271781425936623719458967541382342687519158293764514832697279156843836974125 +574836291691254783832791645426918537759362418183547962248673159315429876967185324 +543678291791234865862519374416927538357486129928153746635791482284365917179842653 +364895271891472365527361984175629438439518627682743159248137596713956842956284713 +734859261596217438812364579653791842287435916149628357371582694425976183968143725 +739845261542316897681279543198562734325794186476138925214687359953421678867953412 +835976241692314578741258396368547129427891635159623784916782453574139862283465917 +984753261735621984612849753157962438398417526246385197871296345423578619569134872 +649753281837126954152498673584619732276534198913287465498372516321965847765841329 +514976283236485791789213564195624378823597416467831952348159627651742839972368145 +947651283312784965568239741756123498193468527824597136435872619681945372279316854 +654198273981732456723645198815276349376914825492853617538427961147369582269581734 +496178253827635419135294786682759134743861592519342867968527341371486925254913678 +981657234437921658562384197328479561614835729759162483145298376876543912293716845 +893715264721946835654328179436571982217689543589432617362154798948267351175893426 +369178254452639187871524693743852916286941735915367428597286341134795862628413579 +793185264152746839684239517328567491567914328419328675271453986946872153835691742 +987563214124987653356412987671398542295174836843256179439825761562731498718649325 +978531264124968357356472918681793542295184736743256189439625871562817493817349625 +>>>>>>> 6678c777b5e8e6b8a73501cc871fd8ee39d3e51e diff --git a/Lab1/Advanced_version/soudu.dev b/Lab1/Advanced_version/soudu.dev new file mode 100755 index 00000000..a263a0d6 --- /dev/null +++ b/Lab1/Advanced_version/soudu.dev @@ -0,0 +1,92 @@ +[Project] +FileName=soudu.dev +Name=soudu +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=main.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=neighbor.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=sudoku.h +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=sudoku_basic.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Lab1/Advanced_version/soudu.layout b/Lab1/Advanced_version/soudu.layout new file mode 100755 index 00000000..d439834b --- /dev/null +++ b/Lab1/Advanced_version/soudu.layout @@ -0,0 +1,23 @@ +[Editor_0] +CursorCol=24 +CursorRow=77 +TopLine=73 +LeftChar=1 +[Editors] +Order=0,1,2,3 +Focused=0 +[Editor_1] +CursorCol=1 +CursorRow=59 +TopLine=1 +LeftChar=1 +[Editor_2] +CursorCol=22 +CursorRow=4 +TopLine=1 +LeftChar=1 +[Editor_3] +CursorCol=34 +CursorRow=48 +TopLine=23 +LeftChar=1 diff --git a/Lab1/Advanced_version/sudoku.h b/Lab1/Advanced_version/sudoku.h new file mode 100755 index 00000000..a97c32f5 --- /dev/null +++ b/Lab1/Advanced_version/sudoku.h @@ -0,0 +1,31 @@ +#ifndef SUDOKU_H +#define SUDOKU_H + +const bool DEBUG_MODE = false;//ǷмϢ +enum { ROW=9, COL=9, N = 81, NEIGHBOR = 20 };//Ϊ һΧ20ڵķСС +const int NUM = 9;//1~9 + + +extern int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± + +const int MaxNumPuzzle = 1e6; +extern char puzzle[MaxNumPuzzle][128]; +extern char solution[MaxNumPuzzle][N+1]; + +extern int board[MaxNumPuzzle][N]; +extern int spaces[MaxNumPuzzle][N]; +/********************************/ + + +void init_neighbors(); +int input(const char in[N],int board[N],int spaces[N]); +void init_cache(); + +bool available(int guess, int cell,int board[N]); + +bool solve_sudoku_basic(int which_space,int nspaces, int board[N],int spaces[N]); +bool solve_sudoku_min_arity(int which_space); +bool solve_sudoku_min_arity_cache(int which_space); +bool solve_sudoku_dancing_links(int unused); +bool solved(int board[N]); +#endif diff --git a/Lab1/Advanced_version/sudoku_basic.cc b/Lab1/Advanced_version/sudoku_basic.cc new file mode 100755 index 00000000..6ea11534 --- /dev/null +++ b/Lab1/Advanced_version/sudoku_basic.cc @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include "sudoku.h" + +//int board[N];//һάֵΪ +//int spaces[N];//ĿոֵΪе± +//int nspaces;// Ŀո +//int (*chess)[COL] = (int (*)[COL])board;//Ψ̵Ķά + +static int find_spaces(int board[N],int spaces[N])//пո¼ոһά +{ + int nspaces = 0; + for (int cell = 0; cell < N; ++cell) { + if (board[cell] == 0) + spaces[nspaces++] = cell; + } + return nspaces; +} + +int input(const char in[N],int board[N],int spaces[N])//ַתΪһάֵ +{ + for (int cell = 0; cell < N; ++cell) { + board[cell] = in[cell] - '0'; + assert(0 <= board[cell] && board[cell] <= NUM); + } + return find_spaces(board,spaces); +} + +bool available(int guess, int cell, int board[N]) +{ + for (int i = 0; i < NEIGHBOR; ++i) { + int neighbor = neighbors[cell][i]; + if (board[neighbor] == guess) { + return false; + } + } + return true; +} + +bool solve_sudoku_basic(int which_space,int nspaces,int board[N],int spaces[N])//ݹ +{ + if (which_space >= nspaces) { + return true; + } + int cell = spaces[which_space]; + + for (int guess = 1; guess <= NUM; ++guess) { + if (available(guess, cell,board)) { + assert(board[cell] == 0); + board[cell] = guess; + if (solve_sudoku_basic(which_space+1,nspaces,board,spaces)) { + return true; + } + + assert(board[cell] == guess); + board[cell] = 0; + } + } + return false; +} diff --git a/Lab1/Advanced_version/sudoku_solve b/Lab1/Advanced_version/sudoku_solve new file mode 100755 index 00000000..3d2b14df Binary files /dev/null and b/Lab1/Advanced_version/sudoku_solve differ diff --git a/Lab1/Advanced_version/test1 b/Lab1/Advanced_version/test1 new file mode 100644 index 00000000..8d81622c --- /dev/null +++ b/Lab1/Advanced_version/test1 @@ -0,0 +1 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 diff --git a/Lab1/Advanced_version/test10 b/Lab1/Advanced_version/test10 new file mode 100644 index 00000000..7c92edad --- /dev/null +++ b/Lab1/Advanced_version/test10 @@ -0,0 +1,10 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 diff --git a/Lab1/Advanced_version/test100 b/Lab1/Advanced_version/test100 new file mode 100644 index 00000000..c31b7ab8 --- /dev/null +++ b/Lab1/Advanced_version/test100 @@ -0,0 +1,100 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 diff --git a/Lab1/Advanced_version/test1000 b/Lab1/Advanced_version/test1000 new file mode 100644 index 00000000..c21f3fbe --- /dev/null +++ b/Lab1/Advanced_version/test1000 @@ -0,0 +1,1000 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 +000000061050700000200009000000800300401000000600000000000060080030040000020000700 +000000061070005000400030000300000200000100070000800000001600000000070400500000300 +000000061070040000000000000102006000000080300500000000030000740600501000000200000 +000000061070500000000000000900460000050000200000000700601000030300200000000708000 +000000061070500000000400000603050000000200100000000040200006000000039000010000800 +000000061070800000500090000000600300302000000400000000000030040010002000060000900 +000000061200030000000000000000070240060500000000000300005601000300000820000700000 +000000061200030000400000000020801000500600700000000040081000000000070400003000000 +000000061200300000000000000000160000020040000800000300060000740000800200003500000 +000000061200500000800000000000200700037000000060400000100000200000038000000060040 +000000061200500000800000000000200700037000000060400000100000200000068000000030040 +000000061200700000000800000013060000050400200000000700000010050700000400800000000 +000000061200700000000800000013060000050400700000000200000010050700000400800000000 +000000061200800000000000000000402800063000000000700000000036200410000000000010050 +000000061300020000000700000017000000000080500090000000500000380600401000000900000 +000000061300700000090400000710080000000300400000000020000062000500000900000010000 +000000061300800000000000000500000400000014000000070800010620000000500390007000000 +000000061350000000400050000020000800000601000000700000000080200600400000007000010 +000000061400003000000700000010690000020000300000000000304000200000180050700000000 +000000061400030000000500000026000080000070000010000000500200300304000700000100000 +000000061400070000000090000000608200901000000200100000000050400060300000000000090 +000000061400070000020000000061500000000030740500000000005108000700000400000000000 +000000061400200000900000000067015030010070000000000400200800500030000000000000000 +000000061402000000030000000380000400000602000000100000006500000100000070000080300 +000000061403000000020000000308000400000602000000100000060500000100000070000080300 +000000061480000000000000000000520400000030000060000000530006070200000800000107000 +000000061500020000970000000061400000000050900000000080000806000300000500000700000 +000000061700020000000000000060530000010000200000000400000107030208000000400300000 +000000061700400000800000000000720400300000000000010000009800700010000500060000020 +000000061800007000000020000032100000000650800000000000000003720910400000000000000 +000000061890000000000000000000520400000030000060000000530006070200000800000107000 +000000061890000000000000000000520400000030000060000000530006070200000900000107000 +000000061900200000000400000070068030200000700000010000006050000000900200040000000 +000000062800300000000000050040200100060000040000000700001056000700000300000040000 +000000063000100000200000000050000100000400200009006000630090000000200740008000000 +000000063000500004080000000603000700000010500400000020010000200000406000000700000 +000000063020040000000001000040000210000370000000500400503600000000000700800000000 +000000063020040000000001000040000210000370000000500400803600000000000700500000000 +000000063800090000000000010005020400010000000000000200200600500000103070000400000 +000000064005800000000000020160000300000300500020000000000267000309000000000040000 +000000064300800000000000010041000070050008000000900500906000800000010000000000200 +000000064500080000000000010000305700010000040000070000708000200000600800000100000 +000000065000300000000010000000040170509000000000000800270500000010000300000906000 +000000065000710000040000000000053000080000200000000100003200700506000000100800000 +000000065040800000000000001006000800030000700000010000000700230400002000501000000 +000000065900200000000000000000900240053000000000000000060057000100006800000030900 +000000067003900000010000004600004000050010000000000100000800520007000300400000000 +000000067060200000000000040000860300401000000700900000070004000900000200000010000 +000000068030070000100000020070000450000208000000400000000030100200600000000000900 +000000068030070000400000020070000450000208000000100000000030100200600000000000900 +000000068030090000700000020010000350000208000000400000000030100200600000000000500 +000000068100000000000000030060030000000400100008000200400200500730000000000108000 +000000068350000000000010000100000500000800400009000000060205000000400300007000010 +000000068350000000000010000100000500000900400006000000070205000000400300008000010 +000000068900000002000400500041000000000035000050000000000800010300000700000100400 +000000069070000040050800000000507200300100000600000000000030008400060000000000500 +000000069800040000000010000000300800010000400650000000701000200000905000000600000 +000000071000040000600000000000705000200000600000100300087000050010300000000060400 +000000071000052000000000000000008540710400000300000000460070000005000200000300000 +000000071000208000000600000501000000000300200700000000030040600260000000000070050 +000000071000520000000000000000070080300001000204000000500600200000300600070004000 +000000071000580000000000000000031060200400000508000000070006000030000500000100200 +000000071000604000000000000500400600102000050700000000000071000080020000030000900 +000000071000604000000000000500800600102000050700000000000071000090020000030000800 +000000071000800000000300000040000300270000000000500800600070500008060000000010040 +000000071000904000000000000500400600102000050700000000000071000080020000030000900 +000000071002500000000000000780000030000420000000100000050007200004600500300000000 +000000071005020000040000000100300000000009400800000000060000950300710000000800000 +000000071006090000000000050102000000000060300050000000070504000800000600000200400 +000000071020400000500000000080000600000037000000010000000600240300500000109000000 +000000071020400000600000000080000200000037000000010000000200540300500000109000000 +000000071020600000000000000100073000060000200500000000000260400703000050000800000 +000000071020800000000403000700060050000200300900000000600070000080000400000050000 +000000071030020000000000000000000250600100000000080300020000530400601000000700000 +000000071040050000000600000000100600080000500000007003107000060000080200300000000 +000000071050003000040080000030000500200100000600000000000040300700000040100600000 +000000071050008000000000000060040030200170000000300600000002500401000000700000000 +000000071050080000000000000600103000020000890000400000000700200100040000403000000 +000000071050600000200009000000800300407000000100000000000010020030040000020000600 +000000071060005000000000000080000630400170000000200000907020000000003800000000500 +000000071060020000000030000700060300400000200100400000000105080020000000000700000 +000000071060020000000030000700060300400000200100400000000705080020000000000100000 +000000071060020000300000000050000260000108000000300000000430500108000000007000000 +000000071060030000000020000700060300400000200100400000000105080020000000000700000 +000000071060030000000020000700060300400000200100400000000705080020000000000100000 +000000071060300000500000000000040050007010000020000600000500900400600000801000000 +000000071060500000000000000005040600030000200000007000000800540107300000200000000 +000000071080300000000200000407020000000600800100000300500070040030000600000000000 +000000071080400000000500000100072000050000630000000000000380400207000000600000000 +000000071090800000000000000400300600701000050000902000060000300500070000000000900 +000000071200050000030060000701300000000000640800000000000107000040000500000002000 +000000071200300000860000000000500630004200000700000000000071000050000800000040000 +000000071200600000300000000000510007604000200000008000050000040000200600010000000 +000000071200900000000000000000600830071400000500000000640000200000050600000007000 +000000071300200000000000000000060300010030000004000000600000540000407200800100000 +000000071300200000000400000000078040200000300050010000400000500007060000000500000 +000000071300500000000000000000308500002600000070000000000070320800050000010040000 +000000071300500000600400000000072000080010000400000000070020000000300600000000540 +000000071300800000080000000005041000020000300000070000601000040000200600700000000 +000000071400030000000200000020700000000040300000000500000102060308000400500000000 +000000071400080000000000000000170050820000000300000000001703000600000800000500400 +000000071400500000600000003050037000200000800000010000000800040000400200010000000 +000000071400900000300500000000300450070060000000000900000072000080010000500000000 +000000071500020000000800000047000000000090600010000000600000250700103000000400000 +000000071500030000000600000600000800200400000000702000000080300041000000070000020 +000000071500400000300000000400306500010000060000200000080000200000017000000080000 +000000071580000000030900000407200000000000810060000000200000500000067000000010000 +000000071600040000000000000087500000000020900010000000300800600406000020000100000 +000000071600200000800000000070031040000600500200000000030070000000500600000000200 +000000071600200000900000000400650300010000080000400000070081000020000600000000000 +000000071600500000040000000502600030000900600070000000000013000800000900000070000 +000000071600500000200000000340010000000070620000000500000600300080400000010000000 +000000071600500000300400000000072000080010000400000000070020000000300600000000540 +000000071800020000300000000076500000000030200010000090400600800050100000000000000 +000000071800030000000000000670200000000090300000000500020701000500000830000400000 +000000071800040000000000000070200000030000800000090400000701030400500600900000000 +000000071800040000000000000670200000000090300000000400020701000300000840000500000 +000000071800300000400050000670000500000012000000400000002000050000800400010000000 +000000071900000060020000000004070000030000400000910000700600008000300200100000000 +000000071930000000000000000000620400000030000070000000650007080200000900000108000 +000000072000051000000000000000060180720300000400000000300200000000400600008000500 +000000072006800000000000050170000300000400800020000000000217000309000000000050000 +000000072010000000000060000000700510902000000400000000000510600300000009000807000 +000000072080500000010000000200097000000000100300000000703000060000180500000400000 +000000072080500000010000000200097000000000800600000000703000060000180500000400000 +000000072080600000010000000400097000000000800300000000703000040000180600000500000 +000000073200500000000000610003100000000900040800000700000086200010000000000030000 +000000074002800000000000003070530000600000010000000200540000600000071000700000000 +000000074010030000000000080000010520700600000400000000053000100000708000000000200 +000000074010030000000000080000010520700600000400000000053000100000807000000000200 +000000074150000000000000008010000230600048000000070000200500100000300000004000000 +000000074200050000000000001000104030500000600008700000000390800010000000000000200 +000000074500100000000000009800009500000040000000000010070200600000080300040700000 +000000075320000000000000008010000240600058000000070000200400100000300000005000000 +000000075400060000000000010002105000000700040600000300000390800010000000000000200 +000000075400060000000000010002105000000700040900000300000390800010000000000000200 +000000075400060000000000010003105000000700040600000300000390800010000000000000200 +000000075400060000000000010003105000000700040900000300000390800010000000000000200 +000000075620000000000000008010000240300058000000070000200400100000300000005000000 +000000076060200000000000050000860400501000000700900000030005000900000200000010000 +000000076400900000000000080008070000000200400090000300200000530000006001000080000 +000000078500200000000000600067000050080000020000300400300000102000070000000006000 +000000078500300000000000010400070200000018000030000000060400500000000430001000000 +000000078600000050000040000058000000000001300040000000300600100000250000000700400 +000000079030080000500000020080000560000209000000400000000030100200700000000000400 +000000079030080000500000020080000560000209000000400000000040100200700000000000400 +000000081000090030700004000000200600030800000010000000000010403500600000200000000 +000000081000090040700005000000300600040800000010000000000010504300600000200000000 +000000081000409000000200000060081000004000230000000000380070000200500900000000000 +000000081000602000300700000604000700000090010700000000500400200010080000000000000 +000000081020030000000000000000060320700450000100000000500708000060000200000100000 +000000081020040000000700000000050620300090000100000000040300200500008000000100000 +000000081020300000000000000109000040000200500800000000000580200070000300600010000 +000000081020300000040006000000600420801050000000000700000400200500080000000000000 +000000081020300000700000000040000700000018000000050000000600230500400000106000000 +000000081020500000000000000400031000700000200060000000000260500103000040000700000 +000000081020600000400000000090000200000038000000010000000500720300400000105000000 +000000081020700000000000000000900250800000030400000700600018000050000300000040000 +000000081020700000000403000100060050000200300500000000800010000040000700000050000 +000000081020700000000403000100060050000200300500000000800010000070000400000050000 +000000081020700000500000000060000200000038000000010000000600740200500000103000000 +000000081020700000500000000090000400000038000000010000000600240300500000106000000 +000000081030005000000000000500074600109000000000000000080000370600910000000200000 +000000081030005000000000000500074600901000000000000000080000370600910000000200000 +000000081030020000000700000000050620400090000100000000020400300500008000000100000 +000000081030020000000700000000050620400090000100000000060400300500008000000100000 +000000081030200000000000000108060040000700300600000000500300700090000200000010000 +000000081030200000000000000108060040000900300600000000500300700070000200000010000 +000000081030200000500000000000600230100400000700000000400070000000010800060000300 +000000081030500000000020000100007000000080500050000400600100070000403000800000000 +000000081030500000000020000100009000000080500050000400600100070000403000800000000 +000000081030600000000020000500007000000080600060000400100500070000403000800000000 +000000081030600000000020000700009000000080600060000400100500070000403000800000000 +000000081040300000020006000000600420801050000000000700000400200500080000000000000 +000000081050600000200009000000700300408000000100000000000010070030040000020000600 +000000081060020000300000000050000260000107000000300000000430500701000000008000000 +000000081060500000300000000500028000070000400000010000000600730002400000100000000 +000000081060500000700000000200600500008000020100300000040021000050000600000000000 +000000081060700000000200000040000600000083000000000020000502700308040000100000000 +000000081070600000300000000400018000030000500000020000000500760002400000100000000 +000000081070600000300000000400028000030000500000010000000500790002400000100000000 +000000081080000020300000000016000000000500600090200000000091000500000300400080000 +000000081090005000000000000070000630400810000000200000201060000000003500000000700 +000000081090005000000000000070000630400810000000200000201060000000003700000000500 +000000081090300000000200000708040000000600900100000300500080040030000600000000000 +000000081100060000070050000009000760000102000000800400000300500800000020000000000 +000000081200060000000000000048500000000020300010000000500000670000103000700400000 +000000081200060000000700000000408070630000000000100000004000600000050200018000000 +000000081200400000000000000000230700010000050008600000700000400090080000000050200 +000000081200500000030000000020406000001000070000200000008010000000030200700000400 +000000081200500000030000000020406000008000070000200000001080000000030200700000400 +000000081200600000000000000089010050000403200000000600400000700000250000000080000 +000000081200700000000000000000230700010000050008600000700000400030080000000050200 +000000081200700000000000000000230700010000050008600000700000400040080000000050200 +000000081200700000000000000000230700010000050008600000700000400090080000000050200 +000000081200700000000500000000080650400010000500000700060300000089000000000000400 +000000081200700000960000000000500630004200000800000000000081000050000900000040000 +000000081230000000040700000000600370005300000100000000400000200000058000000010000 +000000081250000000060700000000500670004200000100000000300000900000048000000010000 +000000081300020000000700000048000000000060200010000000600000350700504000000100000 +000000081300200000000074000200000560700010000000009000000800200014000000090000000 +000000081300600000090400000680070000000300400000000020000012000500000300000080000 +000000081360000000040700000500000300000021000000080000002000010000400600400300000 +000000081400300000300050000190000500000028000000600000082000050000400700000000000 +000000081400300000300050000190000500000028000000600000082000050000700400000000000 +000000081400300000300050000190000500000082000000600000082000050000400700000000000 +000000081400300000300050000190000500000082000000600000082000050000700400000000000 +000000081400300000300050000610000500000082000000700000002000050000600400080000000 +000000081400300000300050000680000500000012000000700000002000050000600400010000000 +000000081500400000073000000000028000060000300000010000000600740200500000100000000 +000000081600002000000700000500000360800100000000400000000060200047000000010030000 +000000081600030000000200000020800000000040300000000500000102070304000600500000000 +000000081600040000000230000400000050300700000000100000000050300010000200087000000 +000000081600070000000000000000801040702000000300400000200000700000060300080500000 +000000081600070000000000000000805040702000000300100000200000700000090300080500000 +000000081600200000000000000010089000503000200000000600000300570240000000080000000 +000000081600400000500700000012000000080090000000500000000010050030000600700000400 +000000081600500000040000000502700030000600700080000000000013000900000600000080000 +000000081690000000040300000508200000000000910070000000300000600000018000000070000 +000000081700050000020000000601200000080000040000090300300004000200000500000800000 +000000081700060000000000000400507000600000720000100000058200000000030200010000000 +000000081700200000200000000000510030050040000600000800000700900003006000010000000 +000000081700300000400050000610000500000082000000400000002000050000700400080000000 +000000081700400000000200000400000300005010000000090000010350000200000640000000700 +000000081700600000300500000000082000090010000500000000080040000000300700000000650 +000000081700600000500000000040081000000000290000030000000504700600200000080000000 +000000081900400000700600000082000000010050000000700000000080050030000900600000400 +000000082000031000000000000080420000400000100000500000601000300000200050700000600 +000000082000031000000000000080420000700000100000500000601000300000200050400000700 +000000082005060000010000000090302000000100500800000040600040000300000001000000300 +000000082040600000010000000200098000000000100300000000803000070000410600000500000 +000000082500006000000000090600000300000920000000000040000053100090600000008000700 +000000082500300000000000000300072000400000630000010000000800500081000000020000007 +000000082600400000000000000400072000500000430000010000000800600081000000020000007 +000000083000014000000200000000320000090000400000700000000006150308000000200000600 +000000083000030010070000000000204000030000600000010000200600405000500700100000000 +000000083020100000000000040000610200800000900004000000060300500100000070000008000 +000000083020700000000000040000610200800000900004000000060300100500000070000008000 +000000083040300000000500060300000400000700500208000000050060100000002000000080000 +000000083400020000000000510002300000700000600000100040000075200010000000000800000 +000000083500400000000100000000020700100000400000008000038600000020070000000000520 +000000083900100000000000020100009700020080000000000100005700400003000060080000000 +000000084000100000200000000000600130408000000050000000560000200000080007010030000 +000000084000510000000030000400000200300008000000600070000200403076000000000000100 +000000084050010000000000050000030620800200000400000000073000100000508000000000900 +000000084100600000000000000000040103030020000500000600048000020000701500000000000 +000000084600010000000000000500000106000800300070200000087000020000063500000000000 +000000084750000000000000009010000730600049000000080000200500100000300000004000000 +000000085004070000000000030100060700570000100030800000006200000000503000000000000 +000000085200030000000000030040010600058000000000700000700400100000500200000008000 +000000085760000000000000009010000640300059000000080000200400100000300000005000000 +000000086320000000000000009010000250700069000000080000200500400000300000006000000 +000000087004010000000000030100060500570000100030800000006200000000703000000000000 +000000087004050000000000030100060500570000100030800000006200000000703000000000000 +000000091000020000000400000507000200100900000860000000040000080090001000000070300 +000000091000030000000500000608000300200900000170000000050000020090001000000080400 +000000091002080000040700000050061400000090000300000000000300750900000000000200000 +000000091020400000000000000000380200700090000000000400040500600900010070000200000 +000000091020700000600000000080000500000039000000010000000600840300500000107000000 +000000091030600000000020000700008000000090600060000400100500080000403000900000000 +000000091060005000000000000080000630400910000000200000201070000000003500000000800 +000000091060005000000000000080000630400910000000200000201070000000003800000000500 +000000091060070000000000000005030760000000200100000000300100004082000000000409000 +000000091060070000000000000005030760000000300100000000300100004082000000000409000 +000000091070020000000004000000380000040000900000100000300000640000005700100800000 +000000091070080000000000000006040870000000300100000000400100005032000000000509000 +000000091080040000400000000000720500801000060900000000020000300000601000000900000 +000000091080200000000000000930000800000014000000500000104000070000600200000380000 +000000091080600000000030000000700260500400000100000000030050800000019000400000000 +000000091080600000000030000000700280500400000100000000030050800000019000400000000 +000000091200050000000000000500000240700800000060100000089400000000060300010000000 +000000091200400000030000000060507000009000080000200000001090000000030200800000400 +000000091200600000000000000040010600000039000070000200000400570300800000100000000 +000000091200800000600000000040091000000000250000030000000604800700500000090000000 +000000091300040000500600000007200600090000080000300000200000500000091000000080000 +000000091300200000000085000600000270800040000000001000000600500049000000010000000 +000000091400070000000000000700300000800000400000106000019500060000040700200000000 +000000091400070000000000000700300000800000400000106000019500060000040800200000000 +000000091400300000000000000000219000200000850000060000090000060000400700300000400 +000000091400300000300050000710000500000092000000600000092000050000400800000000000 +000000091400300000300050000790000500000012000000600000012000050000400800000000000 +000000091500080000200000000000720600010300000090000000640100000000000520000000800 +000000091500200000300000000080700040090000600000500000200060500010090000000003000 +000000091600300000070000000400000500000029000000010000000500680310000000020800000 +000000091600700000200000000700000010000600500000450000030081000040000600005000000 +000000091600700000800000000040091000000000250000030000000604800200500000090000000 +000000091600700000800000000040091000000000250000030000000604800700500000090000000 +000000091603000000500000000090100040000002300700000000300000700000410000000980000 +000000091630000000000000000019080000000020400000000600200600300000703050000400000 +000000091630000000000000000051080000000020400000000600200600300000703050000400000 +000000091630000000000000000091080000000020400000000600200600300000703050000400000 +000000091700000030000200000090010080005000600200000000080090000000600400000700200 +000000091700030000200500000600000200040900000000000000500008040090001000000020300 +000000091700030000200500000600000200040900000000000000500008040090001000000060300 +000000091700400000000030000000651000200000370000000000000800200054000000310000000 +000000091700400000000380000000500800029000000010000000600002000000060010500000300 +000000091700400000200000000500290000000080010040000600081000400000700300000000000 +000000091700800000200000000000510030020040000600000900000700600003006000010000000 +000000091700800000200000000000510030050040000600000900000700200003006000010000000 +000000091700800000200000000000510030050040000600000900000700800003006000010000000 +000000091700800000200000000000510030070040000600000900000700200003006000010000000 +000000091700800000600000000040091000000000250000030000000604700200500000090000000 +000000091800200000000400000060017030200000600000090000001050000000800200040000000 +000000091800200000200000000000510030050040000600000900000700800003006000010000000 +000000091800300000300050000470000500000092000000600000002000050000800400090000000 +000000091800700000200000000000510030090040000600000900000200800003006000010000000 +000000092010400000000000000030100400100060000000020007000500830209000000600000000 +000000092700000010000300000090020080005000600300000000010090000000600400000700300 +000000093000014000000200000000320000040000500000800000000007160309000000200000700 +000000093480000000010000000503000060000010800000000000170000400000902000000300005 +000000094000400070100000000208000600000750000000000100030060500047000000000002000 +000000094030090000000000060070000820200600000000004000000750300906000000000000100 +000000096200030000000000030050010700069000000000800000800400100000600200000009000 +000000097000050000000040000107200000040000300000900000600701000030000450000000800 +000000097300400000000000020600098100400007300000020000072000000000100000080000000 +000000100000300000900000000700100600200000090000500000008020040010006005050090000 +000000100000500000200000000035400000000010700080000200004000059600002000000070030 +000000100000500000200000000035400000000010700080000200004000059600070000000002030 +000000100000500000200000000035400000000010800070000200004000095600008000000020030 +000000100000500000200000000035400000000010800070000200004000095600020000000008030 +000000102000000340005080000360000000000090050010000000100403000007000600000100000 +000000102000300500000608000000400030200050000100000000000070200080010000030000060 +000000102000300500000708000000400070600050000100000000000040600070010000030000040 +000000102000300600000408000000500040200060000100000000000070200050010000040000030 +000000102000300600000709000000400030200050000100000000000080200040010000030000070 +000000102000300600000809000000400080200050000100000000000070200080010000030000060 +000000102000300700000409000000500040200060000100000000000080200090010000040000030 +000000102000300700000809000000500080200060000100000000000010600080040000030000070 +000000102030000400000700500080000030000015000000020000000300064201000000900000000 +000000102040700000300500000008001000600000070000020000002000600000600300010070000 +000000102080300000000000500000690080001000000500000000060000470000201000700050000 +000000102400050000000000900060070080001000000000300000000001460320000050000900000 +000000102500600000000000000023000700000405000010000300000170000000020080800000040 +000000102700050000000000800060070040001000000000300000000001460320000050000800000 +000000102700050000000000900060070080001000000000300000000001460320000050000900000 +000000102700400000000000800300000640400009000000010000012600000000500030090000000 +000000102900050000000000800040060070001000000000300000000001460320000050000800000 +000000102900050000000000800060070040001000000000300000000001460320000050000800000 +000000103000400500670000000000020070300000000001000000000063400007500000020000080 +000000103020090000000000400000025080010000000400000000300104000008000020000700600 +000000103020400000000670000070000400000001000000000070000240060301000500800000000 +000000103080020000000004500030000020000500070000100000100300600700080000005000000 +000000103800050000000000700060020040001000000000300000000001460420000050000700000 +000000103800600000200000700000406080010000000000700000008003000030010000400050000 +000000103900050000000000700060020040001000000000300000000001460820000050000700000 +000000103900050000000000800060020070001000000000300000000001460720000050000800000 +000000104000003600000050002503000000200600000000100080000070230010000000000400000 +000000104000010800600700000391000000080500000000200000506000070400080000000000000 +000000104000060000000050000200430000000107000600000800010500000070000040000000023 +000000104000080300040050000000200070300000600001004000870000050000300000000100000 +000000104000702000000000000460010000000500070100000000000380600027000030004000000 +000000104000802000000000000460070000000600080100000000000340700028000050009000000 +000000104080900000000000500000702080001000000500000000000530600020000030400010000 +000000104702000000000000000000705020300600000010000000200000630050014000000080000 +000000104800070000000000600700200000000104000030000080012000000000050030604000000 +000000104800090000000000600700200000000401000030000090012000000000050030604000000 +000000105000700400700200000000500080403000000061000000500000020040060000000010000 +000000105002000600030800000100000400000308000000200000570000030400060000000010000 +000000105002600000000902000300000090000070800000010000710000500000200040080000000 +000000105004070000000000300150300000000600080020000000000051200006000070800000000 +000000105030800000000000000000012000060000030000000700102000400500360000000700080 +000000105030800000000000600020030000500006000000000270601000004000200030000070000 +000000105200007000000030600009000400010500000000002030300000070000980000000100000 +000000105200800000000000300000071000000004800300050000000300026004000050010000000 +000000105300040000000000000000080720905600000000000040020000800000100030000509000 +000000105302000000000000000000206030710000000000300000400000820070015000000090000 +000000105802000000000000000000406030200300000010000000400000720060015000000090000 +000000105802000000000000000000406030400700000010000000300000720060015000000090000 +000000105802000000000000000000806020300700000010000000400000730060015000000090000 +000000105802000000000000000000806020400700000010000000200000730060015000000090000 +000000105802000000000000000000806030300700000010000000400000720060015000000090000 +000000106000025000300000000009100400000400000000000020520000080000630700000007000 +000000106020000500000082000010000200000040030000500000703000040400600000000001000 +000000106020070000800000500097000030000500040000100000000020780100600000000000000 +000000106020070000900000500078000030000500040000100000000020780100600000000000000 +000000106030070000400000500078000020000500040000100000000020780100600000000000000 +000000106030070000900000500078000020000500040000100000000020780100600000000000000 +000000106040700000000500300070000450600010000000000000000450020300000080100000000 +000000106040800000000500300070000450600010000000000000000480020300000090100000000 +000000106200005000000000800320000070000010000000800000071000400000023050000600000 +000000106302000000000000000000207030400800000010000000500000840070016000000090000 +000000106302000000000000000000507030500800000010000000200000840070016000000090000 +000000106390000000000000500000610200870000000000500000000407030001050000000000080 +000000106402000000000000000000207030500800000010000000300000840070016000000090000 +000000106402000000000000000000507030500800000010000000200000840070016000000090000 +000000106402000000000000000000507030500800000010000000300000840070016000000090000 +000000107000001300800040000500300000006000040200000000000200050010000200030700000 +000000107000001300800050000200300000006000050400000000000200040010000200030700000 +000000107000025000300000000004100600000400000000000020520000090000730800000008000 +000000107000500300000602000800000026600000040000010000410000700000200000030000000 +000000107000800300800200000000700090403000000061000000500000020090060000000010000 +000000107000800400200300000000700090504000000061000000300000020090060000000010000 +000000107000800400800300000000700090504000000061000000300000020090060000000010000 +000000107000902000000500600900000850000010000400000000007400020010000030060000000 +000000107020030000000000600000040020700600000100000000040200050008000300000105000 +000000107024000000000500600030000050000100400900000000000039020700000008001000000 +000000107040080000900000600028000030000600050000100000000020890100700000000000000 +000000107040080000900000600082000030000600050000100000000020890100700000000000000 +000000107090020000000000004000401500020003060000700000000090030400800000100000000 +000000107400200000080300000200000480000076000000000000567000000000400030001000000 +000000107400200000100000000098000050070000006000100000000095300000070400000000020 +000000107830000000000060400600200050000107000000000000071400000000050680000000000 +000000107900020000000000800000701500400000030000900000000340060008000020010000000 +000000108000008300700040000500300000006000040200000000000200050080000200030100000 +000000108000008300700050000200300000006000050400000000000200040080000200030100000 +000000108000407000000500300040000620000010000020000000701000050000200070300000000 +000000108000600400200300000000800090504000000071000000600000020090070000000010000 +000000108000605000000400300040000620000010000020000000106000050000200070300000000 +000000108009400000000300700600000040000020000000010000370005000010000200000600080 +000000108040200000000600000020400030700010500000000000100080000000000340000000026 +000000108050400000000200000020500030700010600000000000100080000000000350000000042 +000000108200300000600000000010054000000000020000008000000230040080000500700600000 +000000108200700000000000300500000090000038000020010000010000400000500020007600000 +000000108300060000000000500900000600000800020000401000085000001000030070040000000 +000000108400200000100000000089000050070000006000100000000075300000080400000000020 +000000108500040000000000700030050020001000000000200000000001360820000040000700000 +000000108500200000000000400900000050000340000000060200000605070041000000000000030 +000000108600200000000000400200000050000340000000070300000605020041000000000000030 +000000108600300000200000000010058000000000020000001000000230040080000900700600000 +000000108700400000000000000000038600400000070000010000000500064035200000010000000 +000000108900040000000000700030050060001000000000200000000001350820000040000700000 +000000108900040000000000700050060030001000000000200000000001350820000040000700000 +000000109000200300040070000070000080000300000000100000203000600000004050100080000 +000000109000400200000508000000300080100000040200000000060000730430000000000010000 +000000109000807000000500300040000620000010000080000000701000050000400070300000000 +000000109040200000030000400600405020100000000000700000000000870000019000000060000 +000000109200600000000050400000010500000700030300000000000802060014000000000000070 +000000109300400000000000200027006000000800500009000000510020000400000030000090000 +000000109400050000000020300000109000500007000000300000013000000080000040009000020 +000000109400050000090020000000401700060000000000700000000060020700300000801000000 +000000109700008000000000000360000080010590000000000020000140600205000000000900000 +000000109700400000000000000000039600400000070000010000000500084035200000010000000 +000000120000040700030007000057000008000410000000200000000000053400600000100000000 +000000120063000000000000000040000503100208000000700000500000080002600000000030400 +000000126000850000000000004000300700400001000105000000070000380000046000000000000 +000000126000950000000000004000300800400001000105000000030000790000046000000000000 +000000130000080005420000000600000020005010000000000400070402000000600200000000001 +000000130020400000000000000000600025700080000100000000000016700005200000040000300 +000000130040020000000000000000000026700900000100000000062050004000107300000800000 +000000130047000000050000000100302000000050007000000040800000200000603000000740000 +000000130200600000700500000040010300000200050010000000500000007000084000000030000 +000000130400070000800000000000506200700300004000100000000080076015000000000000000 +000000130800600000200500000040010300000200050010000000500000008000074000000030000 +000000135608000000000000040030400010000027000050000000200000706000000200000300000 +000000135608000000000000040050400010000076000030000000200000706000000200000300000 +000000135807000000000000040030400010000076000050000000200000706000000200000300000 +000000136087000000000000050000740900360000000000000000004080200600305000000000000 +000000140090020000000000000000107400950000000000400000001000302000090050800600000 +000000140090020000000600700401000000000580000300000000080000502000001030000400000 +000000140400000600000500000000305008200700000106000000050000083600010000000000000 +000000150080020000000000000000501400870000000000400000001000320000080007500600000 +000000150900700000000000030042000700001030000050000000200600800300400000000050000 +000000160000009500000040000041020000000300600080000000700000024300900000000000008 +000000160020700000000000900600010000000040002030000000100000470000300005800200000 +000000160040020000000009070300100000000000402600000000000630500029000000000800000 +000000160200040000000000708000530020007000050010000000300006400000107000000000000 +000000160200070000300000800000608900420000000000500000000010002008000050060000000 +000000160200070000300000800000608900420000000000500000000040002008000050060000000 +000000160800400000000000700000070600010030000200000050000208000076000000000500004 +000000170000004600000050000051020000000300700080000000700000025400900000000000008 +000000170020900000000000600600010000000040002030000000100000460000300005800200000 +000000170030040000000000600600100000000006030005000004000650200740000000000800000 +000000170040800000000000002000500048200070000100000000000010260080600000000000300 +000000175049600000000000000500000300100090000000420000020000049300001000000000000 +000000180000205000000003000010080000000600002003000000000040710600000300200500000 +000000180300500000000000020061000000000300400008000000710000300000086005000020000 +000000180300900000000000020068000000000300400001000000710000300000086005000020000 +000000190300400000000000020071000000000300500009000000810000400000097006000020000 +000000201000020500080004000000230000090000040000500000602100000500000300000000070 +000000201000080400300050000000204000500000070000600000004100002020000600000000030 +000000201000370000000000000430010000000002600080000070000800530001000020700000000 +000000201004030000000000000370000080600200000000500000540000600000070040002001000 +000000201005090000038000000120400000000030080700000000000000430000201000000600000 +000000201005090000038000000120400000000030080700000000000000530000201000000600000 +000000201009050000400700000600102000000000030000800000000040690710000000000030000 +000000201030070000000400800000050040801000000006000000200801000050000700000000090 +000000201040030000000006000600072000030000040000100500201800000000000730000000000 +000000201060400000003000000200070100500020000000000060100000500000308000000600040 +000000201070300000000000000060000030000205000000041000005780060100000400200000000 +000000201080050000000000000600201000000500740000300000000084050302000000100000000 +000000201080300000000000000060000030000205000000041000005780060100000400200000000 +000000201080400000000700000000540080302000000100000000500032600070000040000000000 +000000201090004000030000000000008530700000400100000000200670000000020800000100000 +000000201090030000000000004006000530300400000000100000000090080204000000170000000 +000000201090400000000300000170020000000008600000000050208000500000900040006000000 +000000201096000000000000500000090040200030000100000000070502000000006083000100000 +000000201500300000000070000000500030020004000076000000000000350000021000800000400 +000000201600300000700000000008540000020000030000600700010082000500000060000000000 +000000201730000000600040000000060030008000500200000000001200000000508000060000070 +000000201800000900000400000000610030270000000900000000090072000001000040000800000 +000000203006400000000000500100600070820000000000830000000059000050002000000000040 +000000203010700000000000000000023400090060000800000000000800019600900070200000000 +000000203080700000000000100005000040300010000000000600000407060100000080200500000 +000000203800600000000000700002000100040800000000300060000027040300000005000010000 +000000204000001000000080000020400500000030700000000080100200006806000010000700000 +000000204001000000050000000006500080200009000000000010000150700940000300000800000 +000000204050030000000000690000850010206000000900000000000206000130000000000400000 +000000204050700000680000000300000090000014000000020000201000000000800050000600700 +000000204100900000000000007670300000000100830040000000000025000500000090000040000 +000000204100900000000000008680700000000100730040000000000025000500000090000040000 diff --git a/Lab1/Advanced_version/test20 b/Lab1/Advanced_version/test20 new file mode 100644 index 00000000..51572ddf --- /dev/null +++ b/Lab1/Advanced_version/test20 @@ -0,0 +1,20 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 diff --git a/Lab1/Advanced_version/test200 b/Lab1/Advanced_version/test200 new file mode 100644 index 00000000..0724da84 --- /dev/null +++ b/Lab1/Advanced_version/test200 @@ -0,0 +1,200 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 diff --git a/Lab1/Advanced_version/test30 b/Lab1/Advanced_version/test30 new file mode 100644 index 00000000..159fa02e --- /dev/null +++ b/Lab1/Advanced_version/test30 @@ -0,0 +1,30 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 diff --git a/Lab1/Advanced_version/test50 b/Lab1/Advanced_version/test50 new file mode 100644 index 00000000..0c691fc1 --- /dev/null +++ b/Lab1/Advanced_version/test50 @@ -0,0 +1,50 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 diff --git a/Lab1/Advanced_version/test500 b/Lab1/Advanced_version/test500 new file mode 100644 index 00000000..768cc5cd --- /dev/null +++ b/Lab1/Advanced_version/test500 @@ -0,0 +1,500 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 diff --git a/Lab1/Basic_version/Makefile b/Lab1/Basic_version/Makefile new file mode 100755 index 00000000..742d097d --- /dev/null +++ b/Lab1/Basic_version/Makefile @@ -0,0 +1,8 @@ +CXXFLAGS+=-O2 -ggdb -DDEBUG +CXXFLAGS+=-Wall -Wextra + +all: sudoku_solve + +sudoku_solve: main.cc neighbor.cc sudoku_basic.cc + g++ -o $@ $^ -O2 -lpthread + diff --git a/Lab1/Basic_version/Makefile.win b/Lab1/Basic_version/Makefile.win new file mode 100755 index 00000000..db229c01 --- /dev/null +++ b/Lab1/Basic_version/Makefile.win @@ -0,0 +1,34 @@ +# Project: soudu +# Makefile created by Dev-C++ 5.11 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +OBJ = main.o neighbor.o sudoku_basic.o +LINKOBJ = main.o neighbor.o sudoku_basic.o +LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3 +INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" +CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" +BIN = soudu.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm.exe -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before $(BIN) all-after + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) + +main.o: main.cc + $(CPP) -c main.cc -o main.o $(CXXFLAGS) + +neighbor.o: neighbor.cc + $(CPP) -c neighbor.cc -o neighbor.o $(CXXFLAGS) + +sudoku_basic.o: sudoku_basic.cc + $(CPP) -c sudoku_basic.cc -o sudoku_basic.o $(CXXFLAGS) diff --git a/Lab1/Basic_version/README.md b/Lab1/Basic_version/README.md new file mode 100644 index 00000000..eaa09f8d --- /dev/null +++ b/Lab1/Basic_version/README.md @@ -0,0 +1,6 @@ +### 线程动态分配版本 + +**运行方法如下:** + +1.输入./sudoku_solve n 按回车键(其中n为线程数目,在不输入n的情况下默认n为2)。 +2.输入./测试文件名 按两次回车键即可运行,测试文件即为当前文件夹中test开头的文件。 \ No newline at end of file diff --git a/Lab1/Basic_version/main.cc b/Lab1/Basic_version/main.cc new file mode 100755 index 00000000..4b5dfae3 --- /dev/null +++ b/Lab1/Basic_version/main.cc @@ -0,0 +1,155 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "sudoku.h" + +char puzzle[MaxNumPuzzle][128]; +char solution[MaxNumPuzzle][N+1]; +int board[MaxNumPuzzle][N]; +int spaces[MaxNumPuzzle][N]; + +int total=0;// +int total_solved = 0;//ѾĿ +bool (*solve)(int, int, int*, int*) = solve_sudoku_basic;//basic +int numOfWorkerThread=2;//̵߳ĿĬ˫߳ +pthread_t* WorkThreads; +long int threadID; + +int nextPuzzleWillSolve=0; +pthread_mutex_t WorkThreadMutex=PTHREAD_MUTEX_INITIALIZER; + +const char outputFileName[10]="outfile"; +int64_t now() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +void read_data() { //ļ + + char *file_name=(char*)malloc(256*sizeof(char)); + FILE *fp; + while(fgets(file_name, 256, stdin)) { + + if(file_name[0]=='\n') { + + printf("please wait...\n"); + break; + } + + if(file_name[strlen(file_name)-1]=='\n') file_name[strlen(file_name)-1]='\0'; + + fp = fopen(file_name, "r"); + + if(fp==NULL) { + printf("%s does not exist.please try again\n",file_name); + continue; + } + while(fgets(puzzle[total],1024,fp)) { + if(strlen(puzzle[total])>=N) { + ++total; + } + } + } + +} +int recvOnePuzzle(){ + int currentPuzzleID=0; + pthread_mutex_lock(&WorkThreadMutex); + while(nextPuzzleWillSolve>=total) + { + pthread_mutex_unlock(&WorkThreadMutex); + return -1; + } + currentPuzzleID=nextPuzzleWillSolve; + nextPuzzleWillSolve++; + pthread_mutex_unlock(&WorkThreadMutex); + return currentPuzzleID; +} +void* Thread_solve(void* CurThread) { + long int my_CurThread = (long int) CurThread; + + int currentPuzzleID=0; + int *PuzzleHaveSolved=(int*)malloc(total*sizeof(int));//ǰ̳̽id + long int CurThreadHaveSolvedNum=0;//ǰ߳̽Ŀ + + while(true){ + currentPuzzleID = recvOnePuzzle(); + if(currentPuzzleID==-1) + break; + + PuzzleHaveSolved[CurThreadHaveSolvedNum]=currentPuzzleID; + CurThreadHaveSolvedNum++; + + + int nspaces = input(puzzle[currentPuzzleID],board[currentPuzzleID],spaces[currentPuzzleID]); + + if(solve(0,nspaces,board[currentPuzzleID],spaces[currentPuzzleID])) { + + ++total_solved; + + if (!solved(board[currentPuzzleID])); + + } else { + printf("currentPuzzleID:%d;NoSolution: %s", currentPuzzleID,puzzle[currentPuzzleID]); + } + + for(int j=0; j0) printf(","); + printf("%d",PuzzleHaveSolved[i]); + } + printf("CurThreadHaveSolvedNum: %d\n",CurThreadHaveSolvedNum); + } + return NULL; +} +void outputToFile() { + FILE *fp = fopen(outputFileName,"w"); + for(int i=0; i=2) + numOfWorkerThread=atoi(argv[1]);//빤߳ + + init_neighbors(); + read_data(); + + int64_t start = now();//ʼʱ + WorkThreads = (pthread_t *)malloc(numOfWorkerThread*sizeof(pthread_t)); + + for(threadID=0;threadID +#include +#include + +#include "sudoku.h" + +#include +int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± +//ڶάϱǷھ adjacent[i][j]Ϊtrueʾ[i][j]Ƿ[row][col]ھ +static void mark_adjacent(bool adjacent[ROW][COL], int row, int col) +{ + for (int i = 0; i < NUM; ++i) {//С + adjacent[row][i] = true; + adjacent[i][col] = true; + } + int top = (row/3)*3;// + int left = (col/3)*3; + adjacent[top][left] = true; + adjacent[top][left+1] = true; + adjacent[top][left+2] = true; + adjacent[top+1][left] = true; + adjacent[top+1][left+1] = true; + adjacent[top+1][left+2] = true; + adjacent[top+2][left] = true; + adjacent[top+2][left+1] = true; + adjacent[top+2][left+2] = true; +} +// һάͳƷھӵ± +static void collect_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + int n = 0; + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (adjacent[y][x] && !(y == row && x == col)) { + //assert(n < NEIGHBOR); + myneighbors[n++] = y*COL + x; + } + } + } + //assert(n == NEIGHBOR); +} +//Ϣ +static void print_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (y == row && x == col)//ڷ X + putchar('X'); + else + putchar(adjacent[y][x] ? 'o' : '.');//o ,. + } + printf("\n"); + } + for (int i = 0; i < NEIGHBOR; ++i) { + printf("%2d, ", myneighbors[i]); + } + puts("\n"); +} + void init_neighbors() +{ + for (int row = 0; row < ROW; ++row) { + for (int col = 0; col < COL; ++col) { + bool adjacent[ROW][COL]; + bzero(adjacent, sizeof adjacent);//ÿζҪ + mark_adjacent(adjacent, row, col);//ÿ20ھӣԼ21 81 + + int me = row*COL + col;//õһά± + collect_neighbors(adjacent, row, col, neighbors[me]); + + if (DEBUG_MODE) + print_neighbors(adjacent, row, col, neighbors[me]); + } + } +} + +bool solved(int board[N])//жǷȷ +{ + int (*chess)[COL] = (int (*)[COL])board; + for (int row = 0; row < ROW; ++row) { + // + int occurs[10] = { 0 }; + for (int col = 0; col < COL; ++col) { + int val = chess[row][col]; + //assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int col = 0; col < COL; ++col) { + // + int occurs[10] = { 0 }; + for (int row = 0; row < ROW; ++row) { + int val = chess[row][col]; + // assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int row = 0; row < ROW; row += 3) { + //鹬 + for (int col = 0; col < COL; col += 3) { + int occurs[10] = { 0 }; + ++occurs[chess[row ][col]]; + ++occurs[chess[row ][col+1]]; + ++occurs[chess[row ][col+2]]; + ++occurs[chess[row+1][col]]; + ++occurs[chess[row+1][col+1]]; + ++occurs[chess[row+1][col+2]]; + ++occurs[chess[row+2][col]]; + ++occurs[chess[row+2][col+1]]; + ++occurs[chess[row+2][col+2]]; + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + } + return true; +} diff --git a/Lab1/Basic_version/outfile b/Lab1/Basic_version/outfile new file mode 100755 index 00000000..9ed9f542 --- /dev/null +++ b/Lab1/Basic_version/outfile @@ -0,0 +1,1000 @@ +693784512487512936125963874932651487568247391741398625319475268856129743274836159 +793684512486512937125973846932751684578246391641398725319465278857129463264837159 +673894512912735486845612973798261354526473891134589267469128735287356149351947628 +679835412123694758548217936416723895892561374735489621287956143961342587354178269 +346795812258431697971862543129576438835214769764389251517948326493627185682153974 +598463712742851639316729845175632498869145273423978156934287561681594327257316984 +364978512152436978879125634738651429691247385245389167923764851486512793517893246 +649835712358217964172649385916784523834521679725963148287356491591472836463198257 +367485912425391867189726354873254196651973428294168573718649235946532781532817649 +378694512564218397291753684643125978712869453859437261435971826186542739927386145 +346895712725361984198427356984256173651783429273149568819674235467532891532918647 +349756812826143579157829364593264187761398425284571693915487236478632951632915748 +546938712987421536213675498165794283432186975798352641871269354659843127324517869 +869725413512934687374168529798246135231857946456319872683571294925483761147692358 +562874913839215647174639582345761298728953461916482375283196754651347829497528136 +572649813986531472314872596238457961167298345459163287893726154741385629625914738 +867942513254731968319568724532496871196827345478153296743689152621375489985214637 +967248513254731869318569724835426971126987345479153286743692158681375492592814637 +278649513956831472314572896532467981167298345489153267893726154741385629625914738 +549728613328561497716493825183654972957832146264179358892347561671985234435216789 +867459213945231687213768954689517432324896175571324869436172598158943726792685341 +867459213549231687213768954986517432375824169421396875634172598158943726792685341 +978654213546231798213879654697518432481326975325947186734182569159463827862795341 +978654213645231798213879654796518432521347986384926175437182569159463827862795341 +478526913219837456365149872793214685521968734846753129932481567687395241154672398 +827945613431286975659173842378462591514398267296517384942831756163759428785624139 +675924813413867592298153476732415968841396725569782134924531687387649251156278349 +769823514145769283823451976456217398931685427278934651614598732397142865582376149 +976583214481629357523741869315874926749362581862195473198456732654237198237918645 +857926314341758692962431578184365927795214836623879145519647283436182759278593461 +596782314318465279724319658943821765185976423267534891471698532652143987839257146 +596872314318465279724319658943721865167598423285634791471986532652143987839257146 +569872314318469257724315689943721865157986423286534791471658932692143578835297146 +538279614762148593914536287296714358451893726873652149347921865625487931189365472 +826375914795481326413269857942713685651928473387654291164592738238147569579836142 +826375914975481326413269857742913685651728493389654271164592738238147569597836142 +964237815182459376357861429891376254725184963436592187548723691219645738673918542 +762389415395412678481675932679854321254193867138726594547931286823567149916248753 +782463915945812673361975842478256391256139487139784526597641238823597164614328759 +798342615365819472421675938679458321254193867183726594547931286832567149916284753 +248967315516832947397154268423596871659781432781423596175249683834615729962378154 +248967315517832946693154287426593871359781462781426593175249638864315729932678154 +729348615836915472451672938678254391245193867193786524567431289982567143314829756 +792348615836915472451672938679854321245193867183726594567431289928567143314289756 +829463715475912683361785942784256391956137428132894576598641237243578169617329854 +879362415635914782421785639784659321256143978193827546568431297942578163317296854 +379284615428561739561793428213657984786149253945328176157436892692875341834912567 +823479615145683792697251348718345269562197834934862571371524986289716453456938127 +472983615385614972196572483641857239237491856859326147913245768524768391768139524 +634879215792541368518263479359418726861792543247635981175926834483157692926384157 +475239816892561347361874925954317268126498573738652491689123754547986132213745689 +837524916159768324462139758591287643324691875678345192945876231216953487783412569 +829375416346912785571486932485267391267193548193854627638741259952638174714529863 +527438916841965273693721854718659432259314687364287591486193725175842369932576148 +342579816978136542651284937497862351816395274523741698264913785189657423735428169 +342875916879136542651294837487962351916358274523741689264513798195687423738429165 +573489216249671358168325497681754932327916584495238671734192865812563749956847123 +745239816236781954189564327678423591412895673953617248897156432561342789324978165 +365942817197638452248175936436591278851726394972384165723859641689417523514263789 +582493617197685234463127958215749863876352491934861725658214379341976582729538146 +548623917196847523723195648917462385354978261862531479675314892431289756289756134 +658239417341687952729451638437192586162845379985376124276913845514768293893524761 +842635917679128354315479826153246789964587231287913465498361572721854693536792148 +596472318321586479784193625843265791619837542257941836935718264168324957472659183 +369742518158639472247185936436571289971826354582394167823957641695418723714263895 +746352918281479536359186472425768193967531284813924765572893641198645327634217859 +679532418325184976481769532938451627147628359562973841716845293294316785853297164 +352769418718543629964218537423685791876491352195327846589174263631852974247936185 +325748619146259387978136452591672834862413795734985126413597268289364571657821943 +647283519231954687895617423179536248358421796426879135783162954962345871514798362 +647283519231954678895617423189536247753421896426879135378162954962345781514798362 +568342719974165832213897645357681294821974356496253187782419563639528471145736928 +764835219321697854958124763693782541142569387875413926489356172536271498217948635 +764853219521694837938127465693482571142579386875316924389765142456231798217948653 +764835219521697834938124765693782541142569387875413926489356172356271498217948653 +684735219521896734937124685398672541142589376765413928479358162853261497216947853 +654738219821596734937124685398672541142859376765413928479385162583261497216947853 +593476821628531974741982365134257689852369417967814253285193746316748592479625138 +843795621625183947917642583596214378782356419431978265379461852168529734254837196 +843697521925183746617542983596214378782356419431978265379461852158729634264835197 +365947821841326795792851436458213679619784352273569184127698543534172968986435217 +978653421316427598254198367731562984649831752825749136583214679462975813197386245 +369784521187592436452613798746821953823965147591347682275436819914278365638159274 +965438721314792865872651934187243596593816247426975318249187653751369482638524179 +874356921315982467692417853958674312126893574437125689569231748243768195781549236 +937564821216873594854192376475321968321986457698745132582437619169258743743619285 +469357821532418967781296435145982673628173549973645218817564392296831754354729186 +867593421932614587415287936241869753573421869698375214756932148184756392329148675 +598467321642531897713298546156382974239174658874956213987615432321849765465723189 +597468321642531978813279546756392184239184657184756293978615432321947865465823719 +897543621342617589615289743281736954534891267976452318758924136463175892129368475 +463795821851236794927814653142689375785321946396547218678452139539178462214963587 +893564721765312498421798563138957246972486315654123987217845639349671852586239174 +753846921961523487284197536415372869678914352329685174132468795597231648846759213 +759436821861725493324198576472983165918657342536214789697341258283579614145862937 +389756421471932658526841937168295743932467815745183296293618574814579362657324189 +348756921971432658526891437169285743432967815785143296293618574814579362657324189 +368457921971326458524189637452938176819765342637214895783541269296873514145692783 +894675321571392648326418579148963257932587416765124983213856794459731862687249135 +954687321786312594321459786149763258632598417875124639263971845417835962598246173 +367459821891326475524178693472893156918765342653214789739541268286937514145682937 +736549821492318576815267493241683759579421638368975214653892147987154362124736985 +758439621194726358326158497879514263632897145415362789547681932981243576263975814 +859376421372451869146982753598634172413725986267819534724593618681247395935168247 +859376421372451869146982753598634172413729586267815934724593618681247395935168247 +956378421372451968148692753569834172413725896287916534724583619691247385835169247 +859376421372491865146582793598634172413725986267819534724953618681247359935168247 +859376421372491865146582793598634172413729586267815934724953618681247359935168247 +687453921351729684294168537769581342825634179413297856132945768576812493948376215 +678453921351829674294167538463591782725638149819274356132945867586712493947386215 +785436921316972854924185673267398415159764382438521769571849236643217598892653147 +837469521451382769269751843743918652186245397925637184612593478578124936394876215 +865347921472691358193285476754912863639578142281436597517864239348729615926153784 +965348721482671359173295486854712963736589142291436578518964237349827615627153894 +857349621432861597619752843271583964945126378386497215768915432194238756523674189 +869573421527841396134692875752319648348726519916485732671954283283167954495238167 +348795621569142378217638954731429586956871243824563197692387415485916732173254869 +874356921526491837139278654341962578697583142258714396713645289482139765965827413 +768395421519462387234817956921536748873249615645781239497153862352678194186924573 +879543621523716489641829735385194267792638514164257893956481372418372956237965148 +589437621614285937273916485928543716137869254456721893395672148862154379741398562 +356948721712563489498721356184275963673819245529634178961457832845392617237186594 +456879321712634589389521467963482175248715936571963248625147893894356712137298654 +896547321752913486314826957271365894943281765568479132637192548185634279429758613 +349756821826143579157829364593264187761398452284571693915487236478632915632915748 +764385921815492736239167584698571243352649817147823659573918462421756398986234175 +357498621861527394249361785438172956512639847976845213193784562625913478784256139 +356897421849621375271453698438172956512936847967548213193784562625319784784265139 +375948621861723495492165387923574168746812539518396274684259713237481956159637842 +715984623936572481248163795124357968367498152589216347672839514453621879891745236 +764195823329867415815432967932516748586724139471389256658271394193648572247953681 +497185623312649857586732941138596472975214386264873519829357164641928735753461298 +487195623319642857526738941132586479975214386864973512298357164641829735753461298 +498165723312749658567832941136597482285614397974283516629358174741926835853471269 +785641923916832547423759861347128659258396714169475238834567192572914386691283475 +659478123382651974417923865534182796726539481891764532173295648265847319948316257 +649578123382641975517293864435182796726935481891764532173429658264857319958316247 +619487523325619478748523961456398712287156349931274685892765134173942856564831297 +789645123423819567165327948854732691316598472297164385672451839931286754548973216 +689745123423819675175326948854132796317698452296574381762451839931287564548963217 +657894123482135976319726584593487261764213859821569347176958432935642718248371695 +891756423624318597357429816139682754562174389748935162485263971213897645976541238 +594186723638729154127345986746938512251674839389512467875293641963451278412867395 +179546823843729651625183947912675438587934216436218579391852764264397185758461392 +819365724254718693736924581187546932342897156695231478921453867568172349473689215 +815369724294718653736524981387645192142897536659231478921453867568172349473986215 +175936824439287615628415379562391748943728156817564293796842531351679482284153967 +835176924417982563296435817564798132781324695329561478948213756152647389673859241 +865193724712648359943572681639281547428759163157364298374925816581436972296817435 +387615924912348657564279831851467392643982715729531486496123578275894163138756249 +398716524512394768674285931961478352743529816825631497437152689286943175159867243 +385761924912348756674295813861457392743982561529613487457129638296834175138576249 +986735124143298576275614893459183762821467359637529481592371648364852917718946235 +967831524183254697245796183419563872526478319738129465692385741374612958851947236 +867351924143829765295746813318472596724695138956138247489513672672984351531267489 +783516924654829173192437568835742619276981345941653287528364791417295836369178452 +986517324712348965435926187874691253123754698569832741291475836348169572657283419 +187635924925784163463192578854269731679341285231857496392516847546978312718423659 +364718925295463871817259634672594183539871462148326597953187246426935718781642359 +169743825573862914482591376356184792247359681918276543631928457825437169794615238 +146793825573842619982561374359186742267354981418279563631928457825437196794615238 +169374825732856419458192673891743562647521938325689741976218354514937286283465197 +691784325753269841824135967217693458368451279945827613489576132536912784172348596 +973846125281735694564921387325468719716359248498172563639287451157694832842513976 +687391425194528637523674819856132794349756182712489563438265971265917348971843256 +859417326271386945436592817128634759364975281597821463685743192742159638913268574 +859417326271386945436592817128634759364759281597821463685943172942175638713268594 +718593426642781935539246781263975814497128563851634279984312657176859342325467198 +319845726782163549564972183123497865695238471847516392436721958278359614951684237 +837195426541627893296384715178256934362479158459831267925743681713968542684512379 +931487526874526391625139784396275148512843967487691235759364812148952673263718459 +951348726842765391673291485765839142284176539319524678126483957497652813538917264 +651489327273651948849372651594837162716295483382164795925743816467518239138926574 +934651827816972534527843961152368479698714253473295618249537186381426795765189342 +439615827816972534527843961152368479648791253973254618294537186381426795765189342 +819536427742891635536247891273485916698123574451769283964312758187954362325678149 +864513927352769841197482356239675184786134592541298763675921438428357619913846275 +864513927352769841197482356239675184786134592541298763675941238428357619913826475 +413967528987352164562148793798213645146589372325674819654891237839726451271435986 +391465728856172943742398561174839256928654317563721489635287194217946835489513672 +765319428243578961918246537536721849421895376897634152359162784172483695684957213 +349715628572846931168932574291573486487621359635489217754268193823194765916357842 +417536928239478156685219473192857634374962815856341792728693541561724389943185267 +431765928278439651596128473915372846743986512682514397864257139129843765357691284 +471356928326849571985172346612485739849763215753291684538624197197538462264917853 +538714629129386745647259318862947531453168972791523864384692157216875493975431286 +678315429243689571915247638537821946421956387869734152356172894182493765794568213 +857416329249738516361259487914625738682371945573894162425187693736942851198563274 +364581729829736541157429863273895416598164372641273958982657134435912687716348295 +763581429429736851185429763248975316937168542651243987372654198894312675516897234 +378561429429837561156429873283945617594176382761283945942758136835612794617394258 +378561429429837561156429873243985617895176342761243985982754136534612798617398254 +568317429372649815914285376891734652746521983235968147429153768157896234683472591 +587461329324795816961823547612958734873142965495637182149586273736219458258374691 +475682931361479258892513467713254896624938715958167324539841672286795143147326589 +749258631361497582258631974682379145417562398593184267934715826825946713176823459 +629854731731692845584713962397125684216487359458936127963541278142378596875269413 +256487931714923568983156427172395684435768219698241375521839746367514892849672153 +256487931714923685983156427692341578435768219178295364521839746367514892849672153 +267849531814523796593167428742351689936478215185296374651932847378614952429785163 +267584931415923786983167542794351628536278419128496375641839257372615894859742163 +256784931417923568983156427192375684735468219648291375521839746364517892879642153 +256784931417923685983156427642391578735468219198275364521839746364517892879642153 +256784931417923685983156472628391547735468219194275368541839726362517894879642153 +256784931418923675973156428642391587735468219189275364521839746364517892897642153 +256897431718423695493156872629341587835769214174285369541938726367512948982674153 +267894531418523796593167824749351682836279415125486379651938247374612958982745163 +567829431923541768418367925351972846689453217742186593174238659895614372236795184 +579624831124783569638591427783416295412935678956872314347168952861259743295347186 +476982531528316974913754628691238457735149862284567193162875349857493216349621785 +796452831241863957835719624163975248924386175587241396378194562619527483452638719 +768542931154963728239817465371254689842396157695781342483175296916428573527639814 +894562731156873924237419685371256498928347156645981372483195267719628543562734819 +468592731251783694739416285615327948342968517897145326174639852926851473583274169 +459678231861243795273915864392861457587324916614597382948152673735486129126739548 +892564731765231498413798562328957146971486253654312987137845629249673815586129374 +485726931961453782273198564518237649397564218624981375756849123832615497149372856 +542876931761539842938124756219468573354297168876351429695712384187643295423985617 +249876531683145972517923486421368795975214863368759124196437258734582619852691347 +465872931981543627273916584126395478398467152754281369542739816817654293639128745 +459728631281436759673195482936251847745689123128347596512873964397564218864912375 +267548931983612574145379628614783295598426317372195486721954863856231749439867152 +954286731273941865186537924631795482897324516425618397762853149518469273349172658 +976245831251873496384619572529381647613457928748926315195764283837592164462138759 +978562431214389675356417928831945762649721853527836149192673584463158297785294316 +879625431261743895453198627538972164627451389914836752382514976745369218196287543 +974826531286153794315497682753612948198534276642789315427961853531278469869345127 +769428531281365479543179682915237864674851293328946157836712945197584326452693718 +827456931461923587395817624984361752713592846256748319649185273532674198178239465 +829456731461723598375819624947361852613582947258947316594178263732694185186235479 +927456831461823597385719624698341752713562948254978316549187263832694175176235489 +827456931491723586365819724948371652713562849256948317674185293532694178189237465 +692874531485123679317569428941358762273416985856297314124735896768941253539682147 +567294831413876952298135674759418263186352749324967185632741598971583426845629317 +876524931543971286192836475784312569961457328325689714619743852238195647457268193 +958642731621738459374951286419376528583214967762589143235897614847165392196423875 +924685731671423859385971426457168392293754618168392574519847263832516947746239185 +927465831651238947834197625576381294318924756492576318749812563285643179163759482 +589276431641893527372541968137962854425318796968457312854129673296734185713685249 +925748631761523894384916572842139756536287419197654283653471928219865347478392165 +684957231759213648312486975145762893938145726267398154471839562523671489896524317 +625974831783251694149368275512749368964835712837126459478593126291687543356412987 +628945731749132685315687249197253468283416597456798312964571823532869174871324956 +756849231843621795291537684437152968612983547985764312529416873168375429374298156 +264859731835761249179423586681935472392147658547286193423518967956372814718694325 +946528731817934526325176948463792815189365274572841369731459682658213497294687153 +781459632629137485453826179246975813597318246138642957315294768964783521872561394 +179865432432179856568243719853914267721658943694327581916582374345796128287431695 +695184732713629845428375916349751268572468193861293457254937681186542379937816524 +465971832813246759972835641159367428284519376637428915526783194748192563391654287 +465971832813246759972835641159763428284519376637428915526387194748192563391654287 +861475932247398615935612748392786451754123869618954327576249183183567294429831576 +657894132482135976319726584593487261764213859821569347176958423935642718248371695 +761892534439165782852374961973681245185423697246957318598746123324519876617238459 +769582134425193687831467592984315276672948351153726948546279813297831465318654729 +257198634463275189819346572542967813381452796796831425174623958935784261628519347 +572986134684123957913457268745839612236541879891672345367295481459318726128764593 +275168934136549278498237651821953746743826519569714382954671823382495167617382495 +279165834546823917813974562495312678738546291162798453354681729687239145921457386 +619852734587943621342671895924765183165384279738129456293418567871536942456297318 +519862734647935821382471596924756183156384279738129465293518647871643952465297318 +125976834734815629968243715456187293397624581812539476249358167671492358583761942 +951287634827634915436159728675328149319546872284791356143962587568473291792815463 +216874935983625471754913268569248713837159642142736589621587394495361827378492156 +862971435743526981195843672387614259921785364654392817579438126236159748418267593 +471926835239185467586734921943618752168257349725493618314872596697541283852369174 +268479135495136287317258694623894571854713962971625348182967453736542819549381726 +475218936396574821812369745723695184649831572158427693964182357537946218281753469 +597124836263598147814736952439281765178653429625479381341962578956847213782315694 +795124836263598147814736952439281765158673429627459381341962578976845213582317694 +154827936637195428289346751425913687961758243873462195516234879348679512792581364 +148572936637894152295631748314267895756189423829453671583746219462915387971328564 +275489136843216975916375482537824619198567243624931758781652394452193867369748521 +784215936291736548536894721453178269819462357627359184368927415942581673175643892 +984215736271936548536478921753189264418762359692354187369827415827541693145693872 +419857236826413759357926418931682547685734192742591863173265984268149375594378621 +275984136819763254643125798597246381461378925382591467158439672924657813736812549 +195724836842365179367198524974283615216549783538671492729416358483957261651832947 +184259736936741528752836914475183692261975483893624157347518269529367841618492375 +568129437932647851417358962679235184245871693381496725724963518893514276156782349 +865124937194673852723985416578349261931267584642518379319456728257891643486732195 +685124937941673528273598416596387241712945863438216795127869354859431672364752189 +918465237362871945574329861183746592625983714749152683237618459496537128851294376 +892145637436297185715386924157629348649873251328514796574931862981462573263758419 +416259837572138649398674521749516283123487956865392714237945168681723495954861372 +184259637937641528652837914465183792271965483893724165346518279529376841718492356 +562179438384526719971438652495817326638245971127963845749651283853792164216384597 +569172438428639751317584926932468517854217369176953284241895673693721845785346192 +952167438634528719178493625813974256429685173567312894385741962291836547746259381 +951674238863925471427183956519437862234861795678259143196548327345712689782396514 +512467938398251764467389512741925683256843179839716425975638241623194857184572396 +154762938283159467967438215819345672426871359375296184641987523598623741732514896 +147652938283419756956378214819734562725861349364295187571986423498523671632147895 +519472638683591247274368951146283795857619324392754816725136489468925173931847562 +169752438783941526425683917654198372231475689978326145846517293392864751517239864 +817562439465379281392148765639784512278651394154923876941237658583416927726895143 +861725439359148627472369581914536278783412956625897143536281794147953862298674315 +781625439395147826426389571914536287637812954852794163543271698168953742279468315 +718526439395147826426389571951634287237815964864792153543271698182963745679458312 +461857239975632841832149567594378612386921475127564398619283754243715986758496123 +857126439329748516461359287912635748683471925574892163135287694746913852298564371 +857126439329748516461359287914635728283471965576892143135287694742963851698514372 +874162539561379482329485617987523146436718295152694378243957861698241753715836924 +624175839719483652853926417481759263596234781237861945342617598975348126168592374 +826175439719463852453928617681759243594236781237841965342617598975384126168592374 +628175439719483652453926817841759263596234781237861945382617594975348126164592378 +826573941194862375753941826489715632672384519531296487315429768967138254248657193 +872539641419786523356124879198345762764298315523617498937861254245973186681452937 +987523641412796583356184927139845762764239815528617439873961254245378196691452378 +873256941245981367691347852958673214416892573327415689569124738132768495784539126 +352986741147352896896471523671849352423567189589123467965734218234618975718295634 +352786941149352876876491523691847352427563189583129467765934218234618795918275634 +576892341124763958839415276453286719967134582281957463315649827798521634642378195 +637825941129364587854971326391487652478652193562193874946238715713549268285716439 +765832941429561873183497652291384567576219438348675219957126384814953726632748195 +875932641421576983693418752216394578587261439349785216158627394964153827732849165 +769352841821749356534168927492513678375684219618927435946271583183495762257836194 +368592741254781639719346258645127983132968574897435126473219865926854317581673492 +238756941451893762697124358865937124372541689914682573743269815189475236526318497 +932856741451973862678124359769538124385241697214697583843762915197485236526319478 +829576341361849527547312986213954678984763152675281439152637894736498215498125763 +935862741261974853478153296759638124382541967614297385843725619197486532526319478 +629783541871564239534912867487291653962345718315876492796158324153427986248639175 +893675241574291638216348579438962157921587364765413982142856793359724816687139425 +953876241681234579247915683538162794162749358479358162396581427815427936724693815 +726893541981574236534612978698241753472365819315987462867159324153428697249736185 +278659341394712685156483729715834296623597418489126537831265974967341852542978163 +659328741271594368483167952546981273328745619197236485834659127915472836762813594 +976832541284615937531479826715286394863941752429753168658327419197564283342198675 +675823941241796358938154726152379864493618572867542193716485239389267415524931687 +862793541357421869194586237915642783423978615786315492641259378278134956539867124 +897632541321457896546819732689374215754126983132598467218965374473281659965743128 +982376541573421986164895723318647295457239618296518437641782359739154862825963174 +973826541561374829248159637894267315315498762726513498682741953139685274457932186 +286537941541982736379614258917358624452176893863429517625743189194865372738291465 +398562741526714389741938652869271534153846927472359168687125493934687215215493876 +829736541651492738734815962597684213243159876168327459385971624412568397976243185 +253769841684351927971428635546197283132586479798243156367812594429675318815934762 +758296341639415728124873965315648279972531486486927513597164832241389657863752194 +895736241713254896246918357972861435654392718138475629381649572567123984429587163 +853726941764391258291548376532164897947285163618973524189457632375612489426839715 +356879241741623589289514367962381475138745926574962138615437892893256714427198653 +723968541895124763461375928342589176987631254156247839614852397279413685538796412 +795236841813954726246817359928761435654398217137425698371649582562183974489572163 +725983641861574392439621758214795863378146925596832417657418239182369574943257186 +623589741954371628178624539341296857795418362286735194567142983812953476439867215 +632598741954371628178624539341286957785419263296735184567143892813952476429867315 +825793641961584327437621859214875963389146275576932418658419732192367584743258196 +326597841915684237478231965697812354543769182182453796231946578754328619869175423 +827593641961784325435621879214875963389146257576932418658419732192367584743258196 +153678942927543681648291537586912374279435168431786295792164853814359726365827419 +935816742184792653267435981672384519341659827859127436428963175793541268516278394 +935716842147892653268435971682374519371659428459128736724963185893541267516287394 +679358142541792683283641579836125794957436821124879365392567418715984236468213957 +798351642613924578452786931541273896387619425926845317279538164834167259165492783 +378961542651274398429853167134798625296345871785612439563129784812437956947586213 +126897543347615298895234716718426359954783621632951487569348172483172965271569834 +125786943346915278789234615517429386894673521632851497958347162473162859261598734 +819625743376489251425731869794512638682394517153867492941258376568973124237146985 +827196543946835172153427698264571839598364721731289465375948216682713954419652387 +576182943914357862283946751162478539395621487748539216637894125859213674421765398 +576182943914357862283946751162874539395621487748539216637498125859213674421765398 +271685943953241786684379152769452831142938567835167429327514698516893274498726315 +592817643168243579347596812489625731631974258725381496276159384814732965953468127 +915826743284793651367415982673284519142659837859137426438961275791542368526378194 +915726843247893651368415972683274519172659438459138726734961285891542367526387194 +186527943534981762972643815469372581213895476758416239697154328325768194841239657 +175826943843951672962743815457619238396482751218537469589164327631278594724395186 +298761345674853921153492678345627819721938564869514732486279153917345286532186497 +862379145741265839539148627196437258428951763375682491254813976617594382983726514 +962387145841265937537149628176438259429651873385792461254913786618574392793826514 +912385746385674912764921835158293467629547381473816529831769254247158693596432178 +978312546436589712521746938749865321265193874183427695654931287892674153317258469 +897312546436587912521946738749865321365129874182473695654731289278694153913258467 +978312546436859712521746938749568321265193874183427695654931287892674153317285469 +897312546436857912521946738749568321365129874182473695654731289278694153913285467 +712539846695824731438671925167452389984316572523798614851267493349185267276943158 +387129546524876391961345827258461739649237158173958462836794215415682973792513684 +893127546524936781761845923259461837647283159138759462986374215415692378372518694 +138725946954613827726849315295468731817532469643197258569374182371286594482951673 +529871346138469527476352981695138274784925613213746895961584732342697158857213469 +519782346736514829482936517941673258678245193253891764164358972327169485895427631 +658921347914753826237846951192478635865132479743695218579364182386217594421589763 +965182347312574869478396512789423651623915478154867293896241735541738926237659184 +127693548658214973439785612873942165541867329962531487284356791715429836396178254 +316287549274159863895634712451973628739826451682541397523498176967315284148762935 +128753649769214583435896712983642175541978326672531498294367851816425937357189264 +763294851195836427428715963346572189251389674987641532579128346812463795634957218 +843796251951283674726145983697514328185327496432968517319472865578639142264851739 +236879451548213796971465823153784962694321578827596314312947685765138249489652137 +978642351546317298213598467721465983639821745854739126482153679365974812197286534 +374926851821357694695841237563419782719682345248573169156798423432165978987234516 +968472351157398264243165978896251743725934186314687592631749825489523617572816439 +968472351157398246243165978894251763325687194716934582631749825489523617572816439 +863472951157389264249165837986251743725834196314697582691748325478523619532916478 +863472951157389246249165837984251763325697184716834592691748325478523619532916478 +624389751571462893893175624235697418769814532148523976487931265916258347352746189 +624893751571462893893175624235687419769314582148529376487931265316258947952746138 +276839451549712863831465927957684132184327596623591784392178645765943218418256379 +864793251129568734753241869645987312937125486218634597471856923382419675596372148 +897236451425871936613459782938145627541627893276398145169582374754963218382714569 +467829351821435967359176842618394275594782136273561498945618723132957684786243519 +769432851521698473843157962956321784437986125182574396374865219698213547215749638 +693824751725631498814579326176983245348752169259146873581467932462398517937215684 +897263451431875296625149783976451832183792645254638179542986317719324568368517924 +876429351543816792219375684185237946364591827792648513621983475438752169957164238 +739248651641735289825169374498513726517426938362987415953671842174892563286354197 +937628451641795328852143697295384716763251984418967532189436275374512869526879143 +376824951248915736951367482187452693539678214462193578714289365625731849893546127 +273648951465917328189235467938576214721489536546123879314792685692851743857364192 +273648951465917328189235467938576214712489536546123879324791685691852743857364192 +289736451765421839413958672837145926541692783692387145128579364954863217376214598 +932468751467125389158793624691574832825631947743289516384916275216857493579342168 +438769251761425839952138746217384695584976123693512487845697312126853974379241568 +479863251861425937352179846218394675594786123637512498945638712126957384783241569 +369784251174235869852196437287561943435972618916843572593427186721658394648319725 +692438751187259463543176982935762814726814539814593627461925378378641295259387146 +496378251281495376735126984628531749517942638943867125852719463164283597379654812 +723648951891735246456912837175493628382561794649827513918274365564389172237156489 +376249851491758263825163497657481932149532678238697145582976314763814529914325786 +483697251271835496569214783148379625356428179927156348734581962615942837892763514 +467298351281365497593714862149683725356472189728159643834521976615947238972836514 +936472851275681943148935726317246598594718632862359417483527169621894375759163284 +463729851285641739197835462371256984946387215528194673732918546614572398859463127 +436729851285641739197835462371256984942387615568194273723918546614572398859463127 +739624851265871943481539726912457638346198275578362419857943162694215387123786594 +439782651267514938158639274395471826642853719871296345916325487583947162724168593 +468973251375126489129845763942618537537294618816357942651782394794531826283469175 +687329451395741628241856739856172943973684512124935876718593264469217385532468197 +637429851485731692129865473256174938391582746748396125572648319963217584814953267 +793468251465271398281953674937816425658742139124539867349125786516387942872694513 +329748651465231798781569342193456287256387914874192563942875136618923475537614829 +739624851465871923281539746912457638346198275578362419857943162694215387123786594 +732496851465218397189537246824951673571623984396874125953762418218345769647189532 +843972651625813479197645238712594863356287914489361527561439782938726145274158396 +237846951641935287985712463376584192812693574594271638169327845728459316453168729 +329768451645231798781549362193456287254387916876192543962875134418923675537614829 +892463751756291834143875962924658317537912648681734295319527486268149573475386129 +423678951791245386865193472654912837912837564378564219289751643537426198146389725 +726398451845127936391456728917642583684935217253871694432719865169584372578263149 +467892351859173624312654987143285769678419532925367148786521493231946875594738216 +467892351859173642312456987143285769928617534675349128786521493231964875594738216 +962743851814295736753186924645972318378451692291638547486319275537824169129567483 +623987451875241963491536278718495632562173849934628517189764325256319784347852196 +632784951895321674174695238526917843381542796749836125967153482258469317413278569 +967284351821735649354691278473912586192856437685473192716548923249367815538129764 +692783451843915672175264938259437186316859724784621395921576843567348219438192567 +324679851965281473187534692451368927792415386836927514248196735519743268673852149 +968341752235786941147529368813652497579134826624897513496273185781465239352918674 +768341952259786341134529768813652479597134826642978513476293185981465237325817694 +419867352623459187578213964831745629754926813962381475296174538385692741147538296 +419867352625413987378259164831745629754926813962381475296174538583692741147538296 +413867952629453187578219364831745629754926813962381475296174538385692741147538296 +167489352425361879389725614874256193651973428293148567718694235946532781532817946 +148276953629538714375491862894615327751382496236947185583729641412863579967154238 +467182953132459876985637142596248731278513469341976528713864295824395617659721384 +742186953168539472359472816435291687897365241621847395586724139913658724274913568 +824196753639725184175384926746839512251647839398512467987253641563471298412968375 +469128753753694812281573946524761398938452167176389524817946235695237481342815679 +294178653837562194516394278745231869968745312123986547672453981389617425451829736 +378192654254863197916475283195346728847251936623789541582637419469518372731924865 +867391254419725683253684917742956831935812746186473529628147395394568172571239468 +369781254418925637257634819942856371835417926176392548623148795794563182581279463 +139867254674352819258491637415936728382745961796218543923674185841529376567183492 +693812754178354629452697813589726341741935268236481597327169485815243976964578132 +187293654294675813536814927468159732375462198921738546713946285859327461642581379 +162837954354921768897654312583716249429583671716249583278195436641372895935468127 +298137654316854927457692318841723569739568142562941783925476831683219475174385296 +682793154741625983539814672864259731915437826327186549173948265258361497496572318 +213867954759134628468259137597483216381672549624915783932546871175398462846721395 +267931854958764231431528967376152489814697325592483716629345178143876592785219643 +917243856653871294482695731148362579376589412295714368839456127564127983721938645 +194832756783516249562947831459273618378691524216458973641729385937185462825364197 +314296857795843612682175943429317568863529471157468329946782135571934286238651794 +912436857436785912875921346361294578729658431584317629143879265258163794697542183 +731462859592138476486597231349671528658329714217845693825916347163754982974283165 +283174659741695283596328714359261478128743596674589132867912345932457861415836927 +872359461165427938943816572784965213659132847321784659516293784237548196498671325 +293854761867213954541796832935168427486972315172435698619547283324681579758329146 +372549861146328597589716423238465719657891342914273658721684935495137286863952174 +584237961129465783376981425963128547412576839857349612741892356635714298298653174 +857293461219764538364185279598431726642879153173652894425916387981327645736548912 +957283461218764539364195278549831726682947153173652984825416397791328645436579812 +897234561356891274421657839945316782168572943273489615534968127619723458782145396 +859273461217964538364185297598431726642897153173652849925716384481329675736548912 +854273961267914538319685274598736412172849653643152897725461389986327145431598726 +854273961217964538369185274598731426672849153143652897725416389981327645436598712 +749385261865712934321694857276431589154869372983257146632978415418526793597143628 +485239761629817345371654289814923576936175824752486193598761432167342958243598617 +583472961426519873719638425192364758354187296867925134948256317671893542235741689 +248537961931264578765189432126953847894721356573648129419376285682495713357812694 +472539861931486257856172934694321785125748693387965142263814579548297316719653428 +758432961643951728219867354176243589832195647594786132381674295467529813925318476 +387924561549316827261578493198462735635789214472153689814295376756831942923647158 +387924561549316827261578493198462735653789214472153689814295376736841952925637148 +872345961543691782916827543425918376689273154137456298754162839268739415391584627 +273584961851926473964317825748163259632495187519278346126749538485631792397852614 +347289561851736492962514873714368259635492187298157346126945738483671925579823614 +394725861856931274712864935681542793235697148479318526923186457167459382548273619 +423875961856291743917364285285913674379486512641527839164759328792138456538642197 +347582961159736428268419573592871346471653892683924157914367285735248619826195734 +953482761172965834468731592316597248285143679794826153831654927629378415547219386 +328957461976143258415628937182396574769485312543712689231869745694571823857234196 +895372461476581329213649578932467185758193246164825793621954837387216954549738612 +524398761371562489968417352643951278795284136182673945239846517857139624416725893 +249375861671824539538196274187649325392517486456283197925731648814962753763458912 +538247961271936584694815732159378246463592178827164359785621493316459827942783615 +839457261215936874476218935327841659594623718168795342981364527652179483743582196 +937482561246315897158697432375168924629743185814259376562931748491876253783524619 +759324861246581379813697452481256793537819624962473185198745236624938517375162948 +759324861246581379813697452481256793537819624962473185198745236324968517675132948 +574329861286751349139846572413267985957483216628195734342918657761532498895674123 +547329861286751349139846572413267985952483716678195234324918657761532498895674123 +948327561256891347371645982195462873763189425824753196587936214412578639639214758 +952843761374126958168795432217564893436289517895317624541672389689431275723958146 +457298361326751849198436275712684593685329417934175628873962154561847932249513786 +482753961361892754795146283579368412238914675146275839913627548624581397857439126 +289374561351869724476152983124593876738621495965748132513986247692417358847235619 +238459761476813925195726834813694572629571348547238196384965217962187453751342689 +238794561459631278167528934726319485945876123813452697591287346384965712672143859 +792483561413576928658291347375648219981725634246139875137952486869314752524867193 +857423961419876523623915874361547289982631745574289136245168397796352418138794652 +723548961481296375956137824867415239314972658592683417279861543638754192145329786 +598374261412865793637291854381957426745632189269148537876513942153429678924786315 +789354261453261897621897534318975426574632189296148753867513942135429678942786315 +759842361482361759613975248197528436825634197364719582531286974276493815948157623 +243589761516327849978164325861493257732658914495271683157836492384912576629745138 +923458761785621349146793528862534917314879256597216483659147832238965174471382695 +943275861721468395856193274195726438374589612682314957239851746417632589568947123 +729845361841367295365921478532178946174659832698234517486513729917482653253796184 +724895361895361742613472589187529436452638197369714258531286974276943815948157623 +724985361895361742613472589187529436452638197369714258531296874276843915948157623 +732895461914236578685471329471568932268349715593712684326154897157983246849627153 +314578962825369471679421853947285136162937548583614729431856297756192384298743615 +817952463965134872243687915452379186386415297179826354634798521591263748728541639 +547182963132569874986347152693258741278614539451973628714835296825496317369721485 +784259163126843579935761824347986215251374698698512437573628941469135782812497356 +784259163126843579935761824347986215251374698698512437873625941469138752512497386 +157248963863591724924736815695327481412865397378914256231679548549183672786452139 +712539864695824731438671925164752389987316542523498617851267493349185276276943158 +598123764317864925462795318841352679259678143673941582926437851785219436134586297 +182753964546981327973264518694315782317892645825476193768549231431627859259138476 +123498765694357281857612934362845179589173642741269853276531498915784326438926517 +731429865965718342248536971412953687689174253357682194893245716576391428124867539 +387124965149865372652937481216579843835246719794318526968751234473692158521483697 +728349165945261738316578429671985243853724691492613587269857314137496852584132976 +592431867743968215816275934631594782258716493974382156369847521127659348485123679 +215438967864279153397156842529867314481523796736941528172394685943685271658712439 +529143768638972514147586329872369451354218697961457283796835142213694875485721936 +529413768638972514417586329872369451351248697964157283796835142243691875185724936 +921345768638792415745186923812967354374258691569413287486539172253671849197824536 +942315768173846925856729431264531879397482156518697243489263517731954682625178394 +714523968356798142298614753142367589673859421589142637961235874825471396437986215 +219543768357869142864712953142378596783956421596124837971235684625481379438697215 +174352968965718342832496571241987653789635124653241897497863215316524789528179436 +834251769271693845956874312198547236345126987627389451519432678482765193763918524 +124853769895746123376219584947362851218597436653184972761438295432975618589621347 +934682571178543269625971834863795142251438697749126385387214956416359728592867413 +529643871871952436643187925296718543718435692354269718462571389135894267987326154 +682435971174298536359617824521769483846351297793824165937542618265183749418976352 +825436971731529468469718352956273184387941526214865793543687219198352647672194835 +856942371391587642427613958749231865263458719518769423975326184132874596684195237 +856293471279614538314785269598437612142869753763152894425971386987326145631548927 +956283471278614539314795268549837612182946753763152984825471396697328145431569827 +389652471457891263126347985845726319273189654961534827614273598798465132532918746 +859263471276914538314785296598437612142896753763152849925671384487329165631548927 +568342971972516384413789625781965432635428719249173856156897243824631597397254168 +938564271615927843247138569194352786573689412826471395761243958389715624452896137 +249653871586791243731428956162347598497865312358912764673584129824179635915236487 +498362571621475389537189426783954612216837954954216738875691243362548197149723865 +498325671521476389637189425783954216214637958965812734876291543342568197159743862 +659342871827619345431758926192473568364581297578926134915267483783194652246835719 +349526871521897643876413529718369254465281397932745186654178932187932465293654718 +295368471731924685864517923318476259652193748947285316126849537473651892589732164 +536428971749351826812679435973145682681932547254867193127594368465783219398216754 +326495871857213694941786253438972516275168439619354782592841367763529148184637925 +682534971357918426914627358568249137243176895179385642836792514421853769795461283 +839264571754981362216537489648193725321675894597428136985716243172349658463852917 +346582971759631482218479536592867314487153269163924758974316825635248197821795643 +845962371163745298279381456781459632432176985596238714957824163614593827328617549 +283654971967821453514937826758269314436518297192473568379145682821396745645782139 +283654971961827453574931826758269314436518297192473568319745682827396145645182739 +285643971769521834314789625851974263923168457476352189692437518138295746547816392 +283654971567931428914827563758269314436518297192473856379145682821396745645782139 +283654971561937428974821563758269314436518297192473856319745682827396145645182739 +283469571169357482574182396318246759647915823925873614736521948452698137891734265 +589264371764513829312789465975142638431658297826937154693871542147325986258496713 +643589271281347965975261438497823516352614897168795324526978143734152689819436752 +496238571582417963371569248163972854759841632824653719915386427247195386638724195 +246593871397841562815726493429357618731468259658912734964185327583279146172634985 +456283971279451368138769254761324895325918647894675123582197436947836512613542789 +395468271247319586861752493912587634534296718786134952428971365159623847673845129 +568342971291687534347195862923516487684739215175428396752863149439271658816954723 +894526371257913486163748529429671835371485962586392714648139257712854693935267148 +425693871367218459189745632758961324216534987934872165671329548593487216842156793 +925836471341297658786451932139678245278945316654312789412789563597163824863524197 +465239871397581246281764953149328567532617489678495132954176328826953714713842695 +845269371327581496619437285953872164782614953461953728574126839298345617136798542 +256493871317826495489715263875341926124689357963572184631958742548237619792164538 +253498671491637285876215934925763148187549326634821597749152863318976452562384719 +538426971472981563169357284946172358827635149315894726281743695654219837793568412 +895326471431579682627184593158637924273945816946218735762853149389461257514792368 +859246371427931568316587294168329457975164823234758916693872145782415639541693782 +462539871578621493193847526947216385385794612216385749631978254724153968859462137 +463825971512937486798641253657319842239468715184752639925184367341276598876593124 +294865371561473829378129645427396518913758462856241793189634257632517984745982136 +942658371586173294731924658457281936329746815168395742214839567895467123673512489 +849635271675241839132987546987513462564728913213496785321854697456379128798162354 +429365871617248359853719426576831942394627518281954763932476185148592637765183294 +234869571651273849987145263498657312715932486362418795576381924123794658849526137 +258396471697541328143728596512684739384957612976132854769413285831265947425879163 +854963271671524839239187456345216798198375624762849513427691385983452167516738942 +845269371627531489319487256953872164782614935461953728574126893298345617136798542 +625398471841726953397415682976542138584931267213867594432679815759184326168253749 +235864971841937265769512483673245198458196327192378546324781659517629834986453712 +346958271821347569795612348574286193139475826682193457258761934417539682963824715 +243865971851947263796312584674253198182496357539178426425781639317629845968534712 +253684971891327645467159283674938512389512764125476839942763158536891427718245396 +456239871918745362327168549694873125831526497275914683742651938569387214183492756 +824963571936571842715482693198625437462739158573814269651297384287346915349158726 +159634872237851496864927351593762184721348965486519237315296748972485613648173529 +581934672796825134432761958174582369965473821823196745648217593359648217217359486 +546138972819274365723965841638729514952481736471356298294513687387642159165897423 +536918472487562913912734685261897354874325196395641728743259861629183547158476239 +569318472387542916412769385234897651175634829698251734743925168926183547851476293 +639418572587629431214735986426897315175346829398251764753962148942183657861574293 +149862573236517489587349612473158926625973148891624735354786291718295364962431857 +815263974392847561467195823178532496623984715954716238541329687286471359739658142 +538126974917834652246579381389417526721695843465283719853942167192768435674351298 +538126974917438652246579381389714526721695843465283719853942167192867435674351298 +862931574157486392349725618418659237673248951925173486286597143791364825534812769 +165823974247951386893647521926184735571239648438765192654392817312578469789416253 +163958274597124836482637159814379562625841793739562418378295641951486327246713985 +846912375327586491159743628518639247674258913932174586283467159791325864465891732 +198243675457861923236957418942135786583726149671489352725394861819672534364518297 +198243675457861923236957418642135789583729146971486352725394861819672534364518297 +198243675457861923236957418943125786582736149671489352725394861819672534364518297 +198243675457861923236957418643125789582739146971486352725394861819672534364518297 +831942675627583419459761328518639247374258961962174583283497156746315892195826734 +213548976865279143497136852329867415581324697746951328132695784954783261678412539 +813452976467918253952637184328174695675293418194865327286741539739526841541389762 +931654278546287391728931645167492853483715926259368417375849162692173584814526739 +194256378578391624326847915419573286652918743837624159763482591285169437941735862 +432165978681379254597842613258436791769581342143927586374698125916254837825713469 +621543879739182645548697321982371564364259718175468293497836152253714986816925437 +621534879739182645548697321982371564463259718175468293397846152254713986816925437 +354726981126598734789134265478253619932861547615479328867912453543687192291345876 +425736981136298745789145263578324619942861357613579428867912534354687192291453876 +926735481158469327437218659562381794814957236793624815389176542271543968645892173 +427953681158642973369718524684125739235897416791364852576431298912586347843279165 +354672981921834756678519432485961327792453168136287594519728643867345219243196875 +476532981921846537835719462789451623364297158152683794648375219517928346293164875 +593427681421368957786159423169835742347291568852674139914583276278946315635712894 +637542981125398647948176532359617428871254396264839715783461259592783164416925873 +364572981921386547758149623845963712679218354213754896487691235592437168136825479 +547326981821549376639187425492631758718495263365872194984263517173958642256714839 +659372481721684395438159672893745216216938547547216839984561723362497158175823964 +367492581521786493984153627716934258892567134435821769643218975158679342279345816 +379526481425781693618493572194368257786245319532179846853617924941832765267954138 +349526781628791543715483692197368254486275319532149876853614927971832465264957138 +697352481821764359534189672368975214712438965459216837985621743276543198143897526 +769342581421785396538169724893256417217438659654917832985671243372594168146823975 +496732581837165924215849763528374619169528437743691258981456372672913845354287196 +496732581837165924215849763528374619961528437743691258189456372672913845354287196 +276543981931826547845719236789351624463297158152684793628475319517938462394162875 +672543981931826547845719236789351624423697158156284793268475319517938462394162875 +259437681431286579786159432128563947945721368673894125512348796894675213367912854 +257439681431286579986157432128563947745921368693874125512348796874695213369712854 +249735681631248759578169423984651237123487596756392148415873962392516874867924315 +425736981938541726761829354184957632296384517357612498643198275512473869879265143 +425936781738541926961827354184759632296384517357612498643198275512473869879265143 +426735981938641725715829364584967132291384657367152498143598276652473819879216543 +426937581538641729917825364784369152259184637361752498143598276692473815875216943 +637542981145398672928176543359617428871254396264839715783461259592783164416925837 +346572981859631427217489536592768314468123759173954862984316275635247198721895643 +275643981869521734314879625157984263923167458486352179692438517731295846548716392 +947236581861547293325189647514928376278365419693714825489651732752493168136872954 +425736981869514237713298465294687513538149726176352894647921358951873642382465179 +752364981461798352983251467847925613216483579539176824694512738328647195175839246 +546297381871653924329184657495318276238746519617925843984531762752469138163872495 +546297381871653249329184675415728963238946517967315824684531792752469138193872456 +962453781184967523357128469216834957843579612795216834638791245571642398429385176 +537692481892145367614378259178459632423816975965237148251764893786923514349581726 +735692481892145367614378259178459632423816975569237148251764893986523714347981526 +673594281291378456485261739768943512342615978159827364526789143834152697917436825 +945723681132468975678951234219534768486172359357896412721389546893645127564217893 +476395281285761493193248567348519726657824319912637845531982674864173952729456138 +476523981285961437193784562952438176631275849847196325724319658369857214518642793 +947523681283461597156879342569238714312947856478615923725196438694382175831754269 +574623981219548367836197524927486135481359672653271849348912756165734298792865413 +574623981286591347139847526927416853418359672653278194341982765865734219792165438 +567329481291648573834571962689712354175463298342895617458136729913257846726984135 +467529381283761594159843627594238716612974853378615942725196438936482175841357269 +467529381283761594159843627594238716612974853378615942725196438946382175831457269 +947523681286791543153846927569238714312974856478615392725169438694382175831457269 +697423581215798346843561927931287654476915832528634719764352198389146275152879463 +375469281248713596961852473712598634534276819896134752427981365153627948689345127 +769532481238164597541789623984621375625397814173845962416973258397258146852416739 +793456281258193467461782359982531674574269813136874592315627948627948135849315726 +429653781367821495185749632948312576573468219216975843691287354732594168854136927 +927365481346281795158974623281437569769518342435629178573896214814752936692143857 +456237981321698754897451236682174593175329468934865127763512849518946372249783615 +795236481368149257241758963519674328873921546624583179932865714187492635456317892 +257946381468312975319857246196734528743528169825691437982173654631485792574269813 +257946381468312975319857246196473528743528169825691734982134657631785492574269813 +257946381468321975319857246196734528743582169825619437982173654531468792674295813 +257946381468321975319857246196473528743582169825619734982134657531768492674295813 +259467381478321695361859274617934528934582167825716943742193856593678412186245739 +259467381471328695368159274687934512934512867125786943742893156593671428816245739 +694273581512489637873165294459328176761954328328716459985631742246597813137842965 +432695781678312495159748623521879364864153972793426158385964217947281536216537849 +253496781691738245748215936925873164186549327437621598869152473314987652572364819 +732569481659841732148237965471623859396785124825194673264958317513476298987312546 +473256981621978435895314672569831247742695813318427569236189754154762398987543126 +473256981621978435895314672169835247752649813348127596236481759514792368987563124 +724956381638214957951837426412689735563471298879523614196348572247195863385762149 +243965781678421539591783264912376845485192376367548192824617953139854627756239418 +259367481678541329143829567512794836394658712786132954867413295931275648425986173 +253769481697184235841325769568291347432857916179436852315942678724618593986573124 +435962781716358429829147653641283975983675142572491368397524816268719534154836297 +536742981789361542142958376423597168691483725875126439358214697967835214214679853 +395467281781239564246185397927518436158643729634972815862751943473896152519324678 +253674981798321645461859273614937528379582164825416739942163857536798412187245396 +346975281782431596159268437471826359925713864863594172614357928237189645598642713 +956274381728631549314598267463982175892715436571463892685147923249356718137829654 +469327581738615942521849376342981657817456293956732814193564728674298135285173469 +243597681961428537758613249582369174417852396396741825124986753835174962679235418 +513694782247831596869752413185426937492378165376519248621985374934267851758143629 +513674982249831567876952413185427639792368145364519278621785394937246851458193726 +976531482235468917418729635194352876763184529852697143621943758349875261587216394 +637941582548672913912835764276198345485326197391754826853269471729413658164587239 +941735682582196473736482591619548327453927816827361945274853169195674238368219754 +164795382597328146238146795316472958472589631859613274743861529981257463625934817 +134796582657428193298153746413572968572689431869314275745831629981267354326945817 +124675983835914267679283514416329875793568421582741396947836152368152749251497638 +914765283826439517375128946768254139431897652592316874283671495649583721157942368 +579426183426183795381975642937614258812537964654892317768341529143259876295768431 +679421583425783691381956742937614258856237914214895367768349125543162879192578436 +517246983642398751983517264375821496461739528298654317859463172136972845724185639 +125796483483521769679438512542367198731984625968152347894675231317249856256813974 +746295183513486297892137645369524718187369452254718369438652971625971834971843526 +612947583958123674374865921136259748527481396849376152265738419493512867781694235 +391762584685194723274853961729648135438915672156327849563471298942586317817239456 +931762584728514936654839721465397218397128645812645379589271463176453892243986157 +197625384358417296642389751715834629836291547429756813573942168961578432284163975 +265317984187694235493258716872946153639125478514873692748569321326781549951432867 +715639284692418735834527961528394176469871352173256849987145623241763598356982417 +961237584758496321342851679419625738683749215527183496296578143875314962134962857 +763129485254378691891654237148965723579432168632817954386241579427593816915786342 +913267485284935761576184932347812659158649327692753814735426198869571243421398576 +931246785768593412452871369519732648384659271627184593293468157876315924145927836 +957412386328697514164853729619734258785269143432185697293578461841326975576941832 +913524687764318295825679431148967523579432168632851974386245719251793846497186352 +953124687764358291821679435148967523579432168632815974386241759215793846497586312 +452783691978126453613495872537618249124937568869254137741362985395841726286579314 +563824791982137564714596238648712359235968147179345682851473926496251873327689415 +785634291132985647649712583257861439416593872398427165821349756974156328563278914 +456728391829431756317965842591384267784692135263157489148579623932816574675243918 +754328691821796354639154728983467512516239487472815936295671843368542179147983265 +426837591539641827817925364794368152251794638368152479143579286672483915985216743 +538762491962145378714389256189457632423916785675238149251874963897623514346591827 +835762491962145378714389256189457632423916785576238149251874963697523814348691527 +753642891861975432294813576945231768638794215127586943379158624482367159516429387 +753246891861975423294318576945831762627594318138627945379152684482763159516489237 +426738591973521486518694372695387124841256937732149865357912648289465713164873259 +864753291271986543395214687956341872728695314143827956489162735532478169617539428 +237568491689147235415293687364729518871354962952816743126485379593671824748932156 +256438791781259463349176582935762814627814935418593627164925378873641259592387146 +263548791781692534945137682394781265528463179176925348639254817857319426412876953 +263548791781692534945137628394761285526483179178925346639254817857319462412876953 +853274691294651873176389452531796248742835169968142735389417526425968317617523984 +684325791295471368137968542468517923729643185513289674341792856956834217872156439 +486352791219687345735194862943218657562739184871546239698421573324875916157963428 +587342691239816475614957328345291786971468253826735914152674839763589142498123567 +476825391321947865589613742837259614695174283142368957218436579763591428954782136 +425367891368219457197485326651938274872546139934721685783694512249153768516872943 +687435291495271683123869547756384129831792456942156378319527864568943712274618935 +678435291495271683123869547756384129831792456942156378319528764567943812284617935 +538674291461392578927158634685219347219743856743865912894527163152436789376981425 +258746391479321685361958247716834529843592176925617438692183754537469812184275963 +258746391471329685369158247796834512843512976125697438612983754537461829984275163 +487536291531289467269417358354721689816395742792864135648152973173948526925673814 +728654391549231876361978452683719245495382617172546938234167589816495723957823164 +834256791651397248279148365492783516165429873783615924947531682318962457526874139 +584326791613795824297148365759832416428619573361457982936581247142973658875264139 +572348691639712485814956372345291768981467253726835914157624839263589147498173526 +527348691639712485814956327345291768981467253276835914152674839763589142498123576 +427368591613549872589271463895136247164792358732854916341625789978413625256987134 +742365891631879524958241736419586273386927415527134689295618347864793152173452968 +742365891639871524518249736451986273386527419927134685295618347864793152173452968 +742365891639871524158249736491586273386927415527134689215698347864713952973452168 +324867591769154832851239746496512387135978624278346915682495173917623458543781269 +365842791789136452214597683658714239142963578937285164521378946493651827876429315 +365842791789136452214597683658714239147923568923685174531278946496351827872469315 +538267491726419538149538627473651982261984375985372146697845213854123769312796854 +238675491796421583154389276367514829829736154415298637673152948942863715581947362 +834567291715429863296138547568291734327684915149375628681953472452716389973842156 +358462791791835462264197358847519236129643587635278914982751643473986125516324879 +385462791741895362296137584827519436159643827634278915968751243473926158512384679 +385467291791832564246195387827519436159643728634278915962751843473986152518324679 +358462791791835426264197358842519637179643582635278914986751243423986175517324869 +582347691739816425614952387345291876971468253826735914158624739263579148497183562 +632785491894231576175469328469517832217348659583692147321956784956874213748123965 +375468291891237564246195378728519436159643782634872915962751843483926157517384629 +257486391819327645364951287476138529183592764925674813642713958531869472798245136 +357468291841792356269135487724519638198643572635827914976251843483976125512384769 +864315792312479685795286341936157428127864953548923167471592836289631574653748219 +834167592769254813152389746496523187285971634371846925613495278927638451548712369 +125786493936514287784293615617325948843679521592841376458937162379162854261458739 +257468193489135276316297584523784961794613852861529347172856439635942718948371625 +753621894869435271124879365298314657316758429475296183932167548647583912581942736 +861573294435296718729841563674935821213687945598124637142759386956318472387462159 +513278496294536871687194532358912764169745328742863915836427159975681243421359687 +413826597869357124572149683187263945946578312325914768654781239738692451291435876 +265831497397452816841769523623598174459617382718324965572983641934176258186245739 +524968137176354289983217456735189624241673598869542713698725341412836975357491862 +356249187879561324241783596135427968962318745487695213724136859693852471518974632 +359286174871594362246731598135427986962318745487659213724163859693875421518942637 +356249187789561342241873569135482976962317854478695213824136795693758421517924638 +359276148781594326246831579135482967962317854478659213824163795693725481517948632 +976534182821679345435281769362815974784396251519742836198463527247958613653127498 +396745182827391546415628379958462731263157894174839625649573218782916453531284967 +768594132924361587315728496592436871687159324143872965859247613476913258231685749 +483756192527391684916428573869532741234167859175849326398674215752913468641285937 +397865142528341697416729358965472831273158469184936725759683214642517983831294576 +894765132527341698316829457965432781278156349143987526459678213682513974731294865 +439876152628351794517429368976532841254168973183947526365784219792613485841295637 +895476132426351798317829546964537281278164359153982467549718623782643915631295874 +498536172735182496126749583582467931374915628619823745857391264241678359963254817 +867394152145782963329516748278461539691835274453927816532148697784659321916273485 +947568132285314697613927548324695781891742356576183924162839475459271863738456219 +597863142412759638683412975965174283831526794274398516758231469329647851146985327 +368549172547612839291783465623891754789435216415267398954178623136924587872356941 +584763192712958634693412875865179243431526789279384516957231468328647951146895327 +594863172712459638683712945965174283431528796278396514857231469329647851146985327 +934875162786421395125936874371258649458769213269314758512693487647582931893147526 +586793142912458637473612895845169273631527984297384516759231468328946751164875329 +584963172912758634673412895865179243431526789297384516759231468328647951146895327 +294857163138496527675231948946325871352178694781649235819763452467582319523914786 +956248173724391865831576492693425781217863549485917236362184957178659324549732618 +796852143523419687418673952275386419684791235139524876957248361341967528862135794 +472856193583921764916734582631478925249563871857192436128349657764285319395617248 +579462183813957624642813795765129348931584276284376519358291467427638951196745832 +946578123871632945253149768397426581614385279582791634128963457735214896469857312 +574962183913857624682413795765128349231549876498376512359281467827634951146795238 +584762193913458726672913845865129374231547689497386512359271468728634951146895237 +835267194427913658196854372563748921281695743974132586648571239712389465359426817 +857962134942315867613748952391876245284531796765294381536129478429687513178453629 +563279184724861359198354276287436915935187462641925837316542798872693541459718623 +538762194297481365146953782985216473324597618761834529873649251619325847452178936 +752638194941752863386491752463917285298546371175823946519384627827165439634279518 +832756194914832675576491832465978213293614587187523946651349728328167459749285361 +967385124285941763314627598649752381871493256532168947798534612126879435453216879 +635872194782149356194563782469735821328691547517428963241957638856314279973286415 +593628174846571329127943658765289413289134765431765982312897546978456231654312897 +593726184846195327127843659765289413289431765431567892312978546978654231654312978 +284693175196758432735241968927534681453186297861927543518479326342865719679312854 +894736125752194683631825794183659472267348519945271368576482931418963257329517846 +693748125542631978178952364351826497429573816867419253716394582935287641284165739 +372986145564173892981542367157398624493625781628714953749851236216439578835267419 +896243175731895624425176398357912846268457931914638752172589463589364217643721589 +742693185936815742815742693128937456597426318364158279671389524459261837283574961 +637429185258617394194835627729361458413598762865742931341256879576984213982173546 +863427195251893647749165382498271563125634879376958214587319426634782951912546738 +462397185351846297798251463136485729945672318287913546629734851574168932813529674 +867923145392154678145768392584276931713549286926381754451637829279815463638492517 +674932185832157694195648372589476231246381957713529468451863729967215843328794516 +736942185892153467145678392578426931429731658613589274351864729967215843284397516 +736982145892154367145673892574836921329741658618529473451268739967315284283497516 +736982145892154367145673892573846921429731658618529473251468739967315284384297516 +736982145892154367145673892574826931329741658618539274451368729967215483283497516 +285394176196725348374816295859162437712483569463579821527941683941638752638257914 +837954126924716583156382479315867294278149635649523718763295841491678352582431967 +753849126621375498849216573597462831216538947438197265365921784172684359984753612 +753894126621375498984216573578462931216539847439187265365921784197648352842753619 +752894136631275498489316572578469321916532847243187965365921784197648253824753619 +752849136631275498984316572578463921316592847249187365465921783197638254823754619 +587329146243761895916548372871632459659814237432975618768453921325196784194287563 +598327146243861975716549382871632459659714238432958617967483521325176894184295763 +854739126216485793793261845328946571965317284147852369671598432489123657532674918 +847923156392165478156784392685247931429831765713659284561372849978416523234598617 +847953126392164578156782493684527931529831764713649285261375849978416352435298617 +587934126396125874124786593439618257875342619612579348258467931941853762763291485 +837924156492165378156783492684257931529831764713649285361572849978416523245398617 +837954126492163578156782493684527931529831764713649285261375849978416352345298617 +837954126492163578156782493684527931529831764713649285361275849978416352245398617 +354682197629571384871943625547396812196827543283154976468239751715468239932715468 +345682197629471385871953624287345916196827453453196872568239741714568239932714568 +295364187417825369386917245954172638862493571173586924528641793641739852739258416 +325498167964571382187632459871354926653729841249816573412965738798243615536187294 +329654187156879342847231569285743691473196258961528734514387926792465813638912475 +489625137136879452257341869823754691574196283961238745315487926798562314642913578 +439625187126879453857341269283754691574196832961238745315487926798562314642913578 +652384197178962345349571682921647853735819264486253719897436521514728936263195478 +495862137826731495317954682569347821782619543134528976641293758258476319973185264 +569328147324671895817594632138947256672153489945286713486739521753412968291865374 +863259147741386529952417683628975431417632958539148276376521894185794362294863715 +863259147741386529925417683682975431417632958539148276376521894158794362294863715 +358649127694127385217538694963481572721953468845762913576294831432816759189375246 +953648127416297853782315649275139486134876592698524371567983214829461735341752968 +825943167467218593139756284298364751371529846546187932612495378983672415754831629 +965824137834971265127563498619248753352197846748635912571486329493752681286319574 +542863197987125643136479852269731584451286739873954216725348961398617425614592378 +354672198629518374718943625541396782896721543273854916467239851185467239932185467 +345672198629418375718953624271345986896721453453896712567239841184567239932184567 +537926148819437562264581397143798625975612834628345719791864253486253971352179486 +469725138137689452258341679326854791584197263971263845615438927892576314743912586 +435927168918635742267481395541398627689712534723546819196874253854263971372159486 +463297158789451623125368794651739842937824516248516937372185469816943275594672381 +293547168648291753517638492821475639736912584459863217162384975985726341374159826 +493657128258491763617238594821576439734912685569843217142385976986724351375169842 +439572168278316459651849237912754683847163925563928714195237846386491572724685391 +946352178231786954875194362583467291169238547724915683612879435398541726457623819 +672345198351968247894217563928753614417896325536421789285679431169534872743182956 +925743168468219573137856294289364751371528946546197832612475389793682415854931627 +476532198518947236392618754734156829251489673689273415945821367827365941163794582 +493756128518294367276831495964127853825349716137568249382615974641973582759482631 +425736198618294573379851462234169857957348216186572349893615724741923685562487931 +439572168658314297271896453912758634847963521563421789195237846386145972724689315 +542376198791485236368129457159738642483652971276914583827591364635247819914863725 +475962138918347625362518794734159862291486573586273419649821357827635941153794286 +473952168918647523562318794754169832291483675386275419649821357827536941135794286 +527843169819265374346971825971426583685397412432158796253719648798634251164582937 +824736159375491268619528473796342581153879642248165397961284735432957816587613924 +537246189419837562862591347143789625275614938986325714721968453698453271354172896 +278654139541293768936178452697485321124936587853721694319542876765819243482367915 +586437129249681753137259486762913548451768932398524617975842361814376295623195874 +765238149382419675941567283827956314134872596659341827513724968496185732278693451 +852734169436951287197826354324189576561247938978365412613472895285693741749518623 +632874159478159236195623487583491762967285314214736598349567821726318945851942673 +586234179729618543134759268362471985418592736957386421873145692295867314641923857 +542378169761495238389126457158739642493652871276814593927561384835247916614983725 +748536129529841736631927584257369418386415297914278365872194653493652871165783942 +475386129963512847821479635248961573137258964659743218594127386382694751716835492 +548973126216854973793162854869325741437681295125497638674519382382746519951238467 +549873126216954387378162954967325841483691275125487639634518792892746513751239468 +568749132791283645423165897614378529235914786987526413176492358859631274342857961 +496752138821439567573168249934671825762583491158924673289316754315247986647895312 +285694137941723568673518249538471926724936851196285473862359714459167382317842695 +298467135347215689651839472184372596936154827725986341873591264419623758562748913 +659478132281693745734521698945817326376249851812356974593162487127984563468735219 +527469138431875962896213745183546297759328614264197853342981576615732489978654321 +659487132871623945234591687945718326386249751712356894593162478128974563467835219 +927846135648153927315279648736498512891527364452631879283914756164785293579362481 +927684135648135972315297648756423819891576324432819567283941756164758293579362481 +629748135847153962315269847736482519981576324452931678293814756174695283568327491 +942857136587631492136492857825743961369218574471569328754986213618325749293174685 +285976143193824567476513928632157489954382671718469235561748392347291856829635714 +632875149197324658845619723451962387729583461368147295984736512576291834213458976 +567238149428179635319546872974365218235781496186492357751624983693817524842953761 +237849156186325794459716832692571483874293615315468279761954328943182567528637941 +427386159936715284518942637842569713791238465653174928275693841389421576164857392 +492835167817269543536147289941726835275384691683591472758613924324958716169472358 +389425167421769538567138924675812349918643752234957816192586473746391285853274691 +237458169946721853158369274392145687715986432684273915471632598829517346563894721 +784395162261748593953612748649531827837264951512879634378926415426157389195483276 +897253164246871593351469827173628945425197638689534271534916782918742356762385419 +897452163216873594354169827173628945425791638689534271531946782948217356762385419 +342759168857416293691823745485972631719635482263184957134298576576341829928567314 +592836174873214659614759283951427836246385791387691542768143925425968317139572468 +386425179421976538579138624695812347718643952234597816152789463947361285863254791 +459362178836741925271598643684135792927486531315927864193654287748219356562873419 +829365174741892653365147892936521748258476931174983526493718265582639417617254389 +236984175749615238815732964584176392162593487973428651621357849397841526458269713 +925764183837215694146893257412387569789651432563429871358942716694178325271536948 +625439187387512694194867523561274839279358416438691752712945368943186275856723941 +625437189387912654194865723468291537279358416531674892712549368943186275856723941 +726538194398412765145976823671245938284369517539781642812653479453197286967824351 +459783261763921584281654937174236859395817642826549713632175498517498326948362175 +875346291296781453341952768938274516562819374417635829754163982123598647689427135 +673584291219376485845129763436718952597432618182695374924861537351947826768253149 +937864251254139768186725934375916482618243579429587316541398627893672145762451893 +947368251215794863638125749123487596456932187789516324561879432394251678872643915 +974368251215794368638125974123487695546932187789516423461879532397251846852643719 +567389241189254763432716589643192875871465932295873416328541697716928354954637128 +475389261638172459912465873723958146891746325546213987267891534359624718184537692 +763498251842531967519726384654372819137985642928164573271853496486219735395647128 +459867231762431859813295674246973185587126493391584762138749526624358917975612348 +359476281672318945814529376461897532798235614523641798945782163186953427237164859 +596437281781952634423816975634271598219568743875349126967184352342695817158723469 +359476281682319745714528396461897532897235614523641879945782163176953428238164957 +495368271781425936623719458967541382342687519158293764514832697279156843836974125 +574836291691254783832791645426918537759362418183547962248673159315429876967185324 +543678291791234865862519374416927538357486129928153746635791482284365917179842653 +364895271891472365527361984175629438439518627682743159248137596713956842956284713 +734859261596217438812364579653791842287435916149628357371582694425976183968143725 +739845261542316897681279543198562734325794186476138925214687359953421678867953412 +835976241692314578741258396368547129427891635159623784916782453574139862283465917 +984753261735621984612849753157962438398417526246385197871296345423578619569134872 +649753281837126954152498673584619732276534198913287465498372516321965847765841329 +514976283236485791789213564195624378823597416467831952348159627651742839972368145 +947651283312784965568239741756123498193468527824597136435872619681945372279316854 +654198273981732456723645198815276349376914825492853617538427961147369582269581734 +496178253827635419135294786682759134743861592519342867968527341371486925254913678 +981657234437921658562384197328479561614835729759162483145298376876543912293716845 +893715264721946835654328179436571982217689543589432617362154798948267351175893426 +369178254452639187871524693743852916286941735915367428597286341134795862628413579 +793185264152746839684239517328567491567914328419328675271453986946872153835691742 +987563214124987653356412987671398542295174836843256179439825761562731498718649325 +978531264124968357356472918681793542295184736743256189439625871562817493817349625 diff --git a/Lab1/Basic_version/soudu.dev b/Lab1/Basic_version/soudu.dev new file mode 100755 index 00000000..a263a0d6 --- /dev/null +++ b/Lab1/Basic_version/soudu.dev @@ -0,0 +1,92 @@ +[Project] +FileName=soudu.dev +Name=soudu +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=main.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=neighbor.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=sudoku.h +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=sudoku_basic.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Lab1/Basic_version/soudu.layout b/Lab1/Basic_version/soudu.layout new file mode 100755 index 00000000..6752ad65 --- /dev/null +++ b/Lab1/Basic_version/soudu.layout @@ -0,0 +1,23 @@ +[Editor_0] +CursorCol=37 +CursorRow=75 +TopLine=66 +LeftChar=1 +[Editors] +Order=0,1,2,3 +Focused=0 +[Editor_1] +CursorCol=1 +CursorRow=59 +TopLine=1 +LeftChar=1 +[Editor_2] +CursorCol=22 +CursorRow=4 +TopLine=1 +LeftChar=1 +[Editor_3] +CursorCol=34 +CursorRow=48 +TopLine=23 +LeftChar=1 diff --git a/Lab1/Basic_version/sudoku.h b/Lab1/Basic_version/sudoku.h new file mode 100755 index 00000000..a97c32f5 --- /dev/null +++ b/Lab1/Basic_version/sudoku.h @@ -0,0 +1,31 @@ +#ifndef SUDOKU_H +#define SUDOKU_H + +const bool DEBUG_MODE = false;//ǷмϢ +enum { ROW=9, COL=9, N = 81, NEIGHBOR = 20 };//Ϊ һΧ20ڵķСС +const int NUM = 9;//1~9 + + +extern int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± + +const int MaxNumPuzzle = 1e6; +extern char puzzle[MaxNumPuzzle][128]; +extern char solution[MaxNumPuzzle][N+1]; + +extern int board[MaxNumPuzzle][N]; +extern int spaces[MaxNumPuzzle][N]; +/********************************/ + + +void init_neighbors(); +int input(const char in[N],int board[N],int spaces[N]); +void init_cache(); + +bool available(int guess, int cell,int board[N]); + +bool solve_sudoku_basic(int which_space,int nspaces, int board[N],int spaces[N]); +bool solve_sudoku_min_arity(int which_space); +bool solve_sudoku_min_arity_cache(int which_space); +bool solve_sudoku_dancing_links(int unused); +bool solved(int board[N]); +#endif diff --git a/Lab1/Basic_version/sudoku_basic.cc b/Lab1/Basic_version/sudoku_basic.cc new file mode 100755 index 00000000..6ea11534 --- /dev/null +++ b/Lab1/Basic_version/sudoku_basic.cc @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include "sudoku.h" + +//int board[N];//һάֵΪ +//int spaces[N];//ĿոֵΪе± +//int nspaces;// Ŀո +//int (*chess)[COL] = (int (*)[COL])board;//Ψ̵Ķά + +static int find_spaces(int board[N],int spaces[N])//пո¼ոһά +{ + int nspaces = 0; + for (int cell = 0; cell < N; ++cell) { + if (board[cell] == 0) + spaces[nspaces++] = cell; + } + return nspaces; +} + +int input(const char in[N],int board[N],int spaces[N])//ַתΪһάֵ +{ + for (int cell = 0; cell < N; ++cell) { + board[cell] = in[cell] - '0'; + assert(0 <= board[cell] && board[cell] <= NUM); + } + return find_spaces(board,spaces); +} + +bool available(int guess, int cell, int board[N]) +{ + for (int i = 0; i < NEIGHBOR; ++i) { + int neighbor = neighbors[cell][i]; + if (board[neighbor] == guess) { + return false; + } + } + return true; +} + +bool solve_sudoku_basic(int which_space,int nspaces,int board[N],int spaces[N])//ݹ +{ + if (which_space >= nspaces) { + return true; + } + int cell = spaces[which_space]; + + for (int guess = 1; guess <= NUM; ++guess) { + if (available(guess, cell,board)) { + assert(board[cell] == 0); + board[cell] = guess; + if (solve_sudoku_basic(which_space+1,nspaces,board,spaces)) { + return true; + } + + assert(board[cell] == guess); + board[cell] = 0; + } + } + return false; +} diff --git a/Lab1/Basic_version/sudoku_solve b/Lab1/Basic_version/sudoku_solve new file mode 100755 index 00000000..89280f87 Binary files /dev/null and b/Lab1/Basic_version/sudoku_solve differ diff --git a/Lab1/Basic_version/test1 b/Lab1/Basic_version/test1 new file mode 100644 index 00000000..8d81622c --- /dev/null +++ b/Lab1/Basic_version/test1 @@ -0,0 +1 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 diff --git a/Lab1/Basic_version/test10 b/Lab1/Basic_version/test10 new file mode 100644 index 00000000..7c92edad --- /dev/null +++ b/Lab1/Basic_version/test10 @@ -0,0 +1,10 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 diff --git a/Lab1/Basic_version/test100 b/Lab1/Basic_version/test100 new file mode 100644 index 00000000..c31b7ab8 --- /dev/null +++ b/Lab1/Basic_version/test100 @@ -0,0 +1,100 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 diff --git a/Lab1/Basic_version/test1000 b/Lab1/Basic_version/test1000 new file mode 100644 index 00000000..c21f3fbe --- /dev/null +++ b/Lab1/Basic_version/test1000 @@ -0,0 +1,1000 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 +000000061050700000200009000000800300401000000600000000000060080030040000020000700 +000000061070005000400030000300000200000100070000800000001600000000070400500000300 +000000061070040000000000000102006000000080300500000000030000740600501000000200000 +000000061070500000000000000900460000050000200000000700601000030300200000000708000 +000000061070500000000400000603050000000200100000000040200006000000039000010000800 +000000061070800000500090000000600300302000000400000000000030040010002000060000900 +000000061200030000000000000000070240060500000000000300005601000300000820000700000 +000000061200030000400000000020801000500600700000000040081000000000070400003000000 +000000061200300000000000000000160000020040000800000300060000740000800200003500000 +000000061200500000800000000000200700037000000060400000100000200000038000000060040 +000000061200500000800000000000200700037000000060400000100000200000068000000030040 +000000061200700000000800000013060000050400200000000700000010050700000400800000000 +000000061200700000000800000013060000050400700000000200000010050700000400800000000 +000000061200800000000000000000402800063000000000700000000036200410000000000010050 +000000061300020000000700000017000000000080500090000000500000380600401000000900000 +000000061300700000090400000710080000000300400000000020000062000500000900000010000 +000000061300800000000000000500000400000014000000070800010620000000500390007000000 +000000061350000000400050000020000800000601000000700000000080200600400000007000010 +000000061400003000000700000010690000020000300000000000304000200000180050700000000 +000000061400030000000500000026000080000070000010000000500200300304000700000100000 +000000061400070000000090000000608200901000000200100000000050400060300000000000090 +000000061400070000020000000061500000000030740500000000005108000700000400000000000 +000000061400200000900000000067015030010070000000000400200800500030000000000000000 +000000061402000000030000000380000400000602000000100000006500000100000070000080300 +000000061403000000020000000308000400000602000000100000060500000100000070000080300 +000000061480000000000000000000520400000030000060000000530006070200000800000107000 +000000061500020000970000000061400000000050900000000080000806000300000500000700000 +000000061700020000000000000060530000010000200000000400000107030208000000400300000 +000000061700400000800000000000720400300000000000010000009800700010000500060000020 +000000061800007000000020000032100000000650800000000000000003720910400000000000000 +000000061890000000000000000000520400000030000060000000530006070200000800000107000 +000000061890000000000000000000520400000030000060000000530006070200000900000107000 +000000061900200000000400000070068030200000700000010000006050000000900200040000000 +000000062800300000000000050040200100060000040000000700001056000700000300000040000 +000000063000100000200000000050000100000400200009006000630090000000200740008000000 +000000063000500004080000000603000700000010500400000020010000200000406000000700000 +000000063020040000000001000040000210000370000000500400503600000000000700800000000 +000000063020040000000001000040000210000370000000500400803600000000000700500000000 +000000063800090000000000010005020400010000000000000200200600500000103070000400000 +000000064005800000000000020160000300000300500020000000000267000309000000000040000 +000000064300800000000000010041000070050008000000900500906000800000010000000000200 +000000064500080000000000010000305700010000040000070000708000200000600800000100000 +000000065000300000000010000000040170509000000000000800270500000010000300000906000 +000000065000710000040000000000053000080000200000000100003200700506000000100800000 +000000065040800000000000001006000800030000700000010000000700230400002000501000000 +000000065900200000000000000000900240053000000000000000060057000100006800000030900 +000000067003900000010000004600004000050010000000000100000800520007000300400000000 +000000067060200000000000040000860300401000000700900000070004000900000200000010000 +000000068030070000100000020070000450000208000000400000000030100200600000000000900 +000000068030070000400000020070000450000208000000100000000030100200600000000000900 +000000068030090000700000020010000350000208000000400000000030100200600000000000500 +000000068100000000000000030060030000000400100008000200400200500730000000000108000 +000000068350000000000010000100000500000800400009000000060205000000400300007000010 +000000068350000000000010000100000500000900400006000000070205000000400300008000010 +000000068900000002000400500041000000000035000050000000000800010300000700000100400 +000000069070000040050800000000507200300100000600000000000030008400060000000000500 +000000069800040000000010000000300800010000400650000000701000200000905000000600000 +000000071000040000600000000000705000200000600000100300087000050010300000000060400 +000000071000052000000000000000008540710400000300000000460070000005000200000300000 +000000071000208000000600000501000000000300200700000000030040600260000000000070050 +000000071000520000000000000000070080300001000204000000500600200000300600070004000 +000000071000580000000000000000031060200400000508000000070006000030000500000100200 +000000071000604000000000000500400600102000050700000000000071000080020000030000900 +000000071000604000000000000500800600102000050700000000000071000090020000030000800 +000000071000800000000300000040000300270000000000500800600070500008060000000010040 +000000071000904000000000000500400600102000050700000000000071000080020000030000900 +000000071002500000000000000780000030000420000000100000050007200004600500300000000 +000000071005020000040000000100300000000009400800000000060000950300710000000800000 +000000071006090000000000050102000000000060300050000000070504000800000600000200400 +000000071020400000500000000080000600000037000000010000000600240300500000109000000 +000000071020400000600000000080000200000037000000010000000200540300500000109000000 +000000071020600000000000000100073000060000200500000000000260400703000050000800000 +000000071020800000000403000700060050000200300900000000600070000080000400000050000 +000000071030020000000000000000000250600100000000080300020000530400601000000700000 +000000071040050000000600000000100600080000500000007003107000060000080200300000000 +000000071050003000040080000030000500200100000600000000000040300700000040100600000 +000000071050008000000000000060040030200170000000300600000002500401000000700000000 +000000071050080000000000000600103000020000890000400000000700200100040000403000000 +000000071050600000200009000000800300407000000100000000000010020030040000020000600 +000000071060005000000000000080000630400170000000200000907020000000003800000000500 +000000071060020000000030000700060300400000200100400000000105080020000000000700000 +000000071060020000000030000700060300400000200100400000000705080020000000000100000 +000000071060020000300000000050000260000108000000300000000430500108000000007000000 +000000071060030000000020000700060300400000200100400000000105080020000000000700000 +000000071060030000000020000700060300400000200100400000000705080020000000000100000 +000000071060300000500000000000040050007010000020000600000500900400600000801000000 +000000071060500000000000000005040600030000200000007000000800540107300000200000000 +000000071080300000000200000407020000000600800100000300500070040030000600000000000 +000000071080400000000500000100072000050000630000000000000380400207000000600000000 +000000071090800000000000000400300600701000050000902000060000300500070000000000900 +000000071200050000030060000701300000000000640800000000000107000040000500000002000 +000000071200300000860000000000500630004200000700000000000071000050000800000040000 +000000071200600000300000000000510007604000200000008000050000040000200600010000000 +000000071200900000000000000000600830071400000500000000640000200000050600000007000 +000000071300200000000000000000060300010030000004000000600000540000407200800100000 +000000071300200000000400000000078040200000300050010000400000500007060000000500000 +000000071300500000000000000000308500002600000070000000000070320800050000010040000 +000000071300500000600400000000072000080010000400000000070020000000300600000000540 +000000071300800000080000000005041000020000300000070000601000040000200600700000000 +000000071400030000000200000020700000000040300000000500000102060308000400500000000 +000000071400080000000000000000170050820000000300000000001703000600000800000500400 +000000071400500000600000003050037000200000800000010000000800040000400200010000000 +000000071400900000300500000000300450070060000000000900000072000080010000500000000 +000000071500020000000800000047000000000090600010000000600000250700103000000400000 +000000071500030000000600000600000800200400000000702000000080300041000000070000020 +000000071500400000300000000400306500010000060000200000080000200000017000000080000 +000000071580000000030900000407200000000000810060000000200000500000067000000010000 +000000071600040000000000000087500000000020900010000000300800600406000020000100000 +000000071600200000800000000070031040000600500200000000030070000000500600000000200 +000000071600200000900000000400650300010000080000400000070081000020000600000000000 +000000071600500000040000000502600030000900600070000000000013000800000900000070000 +000000071600500000200000000340010000000070620000000500000600300080400000010000000 +000000071600500000300400000000072000080010000400000000070020000000300600000000540 +000000071800020000300000000076500000000030200010000090400600800050100000000000000 +000000071800030000000000000670200000000090300000000500020701000500000830000400000 +000000071800040000000000000070200000030000800000090400000701030400500600900000000 +000000071800040000000000000670200000000090300000000400020701000300000840000500000 +000000071800300000400050000670000500000012000000400000002000050000800400010000000 +000000071900000060020000000004070000030000400000910000700600008000300200100000000 +000000071930000000000000000000620400000030000070000000650007080200000900000108000 +000000072000051000000000000000060180720300000400000000300200000000400600008000500 +000000072006800000000000050170000300000400800020000000000217000309000000000050000 +000000072010000000000060000000700510902000000400000000000510600300000009000807000 +000000072080500000010000000200097000000000100300000000703000060000180500000400000 +000000072080500000010000000200097000000000800600000000703000060000180500000400000 +000000072080600000010000000400097000000000800300000000703000040000180600000500000 +000000073200500000000000610003100000000900040800000700000086200010000000000030000 +000000074002800000000000003070530000600000010000000200540000600000071000700000000 +000000074010030000000000080000010520700600000400000000053000100000708000000000200 +000000074010030000000000080000010520700600000400000000053000100000807000000000200 +000000074150000000000000008010000230600048000000070000200500100000300000004000000 +000000074200050000000000001000104030500000600008700000000390800010000000000000200 +000000074500100000000000009800009500000040000000000010070200600000080300040700000 +000000075320000000000000008010000240600058000000070000200400100000300000005000000 +000000075400060000000000010002105000000700040600000300000390800010000000000000200 +000000075400060000000000010002105000000700040900000300000390800010000000000000200 +000000075400060000000000010003105000000700040600000300000390800010000000000000200 +000000075400060000000000010003105000000700040900000300000390800010000000000000200 +000000075620000000000000008010000240300058000000070000200400100000300000005000000 +000000076060200000000000050000860400501000000700900000030005000900000200000010000 +000000076400900000000000080008070000000200400090000300200000530000006001000080000 +000000078500200000000000600067000050080000020000300400300000102000070000000006000 +000000078500300000000000010400070200000018000030000000060400500000000430001000000 +000000078600000050000040000058000000000001300040000000300600100000250000000700400 +000000079030080000500000020080000560000209000000400000000030100200700000000000400 +000000079030080000500000020080000560000209000000400000000040100200700000000000400 +000000081000090030700004000000200600030800000010000000000010403500600000200000000 +000000081000090040700005000000300600040800000010000000000010504300600000200000000 +000000081000409000000200000060081000004000230000000000380070000200500900000000000 +000000081000602000300700000604000700000090010700000000500400200010080000000000000 +000000081020030000000000000000060320700450000100000000500708000060000200000100000 +000000081020040000000700000000050620300090000100000000040300200500008000000100000 +000000081020300000000000000109000040000200500800000000000580200070000300600010000 +000000081020300000040006000000600420801050000000000700000400200500080000000000000 +000000081020300000700000000040000700000018000000050000000600230500400000106000000 +000000081020500000000000000400031000700000200060000000000260500103000040000700000 +000000081020600000400000000090000200000038000000010000000500720300400000105000000 +000000081020700000000000000000900250800000030400000700600018000050000300000040000 +000000081020700000000403000100060050000200300500000000800010000040000700000050000 +000000081020700000000403000100060050000200300500000000800010000070000400000050000 +000000081020700000500000000060000200000038000000010000000600740200500000103000000 +000000081020700000500000000090000400000038000000010000000600240300500000106000000 +000000081030005000000000000500074600109000000000000000080000370600910000000200000 +000000081030005000000000000500074600901000000000000000080000370600910000000200000 +000000081030020000000700000000050620400090000100000000020400300500008000000100000 +000000081030020000000700000000050620400090000100000000060400300500008000000100000 +000000081030200000000000000108060040000700300600000000500300700090000200000010000 +000000081030200000000000000108060040000900300600000000500300700070000200000010000 +000000081030200000500000000000600230100400000700000000400070000000010800060000300 +000000081030500000000020000100007000000080500050000400600100070000403000800000000 +000000081030500000000020000100009000000080500050000400600100070000403000800000000 +000000081030600000000020000500007000000080600060000400100500070000403000800000000 +000000081030600000000020000700009000000080600060000400100500070000403000800000000 +000000081040300000020006000000600420801050000000000700000400200500080000000000000 +000000081050600000200009000000700300408000000100000000000010070030040000020000600 +000000081060020000300000000050000260000107000000300000000430500701000000008000000 +000000081060500000300000000500028000070000400000010000000600730002400000100000000 +000000081060500000700000000200600500008000020100300000040021000050000600000000000 +000000081060700000000200000040000600000083000000000020000502700308040000100000000 +000000081070600000300000000400018000030000500000020000000500760002400000100000000 +000000081070600000300000000400028000030000500000010000000500790002400000100000000 +000000081080000020300000000016000000000500600090200000000091000500000300400080000 +000000081090005000000000000070000630400810000000200000201060000000003500000000700 +000000081090005000000000000070000630400810000000200000201060000000003700000000500 +000000081090300000000200000708040000000600900100000300500080040030000600000000000 +000000081100060000070050000009000760000102000000800400000300500800000020000000000 +000000081200060000000000000048500000000020300010000000500000670000103000700400000 +000000081200060000000700000000408070630000000000100000004000600000050200018000000 +000000081200400000000000000000230700010000050008600000700000400090080000000050200 +000000081200500000030000000020406000001000070000200000008010000000030200700000400 +000000081200500000030000000020406000008000070000200000001080000000030200700000400 +000000081200600000000000000089010050000403200000000600400000700000250000000080000 +000000081200700000000000000000230700010000050008600000700000400030080000000050200 +000000081200700000000000000000230700010000050008600000700000400040080000000050200 +000000081200700000000000000000230700010000050008600000700000400090080000000050200 +000000081200700000000500000000080650400010000500000700060300000089000000000000400 +000000081200700000960000000000500630004200000800000000000081000050000900000040000 +000000081230000000040700000000600370005300000100000000400000200000058000000010000 +000000081250000000060700000000500670004200000100000000300000900000048000000010000 +000000081300020000000700000048000000000060200010000000600000350700504000000100000 +000000081300200000000074000200000560700010000000009000000800200014000000090000000 +000000081300600000090400000680070000000300400000000020000012000500000300000080000 +000000081360000000040700000500000300000021000000080000002000010000400600400300000 +000000081400300000300050000190000500000028000000600000082000050000400700000000000 +000000081400300000300050000190000500000028000000600000082000050000700400000000000 +000000081400300000300050000190000500000082000000600000082000050000400700000000000 +000000081400300000300050000190000500000082000000600000082000050000700400000000000 +000000081400300000300050000610000500000082000000700000002000050000600400080000000 +000000081400300000300050000680000500000012000000700000002000050000600400010000000 +000000081500400000073000000000028000060000300000010000000600740200500000100000000 +000000081600002000000700000500000360800100000000400000000060200047000000010030000 +000000081600030000000200000020800000000040300000000500000102070304000600500000000 +000000081600040000000230000400000050300700000000100000000050300010000200087000000 +000000081600070000000000000000801040702000000300400000200000700000060300080500000 +000000081600070000000000000000805040702000000300100000200000700000090300080500000 +000000081600200000000000000010089000503000200000000600000300570240000000080000000 +000000081600400000500700000012000000080090000000500000000010050030000600700000400 +000000081600500000040000000502700030000600700080000000000013000900000600000080000 +000000081690000000040300000508200000000000910070000000300000600000018000000070000 +000000081700050000020000000601200000080000040000090300300004000200000500000800000 +000000081700060000000000000400507000600000720000100000058200000000030200010000000 +000000081700200000200000000000510030050040000600000800000700900003006000010000000 +000000081700300000400050000610000500000082000000400000002000050000700400080000000 +000000081700400000000200000400000300005010000000090000010350000200000640000000700 +000000081700600000300500000000082000090010000500000000080040000000300700000000650 +000000081700600000500000000040081000000000290000030000000504700600200000080000000 +000000081900400000700600000082000000010050000000700000000080050030000900600000400 +000000082000031000000000000080420000400000100000500000601000300000200050700000600 +000000082000031000000000000080420000700000100000500000601000300000200050400000700 +000000082005060000010000000090302000000100500800000040600040000300000001000000300 +000000082040600000010000000200098000000000100300000000803000070000410600000500000 +000000082500006000000000090600000300000920000000000040000053100090600000008000700 +000000082500300000000000000300072000400000630000010000000800500081000000020000007 +000000082600400000000000000400072000500000430000010000000800600081000000020000007 +000000083000014000000200000000320000090000400000700000000006150308000000200000600 +000000083000030010070000000000204000030000600000010000200600405000500700100000000 +000000083020100000000000040000610200800000900004000000060300500100000070000008000 +000000083020700000000000040000610200800000900004000000060300100500000070000008000 +000000083040300000000500060300000400000700500208000000050060100000002000000080000 +000000083400020000000000510002300000700000600000100040000075200010000000000800000 +000000083500400000000100000000020700100000400000008000038600000020070000000000520 +000000083900100000000000020100009700020080000000000100005700400003000060080000000 +000000084000100000200000000000600130408000000050000000560000200000080007010030000 +000000084000510000000030000400000200300008000000600070000200403076000000000000100 +000000084050010000000000050000030620800200000400000000073000100000508000000000900 +000000084100600000000000000000040103030020000500000600048000020000701500000000000 +000000084600010000000000000500000106000800300070200000087000020000063500000000000 +000000084750000000000000009010000730600049000000080000200500100000300000004000000 +000000085004070000000000030100060700570000100030800000006200000000503000000000000 +000000085200030000000000030040010600058000000000700000700400100000500200000008000 +000000085760000000000000009010000640300059000000080000200400100000300000005000000 +000000086320000000000000009010000250700069000000080000200500400000300000006000000 +000000087004010000000000030100060500570000100030800000006200000000703000000000000 +000000087004050000000000030100060500570000100030800000006200000000703000000000000 +000000091000020000000400000507000200100900000860000000040000080090001000000070300 +000000091000030000000500000608000300200900000170000000050000020090001000000080400 +000000091002080000040700000050061400000090000300000000000300750900000000000200000 +000000091020400000000000000000380200700090000000000400040500600900010070000200000 +000000091020700000600000000080000500000039000000010000000600840300500000107000000 +000000091030600000000020000700008000000090600060000400100500080000403000900000000 +000000091060005000000000000080000630400910000000200000201070000000003500000000800 +000000091060005000000000000080000630400910000000200000201070000000003800000000500 +000000091060070000000000000005030760000000200100000000300100004082000000000409000 +000000091060070000000000000005030760000000300100000000300100004082000000000409000 +000000091070020000000004000000380000040000900000100000300000640000005700100800000 +000000091070080000000000000006040870000000300100000000400100005032000000000509000 +000000091080040000400000000000720500801000060900000000020000300000601000000900000 +000000091080200000000000000930000800000014000000500000104000070000600200000380000 +000000091080600000000030000000700260500400000100000000030050800000019000400000000 +000000091080600000000030000000700280500400000100000000030050800000019000400000000 +000000091200050000000000000500000240700800000060100000089400000000060300010000000 +000000091200400000030000000060507000009000080000200000001090000000030200800000400 +000000091200600000000000000040010600000039000070000200000400570300800000100000000 +000000091200800000600000000040091000000000250000030000000604800700500000090000000 +000000091300040000500600000007200600090000080000300000200000500000091000000080000 +000000091300200000000085000600000270800040000000001000000600500049000000010000000 +000000091400070000000000000700300000800000400000106000019500060000040700200000000 +000000091400070000000000000700300000800000400000106000019500060000040800200000000 +000000091400300000000000000000219000200000850000060000090000060000400700300000400 +000000091400300000300050000710000500000092000000600000092000050000400800000000000 +000000091400300000300050000790000500000012000000600000012000050000400800000000000 +000000091500080000200000000000720600010300000090000000640100000000000520000000800 +000000091500200000300000000080700040090000600000500000200060500010090000000003000 +000000091600300000070000000400000500000029000000010000000500680310000000020800000 +000000091600700000200000000700000010000600500000450000030081000040000600005000000 +000000091600700000800000000040091000000000250000030000000604800200500000090000000 +000000091600700000800000000040091000000000250000030000000604800700500000090000000 +000000091603000000500000000090100040000002300700000000300000700000410000000980000 +000000091630000000000000000019080000000020400000000600200600300000703050000400000 +000000091630000000000000000051080000000020400000000600200600300000703050000400000 +000000091630000000000000000091080000000020400000000600200600300000703050000400000 +000000091700000030000200000090010080005000600200000000080090000000600400000700200 +000000091700030000200500000600000200040900000000000000500008040090001000000020300 +000000091700030000200500000600000200040900000000000000500008040090001000000060300 +000000091700400000000030000000651000200000370000000000000800200054000000310000000 +000000091700400000000380000000500800029000000010000000600002000000060010500000300 +000000091700400000200000000500290000000080010040000600081000400000700300000000000 +000000091700800000200000000000510030020040000600000900000700600003006000010000000 +000000091700800000200000000000510030050040000600000900000700200003006000010000000 +000000091700800000200000000000510030050040000600000900000700800003006000010000000 +000000091700800000200000000000510030070040000600000900000700200003006000010000000 +000000091700800000600000000040091000000000250000030000000604700200500000090000000 +000000091800200000000400000060017030200000600000090000001050000000800200040000000 +000000091800200000200000000000510030050040000600000900000700800003006000010000000 +000000091800300000300050000470000500000092000000600000002000050000800400090000000 +000000091800700000200000000000510030090040000600000900000200800003006000010000000 +000000092010400000000000000030100400100060000000020007000500830209000000600000000 +000000092700000010000300000090020080005000600300000000010090000000600400000700300 +000000093000014000000200000000320000040000500000800000000007160309000000200000700 +000000093480000000010000000503000060000010800000000000170000400000902000000300005 +000000094000400070100000000208000600000750000000000100030060500047000000000002000 +000000094030090000000000060070000820200600000000004000000750300906000000000000100 +000000096200030000000000030050010700069000000000800000800400100000600200000009000 +000000097000050000000040000107200000040000300000900000600701000030000450000000800 +000000097300400000000000020600098100400007300000020000072000000000100000080000000 +000000100000300000900000000700100600200000090000500000008020040010006005050090000 +000000100000500000200000000035400000000010700080000200004000059600002000000070030 +000000100000500000200000000035400000000010700080000200004000059600070000000002030 +000000100000500000200000000035400000000010800070000200004000095600008000000020030 +000000100000500000200000000035400000000010800070000200004000095600020000000008030 +000000102000000340005080000360000000000090050010000000100403000007000600000100000 +000000102000300500000608000000400030200050000100000000000070200080010000030000060 +000000102000300500000708000000400070600050000100000000000040600070010000030000040 +000000102000300600000408000000500040200060000100000000000070200050010000040000030 +000000102000300600000709000000400030200050000100000000000080200040010000030000070 +000000102000300600000809000000400080200050000100000000000070200080010000030000060 +000000102000300700000409000000500040200060000100000000000080200090010000040000030 +000000102000300700000809000000500080200060000100000000000010600080040000030000070 +000000102030000400000700500080000030000015000000020000000300064201000000900000000 +000000102040700000300500000008001000600000070000020000002000600000600300010070000 +000000102080300000000000500000690080001000000500000000060000470000201000700050000 +000000102400050000000000900060070080001000000000300000000001460320000050000900000 +000000102500600000000000000023000700000405000010000300000170000000020080800000040 +000000102700050000000000800060070040001000000000300000000001460320000050000800000 +000000102700050000000000900060070080001000000000300000000001460320000050000900000 +000000102700400000000000800300000640400009000000010000012600000000500030090000000 +000000102900050000000000800040060070001000000000300000000001460320000050000800000 +000000102900050000000000800060070040001000000000300000000001460320000050000800000 +000000103000400500670000000000020070300000000001000000000063400007500000020000080 +000000103020090000000000400000025080010000000400000000300104000008000020000700600 +000000103020400000000670000070000400000001000000000070000240060301000500800000000 +000000103080020000000004500030000020000500070000100000100300600700080000005000000 +000000103800050000000000700060020040001000000000300000000001460420000050000700000 +000000103800600000200000700000406080010000000000700000008003000030010000400050000 +000000103900050000000000700060020040001000000000300000000001460820000050000700000 +000000103900050000000000800060020070001000000000300000000001460720000050000800000 +000000104000003600000050002503000000200600000000100080000070230010000000000400000 +000000104000010800600700000391000000080500000000200000506000070400080000000000000 +000000104000060000000050000200430000000107000600000800010500000070000040000000023 +000000104000080300040050000000200070300000600001004000870000050000300000000100000 +000000104000702000000000000460010000000500070100000000000380600027000030004000000 +000000104000802000000000000460070000000600080100000000000340700028000050009000000 +000000104080900000000000500000702080001000000500000000000530600020000030400010000 +000000104702000000000000000000705020300600000010000000200000630050014000000080000 +000000104800070000000000600700200000000104000030000080012000000000050030604000000 +000000104800090000000000600700200000000401000030000090012000000000050030604000000 +000000105000700400700200000000500080403000000061000000500000020040060000000010000 +000000105002000600030800000100000400000308000000200000570000030400060000000010000 +000000105002600000000902000300000090000070800000010000710000500000200040080000000 +000000105004070000000000300150300000000600080020000000000051200006000070800000000 +000000105030800000000000000000012000060000030000000700102000400500360000000700080 +000000105030800000000000600020030000500006000000000270601000004000200030000070000 +000000105200007000000030600009000400010500000000002030300000070000980000000100000 +000000105200800000000000300000071000000004800300050000000300026004000050010000000 +000000105300040000000000000000080720905600000000000040020000800000100030000509000 +000000105302000000000000000000206030710000000000300000400000820070015000000090000 +000000105802000000000000000000406030200300000010000000400000720060015000000090000 +000000105802000000000000000000406030400700000010000000300000720060015000000090000 +000000105802000000000000000000806020300700000010000000400000730060015000000090000 +000000105802000000000000000000806020400700000010000000200000730060015000000090000 +000000105802000000000000000000806030300700000010000000400000720060015000000090000 +000000106000025000300000000009100400000400000000000020520000080000630700000007000 +000000106020000500000082000010000200000040030000500000703000040400600000000001000 +000000106020070000800000500097000030000500040000100000000020780100600000000000000 +000000106020070000900000500078000030000500040000100000000020780100600000000000000 +000000106030070000400000500078000020000500040000100000000020780100600000000000000 +000000106030070000900000500078000020000500040000100000000020780100600000000000000 +000000106040700000000500300070000450600010000000000000000450020300000080100000000 +000000106040800000000500300070000450600010000000000000000480020300000090100000000 +000000106200005000000000800320000070000010000000800000071000400000023050000600000 +000000106302000000000000000000207030400800000010000000500000840070016000000090000 +000000106302000000000000000000507030500800000010000000200000840070016000000090000 +000000106390000000000000500000610200870000000000500000000407030001050000000000080 +000000106402000000000000000000207030500800000010000000300000840070016000000090000 +000000106402000000000000000000507030500800000010000000200000840070016000000090000 +000000106402000000000000000000507030500800000010000000300000840070016000000090000 +000000107000001300800040000500300000006000040200000000000200050010000200030700000 +000000107000001300800050000200300000006000050400000000000200040010000200030700000 +000000107000025000300000000004100600000400000000000020520000090000730800000008000 +000000107000500300000602000800000026600000040000010000410000700000200000030000000 +000000107000800300800200000000700090403000000061000000500000020090060000000010000 +000000107000800400200300000000700090504000000061000000300000020090060000000010000 +000000107000800400800300000000700090504000000061000000300000020090060000000010000 +000000107000902000000500600900000850000010000400000000007400020010000030060000000 +000000107020030000000000600000040020700600000100000000040200050008000300000105000 +000000107024000000000500600030000050000100400900000000000039020700000008001000000 +000000107040080000900000600028000030000600050000100000000020890100700000000000000 +000000107040080000900000600082000030000600050000100000000020890100700000000000000 +000000107090020000000000004000401500020003060000700000000090030400800000100000000 +000000107400200000080300000200000480000076000000000000567000000000400030001000000 +000000107400200000100000000098000050070000006000100000000095300000070400000000020 +000000107830000000000060400600200050000107000000000000071400000000050680000000000 +000000107900020000000000800000701500400000030000900000000340060008000020010000000 +000000108000008300700040000500300000006000040200000000000200050080000200030100000 +000000108000008300700050000200300000006000050400000000000200040080000200030100000 +000000108000407000000500300040000620000010000020000000701000050000200070300000000 +000000108000600400200300000000800090504000000071000000600000020090070000000010000 +000000108000605000000400300040000620000010000020000000106000050000200070300000000 +000000108009400000000300700600000040000020000000010000370005000010000200000600080 +000000108040200000000600000020400030700010500000000000100080000000000340000000026 +000000108050400000000200000020500030700010600000000000100080000000000350000000042 +000000108200300000600000000010054000000000020000008000000230040080000500700600000 +000000108200700000000000300500000090000038000020010000010000400000500020007600000 +000000108300060000000000500900000600000800020000401000085000001000030070040000000 +000000108400200000100000000089000050070000006000100000000075300000080400000000020 +000000108500040000000000700030050020001000000000200000000001360820000040000700000 +000000108500200000000000400900000050000340000000060200000605070041000000000000030 +000000108600200000000000400200000050000340000000070300000605020041000000000000030 +000000108600300000200000000010058000000000020000001000000230040080000900700600000 +000000108700400000000000000000038600400000070000010000000500064035200000010000000 +000000108900040000000000700030050060001000000000200000000001350820000040000700000 +000000108900040000000000700050060030001000000000200000000001350820000040000700000 +000000109000200300040070000070000080000300000000100000203000600000004050100080000 +000000109000400200000508000000300080100000040200000000060000730430000000000010000 +000000109000807000000500300040000620000010000080000000701000050000400070300000000 +000000109040200000030000400600405020100000000000700000000000870000019000000060000 +000000109200600000000050400000010500000700030300000000000802060014000000000000070 +000000109300400000000000200027006000000800500009000000510020000400000030000090000 +000000109400050000000020300000109000500007000000300000013000000080000040009000020 +000000109400050000090020000000401700060000000000700000000060020700300000801000000 +000000109700008000000000000360000080010590000000000020000140600205000000000900000 +000000109700400000000000000000039600400000070000010000000500084035200000010000000 +000000120000040700030007000057000008000410000000200000000000053400600000100000000 +000000120063000000000000000040000503100208000000700000500000080002600000000030400 +000000126000850000000000004000300700400001000105000000070000380000046000000000000 +000000126000950000000000004000300800400001000105000000030000790000046000000000000 +000000130000080005420000000600000020005010000000000400070402000000600200000000001 +000000130020400000000000000000600025700080000100000000000016700005200000040000300 +000000130040020000000000000000000026700900000100000000062050004000107300000800000 +000000130047000000050000000100302000000050007000000040800000200000603000000740000 +000000130200600000700500000040010300000200050010000000500000007000084000000030000 +000000130400070000800000000000506200700300004000100000000080076015000000000000000 +000000130800600000200500000040010300000200050010000000500000008000074000000030000 +000000135608000000000000040030400010000027000050000000200000706000000200000300000 +000000135608000000000000040050400010000076000030000000200000706000000200000300000 +000000135807000000000000040030400010000076000050000000200000706000000200000300000 +000000136087000000000000050000740900360000000000000000004080200600305000000000000 +000000140090020000000000000000107400950000000000400000001000302000090050800600000 +000000140090020000000600700401000000000580000300000000080000502000001030000400000 +000000140400000600000500000000305008200700000106000000050000083600010000000000000 +000000150080020000000000000000501400870000000000400000001000320000080007500600000 +000000150900700000000000030042000700001030000050000000200600800300400000000050000 +000000160000009500000040000041020000000300600080000000700000024300900000000000008 +000000160020700000000000900600010000000040002030000000100000470000300005800200000 +000000160040020000000009070300100000000000402600000000000630500029000000000800000 +000000160200040000000000708000530020007000050010000000300006400000107000000000000 +000000160200070000300000800000608900420000000000500000000010002008000050060000000 +000000160200070000300000800000608900420000000000500000000040002008000050060000000 +000000160800400000000000700000070600010030000200000050000208000076000000000500004 +000000170000004600000050000051020000000300700080000000700000025400900000000000008 +000000170020900000000000600600010000000040002030000000100000460000300005800200000 +000000170030040000000000600600100000000006030005000004000650200740000000000800000 +000000170040800000000000002000500048200070000100000000000010260080600000000000300 +000000175049600000000000000500000300100090000000420000020000049300001000000000000 +000000180000205000000003000010080000000600002003000000000040710600000300200500000 +000000180300500000000000020061000000000300400008000000710000300000086005000020000 +000000180300900000000000020068000000000300400001000000710000300000086005000020000 +000000190300400000000000020071000000000300500009000000810000400000097006000020000 +000000201000020500080004000000230000090000040000500000602100000500000300000000070 +000000201000080400300050000000204000500000070000600000004100002020000600000000030 +000000201000370000000000000430010000000002600080000070000800530001000020700000000 +000000201004030000000000000370000080600200000000500000540000600000070040002001000 +000000201005090000038000000120400000000030080700000000000000430000201000000600000 +000000201005090000038000000120400000000030080700000000000000530000201000000600000 +000000201009050000400700000600102000000000030000800000000040690710000000000030000 +000000201030070000000400800000050040801000000006000000200801000050000700000000090 +000000201040030000000006000600072000030000040000100500201800000000000730000000000 +000000201060400000003000000200070100500020000000000060100000500000308000000600040 +000000201070300000000000000060000030000205000000041000005780060100000400200000000 +000000201080050000000000000600201000000500740000300000000084050302000000100000000 +000000201080300000000000000060000030000205000000041000005780060100000400200000000 +000000201080400000000700000000540080302000000100000000500032600070000040000000000 +000000201090004000030000000000008530700000400100000000200670000000020800000100000 +000000201090030000000000004006000530300400000000100000000090080204000000170000000 +000000201090400000000300000170020000000008600000000050208000500000900040006000000 +000000201096000000000000500000090040200030000100000000070502000000006083000100000 +000000201500300000000070000000500030020004000076000000000000350000021000800000400 +000000201600300000700000000008540000020000030000600700010082000500000060000000000 +000000201730000000600040000000060030008000500200000000001200000000508000060000070 +000000201800000900000400000000610030270000000900000000090072000001000040000800000 +000000203006400000000000500100600070820000000000830000000059000050002000000000040 +000000203010700000000000000000023400090060000800000000000800019600900070200000000 +000000203080700000000000100005000040300010000000000600000407060100000080200500000 +000000203800600000000000700002000100040800000000300060000027040300000005000010000 +000000204000001000000080000020400500000030700000000080100200006806000010000700000 +000000204001000000050000000006500080200009000000000010000150700940000300000800000 +000000204050030000000000690000850010206000000900000000000206000130000000000400000 +000000204050700000680000000300000090000014000000020000201000000000800050000600700 +000000204100900000000000007670300000000100830040000000000025000500000090000040000 +000000204100900000000000008680700000000100730040000000000025000500000090000040000 diff --git a/Lab1/Basic_version/test20 b/Lab1/Basic_version/test20 new file mode 100644 index 00000000..51572ddf --- /dev/null +++ b/Lab1/Basic_version/test20 @@ -0,0 +1,20 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 diff --git a/Lab1/Basic_version/test200 b/Lab1/Basic_version/test200 new file mode 100644 index 00000000..0724da84 --- /dev/null +++ b/Lab1/Basic_version/test200 @@ -0,0 +1,200 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 diff --git a/Lab1/Basic_version/test30 b/Lab1/Basic_version/test30 new file mode 100644 index 00000000..159fa02e --- /dev/null +++ b/Lab1/Basic_version/test30 @@ -0,0 +1,30 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 diff --git a/Lab1/Basic_version/test50 b/Lab1/Basic_version/test50 new file mode 100644 index 00000000..0c691fc1 --- /dev/null +++ b/Lab1/Basic_version/test50 @@ -0,0 +1,50 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 diff --git a/Lab1/Basic_version/test500 b/Lab1/Basic_version/test500 new file mode 100644 index 00000000..768cc5cd --- /dev/null +++ b/Lab1/Basic_version/test500 @@ -0,0 +1,500 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 diff --git a/Lab1/Lab1-test-report.md b/Lab1/Lab1-test-report.md new file mode 100644 index 00000000..bb73bf4c --- /dev/null +++ b/Lab1/Lab1-test-report.md @@ -0,0 +1,76 @@ +Lab1 test report +===== +# 1.实验概述 +## 1.1输入 +  程序在控制台接收输入的测试文件,测试文件在当前版本的代码的目录下,包括test1,test10,test20…test1000,,文件中包含一个到多个的数独题,并且这些数独按照一定的格式存储。 +## 1.2输出 +  程序将测试文件的数独的解按照与输入相应的顺序写到输出文件outfile中。 +## 1.3 Sudoku算法 +   实验提供了四个算法:BASIC,DANCE,MINA 和 MINAC。本实验选择使用BASIC算法。 +## 1.4实验环境 +   本次实验有3个不同的实验环境,分别是:
+ + +- yudan:Linux内核版本为4.15.0-72-generic;1GB内存;CPU型号为Intel®Core™i5-7200U CPU@2.50GHz,共1个物理CPU,每个物理CPU有4个物理核心;不使用超线程技术。
+ +- tjc:Linux内核版本为4.15.0-72-generic;1GB内存;CPU型号为 Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz,共2个物理CPU,每个物理CPU有1个物理核心;不使用超线程技术。
+ + +- 服务器:
+阿里云服务器:1核CPU,2Gib内存,Ubuntu 16.04 64位操作系统
+## 1.5 代码版本 +  本次实验中使用了三份代码:
+ +- easy_version,静态分配各个线程任务后各自执行等
+ +- Basic_version,使用任务队列分配任务等
+ +- Advanced_version,在Basic_version版本基础上,使用一个专门的线程接受输入,并且可以接受任何数量的输入文件等。 +# 2.性能测试 +   本次实验的性能分析将比较:
+ +- 实验中实现的不同版本的代码在相同的测试环境、不同的输入文件以及同样使用单线程进行求解的性能差别;
+ +- 实验中实现的某一版本的代码在相同的测试环境下、相同的文件输入以及不同的线程数量的性能差别;
+ + +- 实验中实现的某一代码在不同的测试环境下、相同的文件输入以及相同的线程数量的性能差别。 +## 2.1不同版本的代码 + +- 代码版本:Advanced_version,Basic_version以及easy_version + +- 输入:从test1到test1000,使用单线程求解
+ + +- 测试环境:服务器
+   这三个版本的代码实现了相同的功能,但是在时间上的开销是不同的,随着问题规模的不断增大,不同版本的代码时间上的开销的差距会更加明显的显现。本次实验对这些代码进行时间开销上的对比,分别按照输入文件test1,test10,test20,test30,test50,test100,test200,test500,test100对代码版本Advanced_version,Basic_version以及easy_version进行测试。
+  从下图中可以看出当输入文件的数独数量不断增加,Advanced_version,Basic_version以及easy_version的时间开销差距越来越明显。在test1000时easy_version比Basic_version多花了将近14秒的时间,这是因为basic比easy版本实现代码更多,并且随着输入文件数独问题数量的增多,额外的开销的影响就体现出来了,所以最终会造成下图这种情况。
+ +![](https://github.com/sunminyu/CloudComputingLabs/blob/master/Lab1/src/images/input.png) + +## 2.2不同线程数 + + +- 代码版本为Basic_version + + +- 输入:test100 + + +- 测试环境:yudan
+ +   针对Basic_version版本的代码在不同的线程数的使用情况下,测试其时间性能,线程的数量为1,2,4,8,……1024,使用某个数量的线程对所提供的输入文件test100中的数独题进行求解,并且将结果写入输出文件outfile中,测量整个过程的时间开销。
+![](https://github.com/sunminyu/CloudComputingLabs/blob/master/Lab1/src/images/time.png) + +## 2.3不同硬件环境 + + +- 实验使用Basic_version版本的代码在两个不同的硬件环境下 + +- 针对输入文件test100进行求解测试 + +- sudoku_solve线程数量从1开始增加 + +- 测试环境: tjc、yudan
+ 如下图所示为在不同硬件环境下的测试结果:
+![image](https://github.com/sunminyu/CloudComputingLabs/blob/master/Lab1/src/images/hardware.png) diff --git a/Lab1/Lab1-test-report.pdf b/Lab1/Lab1-test-report.pdf new file mode 100644 index 00000000..6aec3940 Binary files /dev/null and b/Lab1/Lab1-test-report.pdf differ diff --git a/Lab1/easy _version/Makefile b/Lab1/easy _version/Makefile new file mode 100755 index 00000000..742d097d --- /dev/null +++ b/Lab1/easy _version/Makefile @@ -0,0 +1,8 @@ +CXXFLAGS+=-O2 -ggdb -DDEBUG +CXXFLAGS+=-Wall -Wextra + +all: sudoku_solve + +sudoku_solve: main.cc neighbor.cc sudoku_basic.cc + g++ -o $@ $^ -O2 -lpthread + diff --git a/Lab1/easy _version/Makefile.win b/Lab1/easy _version/Makefile.win new file mode 100755 index 00000000..db229c01 --- /dev/null +++ b/Lab1/easy _version/Makefile.win @@ -0,0 +1,34 @@ +# Project: soudu +# Makefile created by Dev-C++ 5.11 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +OBJ = main.o neighbor.o sudoku_basic.o +LINKOBJ = main.o neighbor.o sudoku_basic.o +LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3 +INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" +CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" +BIN = soudu.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm.exe -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before $(BIN) all-after + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) + +main.o: main.cc + $(CPP) -c main.cc -o main.o $(CXXFLAGS) + +neighbor.o: neighbor.cc + $(CPP) -c neighbor.cc -o neighbor.o $(CXXFLAGS) + +sudoku_basic.o: sudoku_basic.cc + $(CPP) -c sudoku_basic.cc -o sudoku_basic.o $(CXXFLAGS) diff --git a/Lab1/easy _version/README.md b/Lab1/easy _version/README.md new file mode 100644 index 00000000..5b6bea18 --- /dev/null +++ b/Lab1/easy _version/README.md @@ -0,0 +1,6 @@ +### 线程静态分配版本 + +**运行方法如下:** + +1.输入./sudoku_solve n 按回车键(其中n为线程数目,在不输入n的情况下默认n为2)。 +2.输入./测试文件名 按两次回车键即可运行,测试文件即为当前文件夹中test开头的文件。 \ No newline at end of file diff --git a/Lab1/easy _version/main.cc b/Lab1/easy _version/main.cc new file mode 100755 index 00000000..e51f9561 --- /dev/null +++ b/Lab1/easy _version/main.cc @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "sudoku.h" + +char puzzle[MaxNumPuzzle][128]; +char solution[MaxNumPuzzle][N+1]; +int board[MaxNumPuzzle][N]; +int spaces[MaxNumPuzzle][N]; + +int total=0;// +int totalPerThread=0; +int total_solved = 0;//ѾĿ +bool (*solve)(int, int*, int*) = solve_sudoku_basic;//basic +int numOfWorkerThread=2;//̵߳ĿĬ˫߳ +pthread_t* WorkThreads; +long int threadID; + +int nextPuzzleWillSolve=0; +pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; + +const char outputFileName[10]="outfile"; +int64_t now() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +void read_data() { //ļ + + char *file_name=(char*)malloc(256*sizeof(char)); + FILE *fp; + while(fgets(file_name, 256, stdin)) { + + if(file_name[0]=='\n') { + + printf("please wait\n"); + break; + } + + if(file_name[strlen(file_name)-1]=='\n') file_name[strlen(file_name)-1]='\0'; + + fp = fopen(file_name, "r"); + + if(fp==NULL) { + printf("%s does not exist.please try again\n",file_name); + continue; + } + while(fgets(puzzle[total],1024,fp)) { + if(strlen(puzzle[total])>=N) { + ++total; + } + } + } + +} + +void* Thread_solve(void* CurThread) { + long int my_CurThread = (long int) CurThread; + int first_puzzle = my_CurThread*totalPerThread; + int last_puzzle = (my_CurThread==numOfWorkerThread-1)?total:(my_CurThread+1)*totalPerThread; + + pthread_mutex_lock(&mutex); + int board[N],spaces[N]; + for(int i=first_puzzle; i=2) + numOfWorkerThread=atoi(argv[1]);//빤߳ + + init_neighbors(); + read_data(); + totalPerThread=total/numOfWorkerThread; + int64_t start = now();//ʼʱ + WorkThreads = (pthread_t *)malloc(numOfWorkerThread*sizeof(pthread_t)); + + for(threadID=0;threadID +#include +#include + +#include "sudoku.h" + +#include +int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± +//ڶάϱǷھ adjacent[i][j]Ϊtrueʾ[i][j]Ƿ[row][col]ھ +static void mark_adjacent(bool adjacent[ROW][COL], int row, int col) +{ + for (int i = 0; i < NUM; ++i) {//С + adjacent[row][i] = true; + adjacent[i][col] = true; + } + int top = (row/3)*3;// + int left = (col/3)*3; + adjacent[top][left] = true; + adjacent[top][left+1] = true; + adjacent[top][left+2] = true; + adjacent[top+1][left] = true; + adjacent[top+1][left+1] = true; + adjacent[top+1][left+2] = true; + adjacent[top+2][left] = true; + adjacent[top+2][left+1] = true; + adjacent[top+2][left+2] = true; +} +// һάͳƷھӵ± +static void collect_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + int n = 0; + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (adjacent[y][x] && !(y == row && x == col)) { + //assert(n < NEIGHBOR); + myneighbors[n++] = y*COL + x; + } + } + } + //assert(n == NEIGHBOR); +} +//Ϣ +static void print_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (y == row && x == col)//ڷ X + putchar('X'); + else + putchar(adjacent[y][x] ? 'o' : '.');//o ,. + } + printf("\n"); + } + for (int i = 0; i < NEIGHBOR; ++i) { + printf("%2d, ", myneighbors[i]); + } + puts("\n"); +} + void init_neighbors() +{ + for (int row = 0; row < ROW; ++row) { + for (int col = 0; col < COL; ++col) { + bool adjacent[ROW][COL]; + bzero(adjacent, sizeof adjacent);//ÿζҪ + mark_adjacent(adjacent, row, col);//ÿ20ھӣԼ21 81 + + int me = row*COL + col;//õһά± + collect_neighbors(adjacent, row, col, neighbors[me]); + + if (DEBUG_MODE) + print_neighbors(adjacent, row, col, neighbors[me]); + } + } +} + +bool solved(int board[N])//жǷȷ +{ + int (*chess)[COL] = (int (*)[COL])board; + for (int row = 0; row < ROW; ++row) { + // + int occurs[10] = { 0 }; + for (int col = 0; col < COL; ++col) { + int val = chess[row][col]; + //assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int col = 0; col < COL; ++col) { + // + int occurs[10] = { 0 }; + for (int row = 0; row < ROW; ++row) { + int val = chess[row][col]; + // assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int row = 0; row < ROW; row += 3) { + //鹬 + for (int col = 0; col < COL; col += 3) { + int occurs[10] = { 0 }; + ++occurs[chess[row ][col]]; + ++occurs[chess[row ][col+1]]; + ++occurs[chess[row ][col+2]]; + ++occurs[chess[row+1][col]]; + ++occurs[chess[row+1][col+1]]; + ++occurs[chess[row+1][col+2]]; + ++occurs[chess[row+2][col]]; + ++occurs[chess[row+2][col+1]]; + ++occurs[chess[row+2][col+2]]; + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + } + return true; +} diff --git a/Lab1/easy _version/outfile b/Lab1/easy _version/outfile new file mode 100755 index 00000000..26d00280 --- /dev/null +++ b/Lab1/easy _version/outfile @@ -0,0 +1,50 @@ +693784512487512936125963874932651487568247391741398625319475268856129743274836159 +793684512486512937125973846932751684578246391641398725319465278857129463264837159 +673894512912735486845612973798261354526473891134589267469128735287356149351947628 +679835412123694758548217936416723895892561374735489621287956143961342587354178269 +346795812258431697971862543129576438835214769764389251517948326493627185682153974 +598463712742851639316729845175632498869145273423978156934287561681594327257316984 +364978512152436978879125634738651429691247385245389167923764851486512793517893246 +649835712358217964172649385916784523834521679725963148287356491591472836463198257 +367485912425391867189726354873254196651973428294168573718649235946532781532817649 +378694512564218397291753684643125978712869453859437261435971826186542739927386145 +346895712725361984198427356984256173651783429273149568819674235467532891532918647 +349756812826143579157829364593264187761398425284571693915487236478632951632915748 +546938712987421536213675498165794283432186975798352641871269354659843127324517869 +869725413512934687374168529798246135231857946456319872683571294925483761147692358 +562874913839215647174639582345761298728953461916482375283196754651347829497528136 +572649813986531472314872596238457961167298345459163287893726154741385629625914738 +867942513254731968319568724532496871196827345478153296743689152621375489985214637 +967248513254731869318569724835426971126987345479153286743692158681375492592814637 +278649513956831472314572896532467981167298345489153267893726154741385629625914738 +549728613328561497716493825183654972957832146264179358892347561671985234435216789 +867459213945231687213768954689517432324896175571324869436172598158943726792685341 +867459213549231687213768954986517432375824169421396875634172598158943726792685341 +978654213546231798213879654697518432481326975325947186734182569159463827862795341 +978654213645231798213879654796518432521347986384926175437182569159463827862795341 +478526913219837456365149872793214685521968734846753129932481567687395241154672398 +827945613431286975659173842378462591514398267296517384942831756163759428785624139 +675924813413867592298153476732415968841396725569782134924531687387649251156278349 +769823514145769283823451976456217398931685427278934651614598732397142865582376149 +976583214481629357523741869315874926749362581862195473198456732654237198237918645 +857926314341758692962431578184365927795214836623879145519647283436182759278593461 +596782314318465279724319658943821765185976423267534891471698532652143987839257146 +596872314318465279724319658943721865167598423285634791471986532652143987839257146 +569872314318469257724315689943721865157986423286534791471658932692143578835297146 +538279614762148593914536287296714358451893726873652149347921865625487931189365472 +826375914795481326413269857942713685651928473387654291164592738238147569579836142 +826375914975481326413269857742913685651728493389654271164592738238147569597836142 +964237815182459376357861429891376254725184963436592187548723691219645738673918542 +762389415395412678481675932679854321254193867138726594547931286823567149916248753 +782463915945812673361975842478256391256139487139784526597641238823597164614328759 +798342615365819472421675938679458321254193867183726594547931286832567149916284753 +248967315516832947397154268423596871659781432781423596175249683834615729962378154 +248967315517832946693154287426593871359781462781426593175249638864315729932678154 +729348615836915472451672938678254391245193867193786524567431289982567143314829756 +792348615836915472451672938679854321245193867183726594567431289928567143314289756 +829463715475912683361785942784256391956137428132894576598641237243578169617329854 +879362415635914782421785639784659321256143978193827546568431297942578163317296854 +379284615428561739561793428213657984786149253945328176157436892692875341834912567 +823479615145683792697251348718345269562197834934862571371524986289716453456938127 +472983615385614972196572483641857239237491856859326147913245768524768391768139524 +634879215792541368518263479359418726861792543247635981175926834483157692926384157 diff --git a/Lab1/easy _version/soudu.dev b/Lab1/easy _version/soudu.dev new file mode 100755 index 00000000..a263a0d6 --- /dev/null +++ b/Lab1/easy _version/soudu.dev @@ -0,0 +1,92 @@ +[Project] +FileName=soudu.dev +Name=soudu +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=main.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=neighbor.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=sudoku.h +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=sudoku_basic.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Lab1/easy _version/soudu.layout b/Lab1/easy _version/soudu.layout new file mode 100755 index 00000000..2142f39e --- /dev/null +++ b/Lab1/easy _version/soudu.layout @@ -0,0 +1,23 @@ +[Editor_0] +CursorCol=37 +CursorRow=64 +TopLine=105 +LeftChar=1 +[Editors] +Order=0,1,2,3 +Focused=0 +[Editor_1] +CursorCol=1 +CursorRow=59 +TopLine=1 +LeftChar=1 +[Editor_2] +CursorCol=41 +CursorRow=26 +TopLine=12 +LeftChar=1 +[Editor_3] +CursorCol=3 +CursorRow=15 +TopLine=32 +LeftChar=1 diff --git a/Lab1/easy _version/sudoku.h b/Lab1/easy _version/sudoku.h new file mode 100755 index 00000000..c0f3d19c --- /dev/null +++ b/Lab1/easy _version/sudoku.h @@ -0,0 +1,31 @@ +#ifndef SUDOKU_H +#define SUDOKU_H + +const bool DEBUG_MODE = false;//ǷмϢ +enum { ROW=9, COL=9, N = 81, NEIGHBOR = 20 };//Ϊ һΧ20ڵķСС +const int NUM = 9;//1~9 + + +extern int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± + +const int MaxNumPuzzle = 1e6; +extern char puzzle[MaxNumPuzzle][128]; +extern char solution[MaxNumPuzzle][N+1]; + +extern int board[MaxNumPuzzle][N]; +extern int spaces[MaxNumPuzzle][N]; +/********************************/ + + +void init_neighbors(); +int input(const char in[N],int board[N],int spaces[N]); +void init_cache(); + +bool available(int guess, int cell,int board[N]); + +bool solve_sudoku_basic(int which_space, int board[N],int spaces[N]); +bool solve_sudoku_min_arity(int which_space); +bool solve_sudoku_min_arity_cache(int which_space); +bool solve_sudoku_dancing_links(int unused); +bool solved(int board[N]); +#endif diff --git a/Lab1/easy _version/sudoku_basic.cc b/Lab1/easy _version/sudoku_basic.cc new file mode 100755 index 00000000..ff9dad0a --- /dev/null +++ b/Lab1/easy _version/sudoku_basic.cc @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include "sudoku.h" + +//int board[N];//һάֵΪ +//int spaces[N];//ĿոֵΪе± +int nspaces;// Ŀո +//int (*chess)[COL] = (int (*)[COL])board;//Ψ̵Ķά + +static int find_spaces(int board[N],int spaces[N])//пո¼ոһά +{ + nspaces = 0; + for (int cell = 0; cell < N; ++cell) { + if (board[cell] == 0) + spaces[nspaces++] = cell; + } + return nspaces; +} + +int input(const char in[N],int board[N],int spaces[N])//ַתΪһάֵ +{ + for (int cell = 0; cell < N; ++cell) { + board[cell] = in[cell] - '0'; + assert(0 <= board[cell] && board[cell] <= NUM); + } + return find_spaces(board,spaces); +} + +bool available(int guess, int cell, int board[N]) +{ + for (int i = 0; i < NEIGHBOR; ++i) { + int neighbor = neighbors[cell][i]; + if (board[neighbor] == guess) { + return false; + } + } + return true; +} + +bool solve_sudoku_basic(int which_space,int board[N],int spaces[N])//ݹ +{ + if (which_space >= nspaces) { + return true; + } + int cell = spaces[which_space]; + + for (int guess = 1; guess <= NUM; ++guess) { + if (available(guess, cell,board)) { + assert(board[cell] == 0); + board[cell] = guess; + if (solve_sudoku_basic(which_space+1,board,spaces)) { + return true; + } + + assert(board[cell] == guess); + board[cell] = 0; + } + } + return false; +} diff --git a/Lab1/easy _version/sudoku_solve b/Lab1/easy _version/sudoku_solve new file mode 100755 index 00000000..56c4b8ae Binary files /dev/null and b/Lab1/easy _version/sudoku_solve differ diff --git a/Lab1/easy _version/test1 b/Lab1/easy _version/test1 new file mode 100644 index 00000000..8d81622c --- /dev/null +++ b/Lab1/easy _version/test1 @@ -0,0 +1 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 diff --git a/Lab1/easy _version/test10 b/Lab1/easy _version/test10 new file mode 100644 index 00000000..7c92edad --- /dev/null +++ b/Lab1/easy _version/test10 @@ -0,0 +1,10 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 diff --git a/Lab1/easy _version/test100 b/Lab1/easy _version/test100 new file mode 100644 index 00000000..c31b7ab8 --- /dev/null +++ b/Lab1/easy _version/test100 @@ -0,0 +1,100 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 diff --git a/Lab1/easy _version/test1000 b/Lab1/easy _version/test1000 new file mode 100644 index 00000000..c21f3fbe --- /dev/null +++ b/Lab1/easy _version/test1000 @@ -0,0 +1,1000 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 +000000061050700000200009000000800300401000000600000000000060080030040000020000700 +000000061070005000400030000300000200000100070000800000001600000000070400500000300 +000000061070040000000000000102006000000080300500000000030000740600501000000200000 +000000061070500000000000000900460000050000200000000700601000030300200000000708000 +000000061070500000000400000603050000000200100000000040200006000000039000010000800 +000000061070800000500090000000600300302000000400000000000030040010002000060000900 +000000061200030000000000000000070240060500000000000300005601000300000820000700000 +000000061200030000400000000020801000500600700000000040081000000000070400003000000 +000000061200300000000000000000160000020040000800000300060000740000800200003500000 +000000061200500000800000000000200700037000000060400000100000200000038000000060040 +000000061200500000800000000000200700037000000060400000100000200000068000000030040 +000000061200700000000800000013060000050400200000000700000010050700000400800000000 +000000061200700000000800000013060000050400700000000200000010050700000400800000000 +000000061200800000000000000000402800063000000000700000000036200410000000000010050 +000000061300020000000700000017000000000080500090000000500000380600401000000900000 +000000061300700000090400000710080000000300400000000020000062000500000900000010000 +000000061300800000000000000500000400000014000000070800010620000000500390007000000 +000000061350000000400050000020000800000601000000700000000080200600400000007000010 +000000061400003000000700000010690000020000300000000000304000200000180050700000000 +000000061400030000000500000026000080000070000010000000500200300304000700000100000 +000000061400070000000090000000608200901000000200100000000050400060300000000000090 +000000061400070000020000000061500000000030740500000000005108000700000400000000000 +000000061400200000900000000067015030010070000000000400200800500030000000000000000 +000000061402000000030000000380000400000602000000100000006500000100000070000080300 +000000061403000000020000000308000400000602000000100000060500000100000070000080300 +000000061480000000000000000000520400000030000060000000530006070200000800000107000 +000000061500020000970000000061400000000050900000000080000806000300000500000700000 +000000061700020000000000000060530000010000200000000400000107030208000000400300000 +000000061700400000800000000000720400300000000000010000009800700010000500060000020 +000000061800007000000020000032100000000650800000000000000003720910400000000000000 +000000061890000000000000000000520400000030000060000000530006070200000800000107000 +000000061890000000000000000000520400000030000060000000530006070200000900000107000 +000000061900200000000400000070068030200000700000010000006050000000900200040000000 +000000062800300000000000050040200100060000040000000700001056000700000300000040000 +000000063000100000200000000050000100000400200009006000630090000000200740008000000 +000000063000500004080000000603000700000010500400000020010000200000406000000700000 +000000063020040000000001000040000210000370000000500400503600000000000700800000000 +000000063020040000000001000040000210000370000000500400803600000000000700500000000 +000000063800090000000000010005020400010000000000000200200600500000103070000400000 +000000064005800000000000020160000300000300500020000000000267000309000000000040000 +000000064300800000000000010041000070050008000000900500906000800000010000000000200 +000000064500080000000000010000305700010000040000070000708000200000600800000100000 +000000065000300000000010000000040170509000000000000800270500000010000300000906000 +000000065000710000040000000000053000080000200000000100003200700506000000100800000 +000000065040800000000000001006000800030000700000010000000700230400002000501000000 +000000065900200000000000000000900240053000000000000000060057000100006800000030900 +000000067003900000010000004600004000050010000000000100000800520007000300400000000 +000000067060200000000000040000860300401000000700900000070004000900000200000010000 +000000068030070000100000020070000450000208000000400000000030100200600000000000900 +000000068030070000400000020070000450000208000000100000000030100200600000000000900 +000000068030090000700000020010000350000208000000400000000030100200600000000000500 +000000068100000000000000030060030000000400100008000200400200500730000000000108000 +000000068350000000000010000100000500000800400009000000060205000000400300007000010 +000000068350000000000010000100000500000900400006000000070205000000400300008000010 +000000068900000002000400500041000000000035000050000000000800010300000700000100400 +000000069070000040050800000000507200300100000600000000000030008400060000000000500 +000000069800040000000010000000300800010000400650000000701000200000905000000600000 +000000071000040000600000000000705000200000600000100300087000050010300000000060400 +000000071000052000000000000000008540710400000300000000460070000005000200000300000 +000000071000208000000600000501000000000300200700000000030040600260000000000070050 +000000071000520000000000000000070080300001000204000000500600200000300600070004000 +000000071000580000000000000000031060200400000508000000070006000030000500000100200 +000000071000604000000000000500400600102000050700000000000071000080020000030000900 +000000071000604000000000000500800600102000050700000000000071000090020000030000800 +000000071000800000000300000040000300270000000000500800600070500008060000000010040 +000000071000904000000000000500400600102000050700000000000071000080020000030000900 +000000071002500000000000000780000030000420000000100000050007200004600500300000000 +000000071005020000040000000100300000000009400800000000060000950300710000000800000 +000000071006090000000000050102000000000060300050000000070504000800000600000200400 +000000071020400000500000000080000600000037000000010000000600240300500000109000000 +000000071020400000600000000080000200000037000000010000000200540300500000109000000 +000000071020600000000000000100073000060000200500000000000260400703000050000800000 +000000071020800000000403000700060050000200300900000000600070000080000400000050000 +000000071030020000000000000000000250600100000000080300020000530400601000000700000 +000000071040050000000600000000100600080000500000007003107000060000080200300000000 +000000071050003000040080000030000500200100000600000000000040300700000040100600000 +000000071050008000000000000060040030200170000000300600000002500401000000700000000 +000000071050080000000000000600103000020000890000400000000700200100040000403000000 +000000071050600000200009000000800300407000000100000000000010020030040000020000600 +000000071060005000000000000080000630400170000000200000907020000000003800000000500 +000000071060020000000030000700060300400000200100400000000105080020000000000700000 +000000071060020000000030000700060300400000200100400000000705080020000000000100000 +000000071060020000300000000050000260000108000000300000000430500108000000007000000 +000000071060030000000020000700060300400000200100400000000105080020000000000700000 +000000071060030000000020000700060300400000200100400000000705080020000000000100000 +000000071060300000500000000000040050007010000020000600000500900400600000801000000 +000000071060500000000000000005040600030000200000007000000800540107300000200000000 +000000071080300000000200000407020000000600800100000300500070040030000600000000000 +000000071080400000000500000100072000050000630000000000000380400207000000600000000 +000000071090800000000000000400300600701000050000902000060000300500070000000000900 +000000071200050000030060000701300000000000640800000000000107000040000500000002000 +000000071200300000860000000000500630004200000700000000000071000050000800000040000 +000000071200600000300000000000510007604000200000008000050000040000200600010000000 +000000071200900000000000000000600830071400000500000000640000200000050600000007000 +000000071300200000000000000000060300010030000004000000600000540000407200800100000 +000000071300200000000400000000078040200000300050010000400000500007060000000500000 +000000071300500000000000000000308500002600000070000000000070320800050000010040000 +000000071300500000600400000000072000080010000400000000070020000000300600000000540 +000000071300800000080000000005041000020000300000070000601000040000200600700000000 +000000071400030000000200000020700000000040300000000500000102060308000400500000000 +000000071400080000000000000000170050820000000300000000001703000600000800000500400 +000000071400500000600000003050037000200000800000010000000800040000400200010000000 +000000071400900000300500000000300450070060000000000900000072000080010000500000000 +000000071500020000000800000047000000000090600010000000600000250700103000000400000 +000000071500030000000600000600000800200400000000702000000080300041000000070000020 +000000071500400000300000000400306500010000060000200000080000200000017000000080000 +000000071580000000030900000407200000000000810060000000200000500000067000000010000 +000000071600040000000000000087500000000020900010000000300800600406000020000100000 +000000071600200000800000000070031040000600500200000000030070000000500600000000200 +000000071600200000900000000400650300010000080000400000070081000020000600000000000 +000000071600500000040000000502600030000900600070000000000013000800000900000070000 +000000071600500000200000000340010000000070620000000500000600300080400000010000000 +000000071600500000300400000000072000080010000400000000070020000000300600000000540 +000000071800020000300000000076500000000030200010000090400600800050100000000000000 +000000071800030000000000000670200000000090300000000500020701000500000830000400000 +000000071800040000000000000070200000030000800000090400000701030400500600900000000 +000000071800040000000000000670200000000090300000000400020701000300000840000500000 +000000071800300000400050000670000500000012000000400000002000050000800400010000000 +000000071900000060020000000004070000030000400000910000700600008000300200100000000 +000000071930000000000000000000620400000030000070000000650007080200000900000108000 +000000072000051000000000000000060180720300000400000000300200000000400600008000500 +000000072006800000000000050170000300000400800020000000000217000309000000000050000 +000000072010000000000060000000700510902000000400000000000510600300000009000807000 +000000072080500000010000000200097000000000100300000000703000060000180500000400000 +000000072080500000010000000200097000000000800600000000703000060000180500000400000 +000000072080600000010000000400097000000000800300000000703000040000180600000500000 +000000073200500000000000610003100000000900040800000700000086200010000000000030000 +000000074002800000000000003070530000600000010000000200540000600000071000700000000 +000000074010030000000000080000010520700600000400000000053000100000708000000000200 +000000074010030000000000080000010520700600000400000000053000100000807000000000200 +000000074150000000000000008010000230600048000000070000200500100000300000004000000 +000000074200050000000000001000104030500000600008700000000390800010000000000000200 +000000074500100000000000009800009500000040000000000010070200600000080300040700000 +000000075320000000000000008010000240600058000000070000200400100000300000005000000 +000000075400060000000000010002105000000700040600000300000390800010000000000000200 +000000075400060000000000010002105000000700040900000300000390800010000000000000200 +000000075400060000000000010003105000000700040600000300000390800010000000000000200 +000000075400060000000000010003105000000700040900000300000390800010000000000000200 +000000075620000000000000008010000240300058000000070000200400100000300000005000000 +000000076060200000000000050000860400501000000700900000030005000900000200000010000 +000000076400900000000000080008070000000200400090000300200000530000006001000080000 +000000078500200000000000600067000050080000020000300400300000102000070000000006000 +000000078500300000000000010400070200000018000030000000060400500000000430001000000 +000000078600000050000040000058000000000001300040000000300600100000250000000700400 +000000079030080000500000020080000560000209000000400000000030100200700000000000400 +000000079030080000500000020080000560000209000000400000000040100200700000000000400 +000000081000090030700004000000200600030800000010000000000010403500600000200000000 +000000081000090040700005000000300600040800000010000000000010504300600000200000000 +000000081000409000000200000060081000004000230000000000380070000200500900000000000 +000000081000602000300700000604000700000090010700000000500400200010080000000000000 +000000081020030000000000000000060320700450000100000000500708000060000200000100000 +000000081020040000000700000000050620300090000100000000040300200500008000000100000 +000000081020300000000000000109000040000200500800000000000580200070000300600010000 +000000081020300000040006000000600420801050000000000700000400200500080000000000000 +000000081020300000700000000040000700000018000000050000000600230500400000106000000 +000000081020500000000000000400031000700000200060000000000260500103000040000700000 +000000081020600000400000000090000200000038000000010000000500720300400000105000000 +000000081020700000000000000000900250800000030400000700600018000050000300000040000 +000000081020700000000403000100060050000200300500000000800010000040000700000050000 +000000081020700000000403000100060050000200300500000000800010000070000400000050000 +000000081020700000500000000060000200000038000000010000000600740200500000103000000 +000000081020700000500000000090000400000038000000010000000600240300500000106000000 +000000081030005000000000000500074600109000000000000000080000370600910000000200000 +000000081030005000000000000500074600901000000000000000080000370600910000000200000 +000000081030020000000700000000050620400090000100000000020400300500008000000100000 +000000081030020000000700000000050620400090000100000000060400300500008000000100000 +000000081030200000000000000108060040000700300600000000500300700090000200000010000 +000000081030200000000000000108060040000900300600000000500300700070000200000010000 +000000081030200000500000000000600230100400000700000000400070000000010800060000300 +000000081030500000000020000100007000000080500050000400600100070000403000800000000 +000000081030500000000020000100009000000080500050000400600100070000403000800000000 +000000081030600000000020000500007000000080600060000400100500070000403000800000000 +000000081030600000000020000700009000000080600060000400100500070000403000800000000 +000000081040300000020006000000600420801050000000000700000400200500080000000000000 +000000081050600000200009000000700300408000000100000000000010070030040000020000600 +000000081060020000300000000050000260000107000000300000000430500701000000008000000 +000000081060500000300000000500028000070000400000010000000600730002400000100000000 +000000081060500000700000000200600500008000020100300000040021000050000600000000000 +000000081060700000000200000040000600000083000000000020000502700308040000100000000 +000000081070600000300000000400018000030000500000020000000500760002400000100000000 +000000081070600000300000000400028000030000500000010000000500790002400000100000000 +000000081080000020300000000016000000000500600090200000000091000500000300400080000 +000000081090005000000000000070000630400810000000200000201060000000003500000000700 +000000081090005000000000000070000630400810000000200000201060000000003700000000500 +000000081090300000000200000708040000000600900100000300500080040030000600000000000 +000000081100060000070050000009000760000102000000800400000300500800000020000000000 +000000081200060000000000000048500000000020300010000000500000670000103000700400000 +000000081200060000000700000000408070630000000000100000004000600000050200018000000 +000000081200400000000000000000230700010000050008600000700000400090080000000050200 +000000081200500000030000000020406000001000070000200000008010000000030200700000400 +000000081200500000030000000020406000008000070000200000001080000000030200700000400 +000000081200600000000000000089010050000403200000000600400000700000250000000080000 +000000081200700000000000000000230700010000050008600000700000400030080000000050200 +000000081200700000000000000000230700010000050008600000700000400040080000000050200 +000000081200700000000000000000230700010000050008600000700000400090080000000050200 +000000081200700000000500000000080650400010000500000700060300000089000000000000400 +000000081200700000960000000000500630004200000800000000000081000050000900000040000 +000000081230000000040700000000600370005300000100000000400000200000058000000010000 +000000081250000000060700000000500670004200000100000000300000900000048000000010000 +000000081300020000000700000048000000000060200010000000600000350700504000000100000 +000000081300200000000074000200000560700010000000009000000800200014000000090000000 +000000081300600000090400000680070000000300400000000020000012000500000300000080000 +000000081360000000040700000500000300000021000000080000002000010000400600400300000 +000000081400300000300050000190000500000028000000600000082000050000400700000000000 +000000081400300000300050000190000500000028000000600000082000050000700400000000000 +000000081400300000300050000190000500000082000000600000082000050000400700000000000 +000000081400300000300050000190000500000082000000600000082000050000700400000000000 +000000081400300000300050000610000500000082000000700000002000050000600400080000000 +000000081400300000300050000680000500000012000000700000002000050000600400010000000 +000000081500400000073000000000028000060000300000010000000600740200500000100000000 +000000081600002000000700000500000360800100000000400000000060200047000000010030000 +000000081600030000000200000020800000000040300000000500000102070304000600500000000 +000000081600040000000230000400000050300700000000100000000050300010000200087000000 +000000081600070000000000000000801040702000000300400000200000700000060300080500000 +000000081600070000000000000000805040702000000300100000200000700000090300080500000 +000000081600200000000000000010089000503000200000000600000300570240000000080000000 +000000081600400000500700000012000000080090000000500000000010050030000600700000400 +000000081600500000040000000502700030000600700080000000000013000900000600000080000 +000000081690000000040300000508200000000000910070000000300000600000018000000070000 +000000081700050000020000000601200000080000040000090300300004000200000500000800000 +000000081700060000000000000400507000600000720000100000058200000000030200010000000 +000000081700200000200000000000510030050040000600000800000700900003006000010000000 +000000081700300000400050000610000500000082000000400000002000050000700400080000000 +000000081700400000000200000400000300005010000000090000010350000200000640000000700 +000000081700600000300500000000082000090010000500000000080040000000300700000000650 +000000081700600000500000000040081000000000290000030000000504700600200000080000000 +000000081900400000700600000082000000010050000000700000000080050030000900600000400 +000000082000031000000000000080420000400000100000500000601000300000200050700000600 +000000082000031000000000000080420000700000100000500000601000300000200050400000700 +000000082005060000010000000090302000000100500800000040600040000300000001000000300 +000000082040600000010000000200098000000000100300000000803000070000410600000500000 +000000082500006000000000090600000300000920000000000040000053100090600000008000700 +000000082500300000000000000300072000400000630000010000000800500081000000020000007 +000000082600400000000000000400072000500000430000010000000800600081000000020000007 +000000083000014000000200000000320000090000400000700000000006150308000000200000600 +000000083000030010070000000000204000030000600000010000200600405000500700100000000 +000000083020100000000000040000610200800000900004000000060300500100000070000008000 +000000083020700000000000040000610200800000900004000000060300100500000070000008000 +000000083040300000000500060300000400000700500208000000050060100000002000000080000 +000000083400020000000000510002300000700000600000100040000075200010000000000800000 +000000083500400000000100000000020700100000400000008000038600000020070000000000520 +000000083900100000000000020100009700020080000000000100005700400003000060080000000 +000000084000100000200000000000600130408000000050000000560000200000080007010030000 +000000084000510000000030000400000200300008000000600070000200403076000000000000100 +000000084050010000000000050000030620800200000400000000073000100000508000000000900 +000000084100600000000000000000040103030020000500000600048000020000701500000000000 +000000084600010000000000000500000106000800300070200000087000020000063500000000000 +000000084750000000000000009010000730600049000000080000200500100000300000004000000 +000000085004070000000000030100060700570000100030800000006200000000503000000000000 +000000085200030000000000030040010600058000000000700000700400100000500200000008000 +000000085760000000000000009010000640300059000000080000200400100000300000005000000 +000000086320000000000000009010000250700069000000080000200500400000300000006000000 +000000087004010000000000030100060500570000100030800000006200000000703000000000000 +000000087004050000000000030100060500570000100030800000006200000000703000000000000 +000000091000020000000400000507000200100900000860000000040000080090001000000070300 +000000091000030000000500000608000300200900000170000000050000020090001000000080400 +000000091002080000040700000050061400000090000300000000000300750900000000000200000 +000000091020400000000000000000380200700090000000000400040500600900010070000200000 +000000091020700000600000000080000500000039000000010000000600840300500000107000000 +000000091030600000000020000700008000000090600060000400100500080000403000900000000 +000000091060005000000000000080000630400910000000200000201070000000003500000000800 +000000091060005000000000000080000630400910000000200000201070000000003800000000500 +000000091060070000000000000005030760000000200100000000300100004082000000000409000 +000000091060070000000000000005030760000000300100000000300100004082000000000409000 +000000091070020000000004000000380000040000900000100000300000640000005700100800000 +000000091070080000000000000006040870000000300100000000400100005032000000000509000 +000000091080040000400000000000720500801000060900000000020000300000601000000900000 +000000091080200000000000000930000800000014000000500000104000070000600200000380000 +000000091080600000000030000000700260500400000100000000030050800000019000400000000 +000000091080600000000030000000700280500400000100000000030050800000019000400000000 +000000091200050000000000000500000240700800000060100000089400000000060300010000000 +000000091200400000030000000060507000009000080000200000001090000000030200800000400 +000000091200600000000000000040010600000039000070000200000400570300800000100000000 +000000091200800000600000000040091000000000250000030000000604800700500000090000000 +000000091300040000500600000007200600090000080000300000200000500000091000000080000 +000000091300200000000085000600000270800040000000001000000600500049000000010000000 +000000091400070000000000000700300000800000400000106000019500060000040700200000000 +000000091400070000000000000700300000800000400000106000019500060000040800200000000 +000000091400300000000000000000219000200000850000060000090000060000400700300000400 +000000091400300000300050000710000500000092000000600000092000050000400800000000000 +000000091400300000300050000790000500000012000000600000012000050000400800000000000 +000000091500080000200000000000720600010300000090000000640100000000000520000000800 +000000091500200000300000000080700040090000600000500000200060500010090000000003000 +000000091600300000070000000400000500000029000000010000000500680310000000020800000 +000000091600700000200000000700000010000600500000450000030081000040000600005000000 +000000091600700000800000000040091000000000250000030000000604800200500000090000000 +000000091600700000800000000040091000000000250000030000000604800700500000090000000 +000000091603000000500000000090100040000002300700000000300000700000410000000980000 +000000091630000000000000000019080000000020400000000600200600300000703050000400000 +000000091630000000000000000051080000000020400000000600200600300000703050000400000 +000000091630000000000000000091080000000020400000000600200600300000703050000400000 +000000091700000030000200000090010080005000600200000000080090000000600400000700200 +000000091700030000200500000600000200040900000000000000500008040090001000000020300 +000000091700030000200500000600000200040900000000000000500008040090001000000060300 +000000091700400000000030000000651000200000370000000000000800200054000000310000000 +000000091700400000000380000000500800029000000010000000600002000000060010500000300 +000000091700400000200000000500290000000080010040000600081000400000700300000000000 +000000091700800000200000000000510030020040000600000900000700600003006000010000000 +000000091700800000200000000000510030050040000600000900000700200003006000010000000 +000000091700800000200000000000510030050040000600000900000700800003006000010000000 +000000091700800000200000000000510030070040000600000900000700200003006000010000000 +000000091700800000600000000040091000000000250000030000000604700200500000090000000 +000000091800200000000400000060017030200000600000090000001050000000800200040000000 +000000091800200000200000000000510030050040000600000900000700800003006000010000000 +000000091800300000300050000470000500000092000000600000002000050000800400090000000 +000000091800700000200000000000510030090040000600000900000200800003006000010000000 +000000092010400000000000000030100400100060000000020007000500830209000000600000000 +000000092700000010000300000090020080005000600300000000010090000000600400000700300 +000000093000014000000200000000320000040000500000800000000007160309000000200000700 +000000093480000000010000000503000060000010800000000000170000400000902000000300005 +000000094000400070100000000208000600000750000000000100030060500047000000000002000 +000000094030090000000000060070000820200600000000004000000750300906000000000000100 +000000096200030000000000030050010700069000000000800000800400100000600200000009000 +000000097000050000000040000107200000040000300000900000600701000030000450000000800 +000000097300400000000000020600098100400007300000020000072000000000100000080000000 +000000100000300000900000000700100600200000090000500000008020040010006005050090000 +000000100000500000200000000035400000000010700080000200004000059600002000000070030 +000000100000500000200000000035400000000010700080000200004000059600070000000002030 +000000100000500000200000000035400000000010800070000200004000095600008000000020030 +000000100000500000200000000035400000000010800070000200004000095600020000000008030 +000000102000000340005080000360000000000090050010000000100403000007000600000100000 +000000102000300500000608000000400030200050000100000000000070200080010000030000060 +000000102000300500000708000000400070600050000100000000000040600070010000030000040 +000000102000300600000408000000500040200060000100000000000070200050010000040000030 +000000102000300600000709000000400030200050000100000000000080200040010000030000070 +000000102000300600000809000000400080200050000100000000000070200080010000030000060 +000000102000300700000409000000500040200060000100000000000080200090010000040000030 +000000102000300700000809000000500080200060000100000000000010600080040000030000070 +000000102030000400000700500080000030000015000000020000000300064201000000900000000 +000000102040700000300500000008001000600000070000020000002000600000600300010070000 +000000102080300000000000500000690080001000000500000000060000470000201000700050000 +000000102400050000000000900060070080001000000000300000000001460320000050000900000 +000000102500600000000000000023000700000405000010000300000170000000020080800000040 +000000102700050000000000800060070040001000000000300000000001460320000050000800000 +000000102700050000000000900060070080001000000000300000000001460320000050000900000 +000000102700400000000000800300000640400009000000010000012600000000500030090000000 +000000102900050000000000800040060070001000000000300000000001460320000050000800000 +000000102900050000000000800060070040001000000000300000000001460320000050000800000 +000000103000400500670000000000020070300000000001000000000063400007500000020000080 +000000103020090000000000400000025080010000000400000000300104000008000020000700600 +000000103020400000000670000070000400000001000000000070000240060301000500800000000 +000000103080020000000004500030000020000500070000100000100300600700080000005000000 +000000103800050000000000700060020040001000000000300000000001460420000050000700000 +000000103800600000200000700000406080010000000000700000008003000030010000400050000 +000000103900050000000000700060020040001000000000300000000001460820000050000700000 +000000103900050000000000800060020070001000000000300000000001460720000050000800000 +000000104000003600000050002503000000200600000000100080000070230010000000000400000 +000000104000010800600700000391000000080500000000200000506000070400080000000000000 +000000104000060000000050000200430000000107000600000800010500000070000040000000023 +000000104000080300040050000000200070300000600001004000870000050000300000000100000 +000000104000702000000000000460010000000500070100000000000380600027000030004000000 +000000104000802000000000000460070000000600080100000000000340700028000050009000000 +000000104080900000000000500000702080001000000500000000000530600020000030400010000 +000000104702000000000000000000705020300600000010000000200000630050014000000080000 +000000104800070000000000600700200000000104000030000080012000000000050030604000000 +000000104800090000000000600700200000000401000030000090012000000000050030604000000 +000000105000700400700200000000500080403000000061000000500000020040060000000010000 +000000105002000600030800000100000400000308000000200000570000030400060000000010000 +000000105002600000000902000300000090000070800000010000710000500000200040080000000 +000000105004070000000000300150300000000600080020000000000051200006000070800000000 +000000105030800000000000000000012000060000030000000700102000400500360000000700080 +000000105030800000000000600020030000500006000000000270601000004000200030000070000 +000000105200007000000030600009000400010500000000002030300000070000980000000100000 +000000105200800000000000300000071000000004800300050000000300026004000050010000000 +000000105300040000000000000000080720905600000000000040020000800000100030000509000 +000000105302000000000000000000206030710000000000300000400000820070015000000090000 +000000105802000000000000000000406030200300000010000000400000720060015000000090000 +000000105802000000000000000000406030400700000010000000300000720060015000000090000 +000000105802000000000000000000806020300700000010000000400000730060015000000090000 +000000105802000000000000000000806020400700000010000000200000730060015000000090000 +000000105802000000000000000000806030300700000010000000400000720060015000000090000 +000000106000025000300000000009100400000400000000000020520000080000630700000007000 +000000106020000500000082000010000200000040030000500000703000040400600000000001000 +000000106020070000800000500097000030000500040000100000000020780100600000000000000 +000000106020070000900000500078000030000500040000100000000020780100600000000000000 +000000106030070000400000500078000020000500040000100000000020780100600000000000000 +000000106030070000900000500078000020000500040000100000000020780100600000000000000 +000000106040700000000500300070000450600010000000000000000450020300000080100000000 +000000106040800000000500300070000450600010000000000000000480020300000090100000000 +000000106200005000000000800320000070000010000000800000071000400000023050000600000 +000000106302000000000000000000207030400800000010000000500000840070016000000090000 +000000106302000000000000000000507030500800000010000000200000840070016000000090000 +000000106390000000000000500000610200870000000000500000000407030001050000000000080 +000000106402000000000000000000207030500800000010000000300000840070016000000090000 +000000106402000000000000000000507030500800000010000000200000840070016000000090000 +000000106402000000000000000000507030500800000010000000300000840070016000000090000 +000000107000001300800040000500300000006000040200000000000200050010000200030700000 +000000107000001300800050000200300000006000050400000000000200040010000200030700000 +000000107000025000300000000004100600000400000000000020520000090000730800000008000 +000000107000500300000602000800000026600000040000010000410000700000200000030000000 +000000107000800300800200000000700090403000000061000000500000020090060000000010000 +000000107000800400200300000000700090504000000061000000300000020090060000000010000 +000000107000800400800300000000700090504000000061000000300000020090060000000010000 +000000107000902000000500600900000850000010000400000000007400020010000030060000000 +000000107020030000000000600000040020700600000100000000040200050008000300000105000 +000000107024000000000500600030000050000100400900000000000039020700000008001000000 +000000107040080000900000600028000030000600050000100000000020890100700000000000000 +000000107040080000900000600082000030000600050000100000000020890100700000000000000 +000000107090020000000000004000401500020003060000700000000090030400800000100000000 +000000107400200000080300000200000480000076000000000000567000000000400030001000000 +000000107400200000100000000098000050070000006000100000000095300000070400000000020 +000000107830000000000060400600200050000107000000000000071400000000050680000000000 +000000107900020000000000800000701500400000030000900000000340060008000020010000000 +000000108000008300700040000500300000006000040200000000000200050080000200030100000 +000000108000008300700050000200300000006000050400000000000200040080000200030100000 +000000108000407000000500300040000620000010000020000000701000050000200070300000000 +000000108000600400200300000000800090504000000071000000600000020090070000000010000 +000000108000605000000400300040000620000010000020000000106000050000200070300000000 +000000108009400000000300700600000040000020000000010000370005000010000200000600080 +000000108040200000000600000020400030700010500000000000100080000000000340000000026 +000000108050400000000200000020500030700010600000000000100080000000000350000000042 +000000108200300000600000000010054000000000020000008000000230040080000500700600000 +000000108200700000000000300500000090000038000020010000010000400000500020007600000 +000000108300060000000000500900000600000800020000401000085000001000030070040000000 +000000108400200000100000000089000050070000006000100000000075300000080400000000020 +000000108500040000000000700030050020001000000000200000000001360820000040000700000 +000000108500200000000000400900000050000340000000060200000605070041000000000000030 +000000108600200000000000400200000050000340000000070300000605020041000000000000030 +000000108600300000200000000010058000000000020000001000000230040080000900700600000 +000000108700400000000000000000038600400000070000010000000500064035200000010000000 +000000108900040000000000700030050060001000000000200000000001350820000040000700000 +000000108900040000000000700050060030001000000000200000000001350820000040000700000 +000000109000200300040070000070000080000300000000100000203000600000004050100080000 +000000109000400200000508000000300080100000040200000000060000730430000000000010000 +000000109000807000000500300040000620000010000080000000701000050000400070300000000 +000000109040200000030000400600405020100000000000700000000000870000019000000060000 +000000109200600000000050400000010500000700030300000000000802060014000000000000070 +000000109300400000000000200027006000000800500009000000510020000400000030000090000 +000000109400050000000020300000109000500007000000300000013000000080000040009000020 +000000109400050000090020000000401700060000000000700000000060020700300000801000000 +000000109700008000000000000360000080010590000000000020000140600205000000000900000 +000000109700400000000000000000039600400000070000010000000500084035200000010000000 +000000120000040700030007000057000008000410000000200000000000053400600000100000000 +000000120063000000000000000040000503100208000000700000500000080002600000000030400 +000000126000850000000000004000300700400001000105000000070000380000046000000000000 +000000126000950000000000004000300800400001000105000000030000790000046000000000000 +000000130000080005420000000600000020005010000000000400070402000000600200000000001 +000000130020400000000000000000600025700080000100000000000016700005200000040000300 +000000130040020000000000000000000026700900000100000000062050004000107300000800000 +000000130047000000050000000100302000000050007000000040800000200000603000000740000 +000000130200600000700500000040010300000200050010000000500000007000084000000030000 +000000130400070000800000000000506200700300004000100000000080076015000000000000000 +000000130800600000200500000040010300000200050010000000500000008000074000000030000 +000000135608000000000000040030400010000027000050000000200000706000000200000300000 +000000135608000000000000040050400010000076000030000000200000706000000200000300000 +000000135807000000000000040030400010000076000050000000200000706000000200000300000 +000000136087000000000000050000740900360000000000000000004080200600305000000000000 +000000140090020000000000000000107400950000000000400000001000302000090050800600000 +000000140090020000000600700401000000000580000300000000080000502000001030000400000 +000000140400000600000500000000305008200700000106000000050000083600010000000000000 +000000150080020000000000000000501400870000000000400000001000320000080007500600000 +000000150900700000000000030042000700001030000050000000200600800300400000000050000 +000000160000009500000040000041020000000300600080000000700000024300900000000000008 +000000160020700000000000900600010000000040002030000000100000470000300005800200000 +000000160040020000000009070300100000000000402600000000000630500029000000000800000 +000000160200040000000000708000530020007000050010000000300006400000107000000000000 +000000160200070000300000800000608900420000000000500000000010002008000050060000000 +000000160200070000300000800000608900420000000000500000000040002008000050060000000 +000000160800400000000000700000070600010030000200000050000208000076000000000500004 +000000170000004600000050000051020000000300700080000000700000025400900000000000008 +000000170020900000000000600600010000000040002030000000100000460000300005800200000 +000000170030040000000000600600100000000006030005000004000650200740000000000800000 +000000170040800000000000002000500048200070000100000000000010260080600000000000300 +000000175049600000000000000500000300100090000000420000020000049300001000000000000 +000000180000205000000003000010080000000600002003000000000040710600000300200500000 +000000180300500000000000020061000000000300400008000000710000300000086005000020000 +000000180300900000000000020068000000000300400001000000710000300000086005000020000 +000000190300400000000000020071000000000300500009000000810000400000097006000020000 +000000201000020500080004000000230000090000040000500000602100000500000300000000070 +000000201000080400300050000000204000500000070000600000004100002020000600000000030 +000000201000370000000000000430010000000002600080000070000800530001000020700000000 +000000201004030000000000000370000080600200000000500000540000600000070040002001000 +000000201005090000038000000120400000000030080700000000000000430000201000000600000 +000000201005090000038000000120400000000030080700000000000000530000201000000600000 +000000201009050000400700000600102000000000030000800000000040690710000000000030000 +000000201030070000000400800000050040801000000006000000200801000050000700000000090 +000000201040030000000006000600072000030000040000100500201800000000000730000000000 +000000201060400000003000000200070100500020000000000060100000500000308000000600040 +000000201070300000000000000060000030000205000000041000005780060100000400200000000 +000000201080050000000000000600201000000500740000300000000084050302000000100000000 +000000201080300000000000000060000030000205000000041000005780060100000400200000000 +000000201080400000000700000000540080302000000100000000500032600070000040000000000 +000000201090004000030000000000008530700000400100000000200670000000020800000100000 +000000201090030000000000004006000530300400000000100000000090080204000000170000000 +000000201090400000000300000170020000000008600000000050208000500000900040006000000 +000000201096000000000000500000090040200030000100000000070502000000006083000100000 +000000201500300000000070000000500030020004000076000000000000350000021000800000400 +000000201600300000700000000008540000020000030000600700010082000500000060000000000 +000000201730000000600040000000060030008000500200000000001200000000508000060000070 +000000201800000900000400000000610030270000000900000000090072000001000040000800000 +000000203006400000000000500100600070820000000000830000000059000050002000000000040 +000000203010700000000000000000023400090060000800000000000800019600900070200000000 +000000203080700000000000100005000040300010000000000600000407060100000080200500000 +000000203800600000000000700002000100040800000000300060000027040300000005000010000 +000000204000001000000080000020400500000030700000000080100200006806000010000700000 +000000204001000000050000000006500080200009000000000010000150700940000300000800000 +000000204050030000000000690000850010206000000900000000000206000130000000000400000 +000000204050700000680000000300000090000014000000020000201000000000800050000600700 +000000204100900000000000007670300000000100830040000000000025000500000090000040000 +000000204100900000000000008680700000000100730040000000000025000500000090000040000 diff --git a/Lab1/easy _version/test20 b/Lab1/easy _version/test20 new file mode 100644 index 00000000..51572ddf --- /dev/null +++ b/Lab1/easy _version/test20 @@ -0,0 +1,20 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 diff --git a/Lab1/easy _version/test200 b/Lab1/easy _version/test200 new file mode 100644 index 00000000..0724da84 --- /dev/null +++ b/Lab1/easy _version/test200 @@ -0,0 +1,200 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 diff --git a/Lab1/easy _version/test30 b/Lab1/easy _version/test30 new file mode 100644 index 00000000..159fa02e --- /dev/null +++ b/Lab1/easy _version/test30 @@ -0,0 +1,30 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 diff --git a/Lab1/easy _version/test50 b/Lab1/easy _version/test50 new file mode 100644 index 00000000..0c691fc1 --- /dev/null +++ b/Lab1/easy _version/test50 @@ -0,0 +1,50 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 diff --git a/Lab1/easy _version/test500 b/Lab1/easy _version/test500 new file mode 100644 index 00000000..768cc5cd --- /dev/null +++ b/Lab1/easy _version/test500 @@ -0,0 +1,500 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 diff --git a/Lab1/easy_version/Makefile b/Lab1/easy_version/Makefile new file mode 100755 index 00000000..742d097d --- /dev/null +++ b/Lab1/easy_version/Makefile @@ -0,0 +1,8 @@ +CXXFLAGS+=-O2 -ggdb -DDEBUG +CXXFLAGS+=-Wall -Wextra + +all: sudoku_solve + +sudoku_solve: main.cc neighbor.cc sudoku_basic.cc + g++ -o $@ $^ -O2 -lpthread + diff --git a/Lab1/easy_version/Makefile.win b/Lab1/easy_version/Makefile.win new file mode 100755 index 00000000..db229c01 --- /dev/null +++ b/Lab1/easy_version/Makefile.win @@ -0,0 +1,34 @@ +# Project: soudu +# Makefile created by Dev-C++ 5.11 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +OBJ = main.o neighbor.o sudoku_basic.o +LINKOBJ = main.o neighbor.o sudoku_basic.o +LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3 +INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" +CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" +BIN = soudu.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm.exe -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before $(BIN) all-after + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) + +main.o: main.cc + $(CPP) -c main.cc -o main.o $(CXXFLAGS) + +neighbor.o: neighbor.cc + $(CPP) -c neighbor.cc -o neighbor.o $(CXXFLAGS) + +sudoku_basic.o: sudoku_basic.cc + $(CPP) -c sudoku_basic.cc -o sudoku_basic.o $(CXXFLAGS) diff --git a/Lab1/easy_version/README.md b/Lab1/easy_version/README.md new file mode 100644 index 00000000..4384e839 --- /dev/null +++ b/Lab1/easy_version/README.md @@ -0,0 +1,60 @@ +# Cloud Computing: Overall Lab Instruction + + + +## 1. Overview + +There are **4 labs in total** in this course. All the materials of each lab are under folders Lab1-4 in this repo. Please clone the lab git repo onto your local computer, + +`git clone https://github.com/1989chenguo/CloudComputingLabs.git` + +and always track our latest lab materials using the following commands (should first enter the folder you have cloned from our lab repo) + +`git pull` + +You can find this overall lab instruction in `README.md` in the root folder. + +Please **carefully read the overall lab instruction before you do anything**. + +Also, please **carefully read each lab's instruction** ([Lab1](Lab1/README.md), [Lab2](Lab2/README.md), [Lab3](Lab3/README.md), [Lab4](Lab4/README.md)) to get each lab's task, background, requirements, etc. + +## 2. Group collaboration + +Each student should register your own github account. Group members should use **git and github** to collaborate. + +All the labs are done in the unit of group, i.e., a group only needs to submit one piece of code for each lab. However, each group member should make enough contribution to the lab. Teaching assistants will check the **git commit history** to evaluate each one’s contribution. + +## 3. Code submission + +Each group should create a code repo for our course (create your own group's repo, do not push onto my course lab repo!). The group leader should send an email to TA telling us your group's lab git repo address. For example, https://github.com/group1/CloudComputingLabs.git` + +**All the lab code should be submitted through pushing to your group's github code repo.** Teaching assistants will checkout your commit, and read and test your codes from the above repo address you provided us. The code of different lab should be in different folders, named Lab1/Lab2/Lab3/Lab4, respectively (following the same structure of this repo). Please note that your lab folder name should be exactly same as above (be careful about the first capital letter and no space before the number), otherwise your code may fail in our TAs' automatic testing scripts. All lab codes should be in the same course git repo of your group. + +Please write a README.md to each lab code folder, briefly introducing how to run your lab code (including how to set the environment, provide the input, and explain the output, etc.). Keep the README short and clear! Also, your code should be well commented so that other people can understand without asking you. + +All of our labs focus very much on the performance. So please **DO submit a performance test report** along with each of your lab code. Unlike your other courses, we do NOT require you to submit any lab report to explain your code structure or share your understandings or experiences during lab conduction. + +## 4. Environment requirement + +### 4.1 OS requirement + +All the labs should be tested and runnable on UNIX-like operating systems, such as Linux distributions (e.g., Ubuntu, CentOS) and MacOS. We highly recommend you to use Linux distributions such as Ubuntu. +If you only have windows PC or laptops, install a UNIX VM and do experiments on the VM. + +### 4.2 Programming language + +Any programming languages are permitted in all labs, such as C/C++, Java, Go, Python, Perl. But for performance consideration, we highly recommend you to use C/C++ or Go !!! + +### 4.3 Try to only use standard API + +To make your program portable, try your best to only use standard & widely available functions and normal libraries (such as `glibc`, `C++ STLs` and some typical math libraries). All the labs should only use standard system API defined by POSIX specification or Linux man page specification. We prefer to use standard POSIX API, so your code can be easily runnable on various kind of UNIX-like systems (instead of only on Linux). + +## 5. Grading + +Grading details are specified in each lab's instruction document, please carefully read them [Lab1](Lab1/README.md), [Lab2](Lab2/README.md), [Lab3](Lab3/README.md), [Lab4](Lab4/README.md). + +Besides, we have the following 3 overall grading requirements applicable to all the 4 labs: + +1. **DO NOT copy** others' code (either from the Internet or from your classmates), otherwise your group (every member and the leader) will got **zero point** in the lab. However, we encourage to communicate with other group and learn from each other. But do remember to write the code yourself and not copy. +2. **DO NOT miss the deadline**, otherwise your group (every member and the leader) points will be reduced accordingly. +3. Typically, your group (every member and the leader) will get same points in each lab, unless we find severely **unfair contribution** in the git commit history. In the overall grading, the leader will get some more points as bonus. \ No newline at end of file diff --git a/Lab1/easy_version/main.cc b/Lab1/easy_version/main.cc new file mode 100755 index 00000000..dbef2eb1 --- /dev/null +++ b/Lab1/easy_version/main.cc @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "sudoku.h" + +char puzzle[MaxNumPuzzle][128]; +char solution[MaxNumPuzzle][N+1]; +int board[MaxNumPuzzle][N]; +int spaces[MaxNumPuzzle][N]; + +int total=0;// +int totalPerThread=0; +int total_solved = 0;//ѾĿ +bool (*solve)(int,int,int*, int*) = solve_sudoku_basic;//basic +int numOfWorkerThread=2;//̵߳ĿĬ˫߳ +pthread_t* WorkThreads; +long int threadID; + +int nextPuzzleWillSolve=0; +pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; + +const char outputFileName[10]="outfile"; +int64_t now() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +void read_data() { //ļ + + char *file_name=(char*)malloc(256*sizeof(char)); + FILE *fp; + while(fgets(file_name, 256, stdin)) { + + if(file_name[0]=='\n') { + + printf("please wait...\n"); + break; + } + + if(file_name[strlen(file_name)-1]=='\n') file_name[strlen(file_name)-1]='\0'; + + fp = fopen(file_name, "r"); + + if(fp==NULL) { + printf("%s does not exist.please try again\n",file_name); + continue; + } + while(fgets(puzzle[total],1024,fp)) { + if(strlen(puzzle[total])>=N) { + ++total; + } + } + } + +} + +void* Thread_solve(void* CurThread) { + long int my_CurThread = (long int) CurThread; + int first_puzzle = my_CurThread*totalPerThread; + int last_puzzle = (my_CurThread==numOfWorkerThread-1)?total:(my_CurThread+1)*totalPerThread; + + //pthread_mutex_lock(&mutex); + int board[N],spaces[N]; + for(int i=first_puzzle; i=2) + numOfWorkerThread=atoi(argv[1]);//빤߳ + + init_neighbors(); + read_data(); + totalPerThread=total/numOfWorkerThread; + int64_t start = now();//ʼʱ + WorkThreads = (pthread_t *)malloc(numOfWorkerThread*sizeof(pthread_t)); + + for(threadID=0;threadID +#include +#include + +#include "sudoku.h" + +#include +int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± +//ڶάϱǷھ adjacent[i][j]Ϊtrueʾ[i][j]Ƿ[row][col]ھ +static void mark_adjacent(bool adjacent[ROW][COL], int row, int col) +{ + for (int i = 0; i < NUM; ++i) {//С + adjacent[row][i] = true; + adjacent[i][col] = true; + } + int top = (row/3)*3;// + int left = (col/3)*3; + adjacent[top][left] = true; + adjacent[top][left+1] = true; + adjacent[top][left+2] = true; + adjacent[top+1][left] = true; + adjacent[top+1][left+1] = true; + adjacent[top+1][left+2] = true; + adjacent[top+2][left] = true; + adjacent[top+2][left+1] = true; + adjacent[top+2][left+2] = true; +} +// һάͳƷھӵ± +static void collect_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + int n = 0; + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (adjacent[y][x] && !(y == row && x == col)) { + //assert(n < NEIGHBOR); + myneighbors[n++] = y*COL + x; + } + } + } + //assert(n == NEIGHBOR); +} +//Ϣ +static void print_neighbors(const bool adjacent[ROW][COL], int row, int col, int myneighbors[NEIGHBOR]) +{ + for (int y = 0; y < ROW; ++y) { + for (int x = 0; x < COL; ++x) { + if (y == row && x == col)//ڷ X + putchar('X'); + else + putchar(adjacent[y][x] ? 'o' : '.');//o ,. + } + printf("\n"); + } + for (int i = 0; i < NEIGHBOR; ++i) { + printf("%2d, ", myneighbors[i]); + } + puts("\n"); +} + void init_neighbors() +{ + for (int row = 0; row < ROW; ++row) { + for (int col = 0; col < COL; ++col) { + bool adjacent[ROW][COL]; + bzero(adjacent, sizeof adjacent);//ÿζҪ + mark_adjacent(adjacent, row, col);//ÿ20ھӣԼ21 81 + + int me = row*COL + col;//õһά± + collect_neighbors(adjacent, row, col, neighbors[me]); + + if (DEBUG_MODE) + print_neighbors(adjacent, row, col, neighbors[me]); + } + } +} + +bool solved(int board[N])//жǷȷ +{ + int (*chess)[COL] = (int (*)[COL])board; + for (int row = 0; row < ROW; ++row) { + // + int occurs[10] = { 0 }; + for (int col = 0; col < COL; ++col) { + int val = chess[row][col]; + //assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int col = 0; col < COL; ++col) { + // + int occurs[10] = { 0 }; + for (int row = 0; row < ROW; ++row) { + int val = chess[row][col]; + // assert(1 <= val && val <= NUM); + ++occurs[val]; + } + + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + + for (int row = 0; row < ROW; row += 3) { + //鹬 + for (int col = 0; col < COL; col += 3) { + int occurs[10] = { 0 }; + ++occurs[chess[row ][col]]; + ++occurs[chess[row ][col+1]]; + ++occurs[chess[row ][col+2]]; + ++occurs[chess[row+1][col]]; + ++occurs[chess[row+1][col+1]]; + ++occurs[chess[row+1][col+2]]; + ++occurs[chess[row+2][col]]; + ++occurs[chess[row+2][col+1]]; + ++occurs[chess[row+2][col+2]]; + if (std::count(occurs, occurs+10, 1) != NUM) + return false; + } + } + return true; +} diff --git a/Lab1/easy_version/outfile b/Lab1/easy_version/outfile new file mode 100755 index 00000000..47dee6c9 --- /dev/null +++ b/Lab1/easy_version/outfile @@ -0,0 +1,100 @@ +825943167467218593139756284298364751371529846546187932612495378983672415754831629 +965824137834971265127563498619248753352197846748635912571486329493752681286319574 +542863197987125643136479852269731584451286739873954216725348961398617425614592378 +354672198629518374718943625541396782896721543273854916467239851185467239932185467 +345672198629418375718953624271345986896721453453896712567239841184567239932184567 +537926148819437562264581397143798625975612834628345719791864253486253971352179486 +469725138137689452258341679326854791584197263971263845615438927892576314743912586 +435927168918635742267481395541398627689712534723546819196874253854263971372159486 +463297158789451623125368794651739842937824516248516937372185469816943275594672381 +293547168648291753517638492821475639736912584459863217162384975985726341374159826 +493657128258491763617238594821576439734912685569843217142385976986724351375169842 +439572168278316459651849237912754683847163925563928714195237846386491572724685391 +946352178231786954875194362583467291169238547724915683612879435398541726457623819 +672345198351968247894217563928753614417896325536421789285679431169534872743182956 +925743168468219573137856294289364751371528946546197832612475389793682415854931627 +476532198518947236392618754734156829251489673689273415945821367827365941163794582 +493756128518294367276831495964127853825349716137568249382615974641973582759482631 +425736198618294573379851462234169857957348216186572349893615724741923685562487931 +439572168658314297271896453912758634847963521563421789195237846386145972724689315 +542376198791485236368129457159738642483652971276914583827591364635247819914863725 +475962138918347625362518794734159862291486573586273419649821357827635941153794286 +473952168918647523562318794754169832291483675386275419649821357827536941135794286 +527843169819265374346971825971426583685397412432158796253719648798634251164582937 +824736159375491268619528473796342581153879642248165397961284735432957816587613924 +537246189419837562862591347143789625275614938986325714721968453698453271354172896 +278654139541293768936178452697485321124936587853721694319542876765819243482367915 +586437129249681753137259486762913548451768932398524617975842361814376295623195874 +765238149382419675941567283827956314134872596659341827513724968496185732278693451 +852734169436951287197826354324189576561247938978365412613472895285693741749518623 +632874159478159236195623487583491762967285314214736598349567821726318945851942673 +586234179729618543134759268362471985418592736957386421873145692295867314641923857 +542378169761495238389126457158739642493652871276814593927561384835247916614983725 +748536129529841736631927584257369418386415297914278365872194653493652871165783942 +475386129963512847821479635248961573137258964659743218594127386382694751716835492 +548973126216854973793162854869325741437681295125497638674519382382746519951238467 +549873126216954387378162954967325841483691275125487639634518792892746513751239468 +568749132791283645423165897614378529235914786987526413176492358859631274342857961 +496752138821439567573168249934671825762583491158924673289316754315247986647895312 +285694137941723568673518249538471926724936851196285473862359714459167382317842695 +298467135347215689651839472184372596936154827725986341873591264419623758562748913 +659478132281693745734521698945817326376249851812356974593162487127984563468735219 +527469138431875962896213745183546297759328614264197853342981576615732489978654321 +659487132871623945234591687945718326386249751712356894593162478128974563467835219 +927846135648153927315279648736498512891527364452631879283914756164785293579362481 +927684135648135972315297648756423819891576324432819567283941756164758293579362481 +629748135847153962315269847736482519981576324452931678293814756174695283568327491 +942857136587631492136492857825743961369218574471569328754986213618325749293174685 +285976143193824567476513928632157489954382671718469235561748392347291856829635714 +632875149197324658845619723451962387729583461368147295984736512576291834213458976 +567238149428179635319546872974365218235781496186492357751624983693817524842953761 +237849156186325794459716832692571483874293615315468279761954328943182567528637941 +427386159936715284518942637842569713791238465653174928275693841389421576164857392 +492835167817269543536147289941726835275384691683591472758613924324958716169472358 +389425167421769538567138924675812349918643752234957816192586473746391285853274691 +237458169946721853158369274392145687715986432684273915471632598829517346563894721 +784395162261748593953612748649531827837264951512879634378926415426157389195483276 +897253164246871593351469827173628945425197638689534271534916782918742356762385419 +897452163216873594354169827173628945425791638689534271531946782948217356762385419 +342759168857416293691823745485972631719635482263184957134298576576341829928567314 +592836174873214659614759283951427836246385791387691542768143925425968317139572468 +386425179421976538579138624695812347718643952234597816152789463947361285863254791 +459362178836741925271598643684135792927486531315927864193654287748219356562873419 +829365174741892653365147892936521748258476931174983526493718265582639417617254389 +236984175749615238815732964584176392162593487973428651621357849397841526458269713 +925764183837215694146893257412387569789651432563429871358942716694178325271536948 +625439187387512694194867523561274839279358416438691752712945368943186275856723941 +625437189387912654194865723468291537279358416531674892712549368943186275856723941 +726538194398412765145976823671245938284369517539781642812653479453197286967824351 +459783261763921584281654937174236859395817642826549713632175498517498326948362175 +875346291296781453341952768938274516562819374417635829754163982123598647689427135 +673584291219376485845129763436718952597432618182695374924861537351947826768253149 +937864251254139768186725934375916482618243579429587316541398627893672145762451893 +947368251215794863638125749123487596456932187789516324561879432394251678872643915 +974368251215794368638125974123487695546932187789516423461879532397251846852643719 +567389241189254763432716589643192875871465932295873416328541697716928354954637128 +475389261638172459912465873723958146891746325546213987267891534359624718184537692 +763498251842531967519726384654372819137985642928164573271853496486219735395647128 +459867231762431859813295674246973185587126493391584762138749526624358917975612348 +359476281672318945814529376461897532798235614523641798945782163186953427237164859 +596437281781952634423816975634271598219568743875349126967184352342695817158723469 +359476281682319745714528396461897532897235614523641879945782163176953428238164957 +495368271781425936623719458967541382342687519158293764514832697279156843836974125 +574836291691254783832791645426918537759362418183547962248673159315429876967185324 +543678291791234865862519374416927538357486129928153746635791482284365917179842653 +364895271891472365527361984175629438439518627682743159248137596713956842956284713 +734859261596217438812364579653791842287435916149628357371582694425976183968143725 +739845261542316897681279543198562734325794186476138925214687359953421678867953412 +835976241692314578741258396368547129427891635159623784916782453574139862283465917 +984753261735621984612849753157962438398417526246385197871296345423578619569134872 +649753281837126954152498673584619732276534198913287465498372516321965847765841329 +514976283236485791789213564195624378823597416467831952348159627651742839972368145 +947651283312784965568239741756123498193468527824597136435872619681945372279316854 +654198273981732456723645198815276349376914825492853617538427961147369582269581734 +496178253827635419135294786682759134743861592519342867968527341371486925254913678 +981657234437921658562384197328479561614835729759162483145298376876543912293716845 +893715264721946835654328179436571982217689543589432617362154798948267351175893426 +369178254452639187871524693743852916286941735915367428597286341134795862628413579 +793185264152746839684239517328567491567914328419328675271453986946872153835691742 +987563214124987653356412987671398542295174836843256179439825761562731498718649325 +978531264124968357356472918681793542295184736743256189439625871562817493817349625 diff --git a/Lab1/easy_version/soudu.dev b/Lab1/easy_version/soudu.dev new file mode 100755 index 00000000..a263a0d6 --- /dev/null +++ b/Lab1/easy_version/soudu.dev @@ -0,0 +1,92 @@ +[Project] +FileName=soudu.dev +Name=soudu +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=1 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=main.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=neighbor.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=sudoku.h +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=sudoku_basic.cc +CompileCpp=1 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Lab1/easy_version/soudu.layout b/Lab1/easy_version/soudu.layout new file mode 100755 index 00000000..e5d0a08b --- /dev/null +++ b/Lab1/easy_version/soudu.layout @@ -0,0 +1,23 @@ +[Editor_0] +CursorCol=37 +CursorRow=64 +TopLine=55 +LeftChar=1 +[Editors] +Order=0,1,2,3 +Focused=0 +[Editor_1] +CursorCol=1 +CursorRow=59 +TopLine=95 +LeftChar=1 +[Editor_2] +CursorCol=53 +CursorRow=26 +TopLine=12 +LeftChar=1 +[Editor_3] +CursorCol=34 +CursorRow=48 +TopLine=35 +LeftChar=1 diff --git a/Lab1/easy_version/sudoku.h b/Lab1/easy_version/sudoku.h new file mode 100755 index 00000000..a97c32f5 --- /dev/null +++ b/Lab1/easy_version/sudoku.h @@ -0,0 +1,31 @@ +#ifndef SUDOKU_H +#define SUDOKU_H + +const bool DEBUG_MODE = false;//ǷмϢ +enum { ROW=9, COL=9, N = 81, NEIGHBOR = 20 };//Ϊ һΧ20ڵķСС +const int NUM = 9;//1~9 + + +extern int neighbors[N][NEIGHBOR];//neighbors[i][j]ʾiĵjھӵ± + +const int MaxNumPuzzle = 1e6; +extern char puzzle[MaxNumPuzzle][128]; +extern char solution[MaxNumPuzzle][N+1]; + +extern int board[MaxNumPuzzle][N]; +extern int spaces[MaxNumPuzzle][N]; +/********************************/ + + +void init_neighbors(); +int input(const char in[N],int board[N],int spaces[N]); +void init_cache(); + +bool available(int guess, int cell,int board[N]); + +bool solve_sudoku_basic(int which_space,int nspaces, int board[N],int spaces[N]); +bool solve_sudoku_min_arity(int which_space); +bool solve_sudoku_min_arity_cache(int which_space); +bool solve_sudoku_dancing_links(int unused); +bool solved(int board[N]); +#endif diff --git a/Lab1/easy_version/sudoku_basic.cc b/Lab1/easy_version/sudoku_basic.cc new file mode 100755 index 00000000..7ccb057d --- /dev/null +++ b/Lab1/easy_version/sudoku_basic.cc @@ -0,0 +1,63 @@ +#include +#include + +#include + +#include "sudoku.h" + +//int board[N];//һάֵΪ +//int spaces[N];//ĿոֵΪе± +//int nspaces;// Ŀո +//int (*chess)[COL] = (int (*)[COL])board;//Ψ̵Ķά + +static int find_spaces(int board[N],int spaces[N])//пո¼ոһά +{ + int nspaces = 0; + for (int cell = 0; cell < N; ++cell) { + if (board[cell] == 0) + spaces[nspaces++] = cell; + } + return nspaces; +} + +int input(const char in[N],int board[N],int spaces[N])//ַתΪһάֵ +{ + for (int cell = 0; cell < N; ++cell) { + board[cell] = in[cell] - '0'; + //assert(0 <= board[cell] && board[cell] <= NUM); + } + return find_spaces(board,spaces); +} + +bool available(int guess, int cell, int board[N]) +{ + for (int i = 0; i < NEIGHBOR; ++i) { + int neighbor = neighbors[cell][i]; + if (board[neighbor] == guess) { + return false; + } + } + return true; +} + +bool solve_sudoku_basic(int which_space,int nspaces,int board[N],int spaces[N])//ݹ +{ + if (which_space >= nspaces) { + return true; + } + int cell = spaces[which_space]; + + for (int guess = 1; guess <= NUM; ++guess) { + if (available(guess, cell,board)) { + assert(board[cell] == 0); + board[cell] = guess; + if (solve_sudoku_basic(which_space+1,nspaces,board,spaces)) { + return true; + } + + assert(board[cell] == guess); + board[cell] = 0; + } + } + return false; +} diff --git a/Lab1/easy_version/sudoku_solve b/Lab1/easy_version/sudoku_solve new file mode 100755 index 00000000..69a12120 Binary files /dev/null and b/Lab1/easy_version/sudoku_solve differ diff --git a/Lab1/easy_version/test1 b/Lab1/easy_version/test1 new file mode 100755 index 00000000..8d81622c --- /dev/null +++ b/Lab1/easy_version/test1 @@ -0,0 +1 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 diff --git a/Lab1/easy_version/test10 b/Lab1/easy_version/test10 new file mode 100755 index 00000000..2148a9c9 --- /dev/null +++ b/Lab1/easy_version/test10 @@ -0,0 +1,10 @@ +000000103900050000000000700060020040001000000000300000000001460820000050000700000 +000000103900050000000000800060020070001000000000300000000001460720000050000800000 +000000104000003600000050002503000000200600000000100080000070230010000000000400000 +000000104000010800600700000391000000080500000000200000506000070400080000000000000 +000000104000060000000050000200430000000107000600000800010500000070000040000000023 +000000104000080300040050000000200070300000600001004000870000050000300000000100000 +000000104000702000000000000460010000000500070100000000000380600027000030004000000 +000000104000802000000000000460070000000600080100000000000340700028000050009000000 +000000104080900000000000500000702080001000000500000000000530600020000030400010000 +000000104702000000000000000000705020300600000010000000200000630050014000000080000 \ No newline at end of file diff --git a/Lab1/easy_version/test100 b/Lab1/easy_version/test100 new file mode 100755 index 00000000..64dfb5c9 --- /dev/null +++ b/Lab1/easy_version/test100 @@ -0,0 +1,100 @@ +000000107400200000100000000098000050070000006000100000000095300000070400000000020 +000000107830000000000060400600200050000107000000000000071400000000050680000000000 +000000107900020000000000800000701500400000030000900000000340060008000020010000000 +000000108000008300700040000500300000006000040200000000000200050080000200030100000 +000000108000008300700050000200300000006000050400000000000200040080000200030100000 +000000108000407000000500300040000620000010000020000000701000050000200070300000000 +000000108000600400200300000000800090504000000071000000600000020090070000000010000 +000000108000605000000400300040000620000010000020000000106000050000200070300000000 +000000108009400000000300700600000040000020000000010000370005000010000200000600080 +000000108040200000000600000020400030700010500000000000100080000000000340000000026 +000000108050400000000200000020500030700010600000000000100080000000000350000000042 +000000108200300000600000000010054000000000020000008000000230040080000500700600000 +000000108200700000000000300500000090000038000020010000010000400000500020007600000 +000000108300060000000000500900000600000800020000401000085000001000030070040000000 +000000108400200000100000000089000050070000006000100000000075300000080400000000020 +000000108500040000000000700030050020001000000000200000000001360820000040000700000 +000000108500200000000000400900000050000340000000060200000605070041000000000000030 +000000108600200000000000400200000050000340000000070300000605020041000000000000030 +000000108600300000200000000010058000000000020000001000000230040080000900700600000 +000000108700400000000000000000038600400000070000010000000500064035200000010000000 +000000108900040000000000700030050060001000000000200000000001350820000040000700000 +000000108900040000000000700050060030001000000000200000000001350820000040000700000 +000000109000200300040070000070000080000300000000100000203000600000004050100080000 +000000109000400200000508000000300080100000040200000000060000730430000000000010000 +000000109000807000000500300040000620000010000080000000701000050000400070300000000 +000000109040200000030000400600405020100000000000700000000000870000019000000060000 +000000109200600000000050400000010500000700030300000000000802060014000000000000070 +000000109300400000000000200027006000000800500009000000510020000400000030000090000 +000000109400050000000020300000109000500007000000300000013000000080000040009000020 +000000109400050000090020000000401700060000000000700000000060020700300000801000000 +000000109700008000000000000360000080010590000000000020000140600205000000000900000 +000000109700400000000000000000039600400000070000010000000500084035200000010000000 +000000120000040700030007000057000008000410000000200000000000053400600000100000000 +000000120063000000000000000040000503100208000000700000500000080002600000000030400 +000000126000850000000000004000300700400001000105000000070000380000046000000000000 +000000126000950000000000004000300800400001000105000000030000790000046000000000000 +000000130000080005420000000600000020005010000000000400070402000000600200000000001 +000000130020400000000000000000600025700080000100000000000016700005200000040000300 +000000130040020000000000000000000026700900000100000000062050004000107300000800000 +000000130047000000050000000100302000000050007000000040800000200000603000000740000 +000000130200600000700500000040010300000200050010000000500000007000084000000030000 +000000130400070000800000000000506200700300004000100000000080076015000000000000000 +000000130800600000200500000040010300000200050010000000500000008000074000000030000 +000000135608000000000000040030400010000027000050000000200000706000000200000300000 +000000135608000000000000040050400010000076000030000000200000706000000200000300000 +000000135807000000000000040030400010000076000050000000200000706000000200000300000 +000000136087000000000000050000740900360000000000000000004080200600305000000000000 +000000140090020000000000000000107400950000000000400000001000302000090050800600000 +000000140090020000000600700401000000000580000300000000080000502000001030000400000 +000000140400000600000500000000305008200700000106000000050000083600010000000000000 +000000150080020000000000000000501400870000000000400000001000320000080007500600000 +000000150900700000000000030042000700001030000050000000200600800300400000000050000 +000000160000009500000040000041020000000300600080000000700000024300900000000000008 +000000160020700000000000900600010000000040002030000000100000470000300005800200000 +000000160040020000000009070300100000000000402600000000000630500029000000000800000 +000000160200040000000000708000530020007000050010000000300006400000107000000000000 +000000160200070000300000800000608900420000000000500000000010002008000050060000000 +000000160200070000300000800000608900420000000000500000000040002008000050060000000 +000000160800400000000000700000070600010030000200000050000208000076000000000500004 +000000170000004600000050000051020000000300700080000000700000025400900000000000008 +000000170020900000000000600600010000000040002030000000100000460000300005800200000 +000000170030040000000000600600100000000006030005000004000650200740000000000800000 +000000170040800000000000002000500048200070000100000000000010260080600000000000300 +000000175049600000000000000500000300100090000000420000020000049300001000000000000 +000000180000205000000003000010080000000600002003000000000040710600000300200500000 +000000180300500000000000020061000000000300400008000000710000300000086005000020000 +000000180300900000000000020068000000000300400001000000710000300000086005000020000 +000000190300400000000000020071000000000300500009000000810000400000097006000020000 +000000201000020500080004000000230000090000040000500000602100000500000300000000070 +000000201000080400300050000000204000500000070000600000004100002020000600000000030 +000000201000370000000000000430010000000002600080000070000800530001000020700000000 +000000201004030000000000000370000080600200000000500000540000600000070040002001000 +000000201005090000038000000120400000000030080700000000000000430000201000000600000 +000000201005090000038000000120400000000030080700000000000000530000201000000600000 +000000201009050000400700000600102000000000030000800000000040690710000000000030000 +000000201030070000000400800000050040801000000006000000200801000050000700000000090 +000000201040030000000006000600072000030000040000100500201800000000000730000000000 +000000201060400000003000000200070100500020000000000060100000500000308000000600040 +000000201070300000000000000060000030000205000000041000005780060100000400200000000 +000000201080050000000000000600201000000500740000300000000084050302000000100000000 +000000201080300000000000000060000030000205000000041000005780060100000400200000000 +000000201080400000000700000000540080302000000100000000500032600070000040000000000 +000000201090004000030000000000008530700000400100000000200670000000020800000100000 +000000201090030000000000004006000530300400000000100000000090080204000000170000000 +000000201090400000000300000170020000000008600000000050208000500000900040006000000 +000000201096000000000000500000090040200030000100000000070502000000006083000100000 +000000201500300000000070000000500030020004000076000000000000350000021000800000400 +000000201600300000700000000008540000020000030000600700010082000500000060000000000 +000000201730000000600040000000060030008000500200000000001200000000508000060000070 +000000201800000900000400000000610030270000000900000000090072000001000040000800000 +000000203006400000000000500100600070820000000000830000000059000050002000000000040 +000000203010700000000000000000023400090060000800000000000800019600900070200000000 +000000203080700000000000100005000040300010000000000600000407060100000080200500000 +000000203800600000000000700002000100040800000000300060000027040300000005000010000 +000000204000001000000080000020400500000030700000000080100200006806000010000700000 +000000204001000000050000000006500080200009000000000010000150700940000300000800000 +000000204050030000000000690000850010206000000900000000000206000130000000000400000 +000000204050700000680000000300000090000014000000020000201000000000800050000600700 +000000204100900000000000007670300000000100830040000000000025000500000090000040000 +000000204100900000000000008680700000000100730040000000000025000500000090000040000 \ No newline at end of file diff --git a/Lab1/easy_version/test1000 b/Lab1/easy_version/test1000 new file mode 100755 index 00000000..c21f3fbe --- /dev/null +++ b/Lab1/easy_version/test1000 @@ -0,0 +1,1000 @@ +000000010400000000020000000000050407008000300001090000300400200050100000000806000 +000000010400000000020000000000050604008000300001090000300400200050100000000807000 +000000012000035000000600070700000300000400800100000000000120000080000040050000600 +000000012003600000000007000410020000000500300700000600280000040000300500000000000 +000000012008030000000000040120500000000004700060000000507000300000620000000100000 +000000012040050000000009000070600400000100000000000050000087500601000300200000000 +000000012050400000000000030700600400001000000000080000920000800000510700000003000 +000000012300000060000040000900000500000001070020000000000350400001400800060000000 +000000012400090000000000050070200000600000400000108000018000000000030700502000000 +000000012500008000000700000600120000700000450000030000030000800000500700020000000 +000000012700060000000000050080200000600000400000109000019000000000030800502000000 +000000012800040000000000060090200000700000400000501000015000000000030900602000000 +000000012980000000000600000100700080402000000000300600070000300050040000000010000 +000000013000030080070000000000206000030000900000010000600500204000400700100000000 +000000013000200000000000080000760200008000400010000000200000750600340000000008000 +000000013000500070000802000000400900107000000000000200890000050040000600000010000 +000000013000700060000508000000400800106000000000000200740000050020000400000010000 +000000013000700060000509000000400900106000000000000200740000050080000400000010000 +000000013000800070000502000000400900107000000000000200890000050040000600000010000 +000000013020500000000000000103000070000802000004000000000340500670000200000010000 +000000013040000080200060000609000400000800000000300000030100500000040706000000000 +000000013040000080200060000906000400000800000000300000030100500000040706000000000 +000000013040000090200070000607000400000300000000900000030100500000060807000000000 +000000013040000090200070000706000400000300000000900000030100500000060807000000000 +000000013200800000300000070000200600001000000040000000000401500680000200000070000 +000000013400200000600000000000460500010000007200500000000031000000000420080000000 +000000013400800000200000070000400900001000000060000000000501600380000200000070000 +000000014000000203800050000000207000031000000000000650600000700000140000000300000 +000000014000020000500000000010804000700000500000100000000050730004200000030000600 +000000014000708000000000000104005000000200830600000000500040000030000700000090001 +000000014008005000020000000000020705100000000000000800070000530600140000000200000 +000000014008005000020000000000020805100000000000000700070000530600140000000200000 +000000014008009000020000000000020805100000000000000700070000930600140000000200000 +000000014700000000000500000090014000050000720000600000000900805600000900100000000 +000000014790000000000200000000003605001000000000000200060000730200140000000800000 +000000014970000000000200000000003605001000000000000200060000730200140000000800000 +000000015000400070300060000800000200000104000400500000000023600010000000070000000 +000000015000400070400000000609000300000100800000700000500030200000060040010000000 +000000015000800070300000000408000300000100400000700000500040200000090060010000000 +000000015000800070400000000609000300000100800000700000500030200000060040010000000 +000000015000830000000000200023000800000001000080000000105040000000600720900000000 +000000015000830000000000200026000800000001000080000000105040000000300720900000000 +000000015000900070400000000608000300000100800000700000500030200000060040010000000 +000000015000900070400000000609000300000100800000700000500030200000060040010000000 +000000015000900080300000000704000300000100400000800000500040200000070060010000000 +000000015000900080400000000704000300000100900000800000500030200000070060010000000 +000000015020060000000000408003000900000100000000008000150400000000070300800000060 +000000015040080000000000300000040260500107000900000000300500000080000400000900000 +000000015300600000000000080600050200000001000000000040010200700000760300008000000 +000000015790000000000200000000008706001000000000000900070000830400150000000300000 +000000016000500040300070000900000200000408000700600000000023700040000000010000000 +000000016000708000000000050501200000300000800600000000040000200000053000080010000 +000000016000900080500000000405000300000100500000800000600040200000030070010000000 +000000016040005000000020000000600430200010000300000500000003700100800000002000000 +000000016070000040050200000400060300000005200000041000000900780100000000000000000 +000000016070000040050200000400060300000008200000041000000500790100000000000000000 +000000016200000000000300000601700002000900500400000000030000800000060040050040000 +000000016200080000009000000000420500010000000000000200000106030500000780000900000 +000000017090600000000000030400500200001000000000080000720000600000410500000003000 +000000017090600000000000050200000803000050400000001000600200300041070000000000000 +000000017090800000000000040007060300050000200000001000600300800401000000000050000 +000000017300080000000000000007100006000040300085000000200000840010700000000500000 +000000017600020000000000000153000000000080200007000000400301500020000600000700000 +000000018020500000000000000040000700600000500000041000000700260108300000400000000 +000000018050600000000000030400500200001000000000090000820000600000410700000003000 +000000018200400000000000070000008003000500200010000000502000600000040300000017000 +000000018320000000400000000008051000040000300000070000706000090000300700000200000 +000000018700040000000000030420000700000001000000300000500070200601800000040000000 +000000019000250000000000000091000030000400700030000000400000208200060500000001000 +000000019030050000000000020109000000000400700000870000000102000060000800500000300 +000000019030050000000000020109000000000400800000870000000102000060000700500000300 +000000019070000030200800000050600200001000000000200000000019500600000400000030000 +000000019300600000000000000600080500040000300000010000480000070000200400010900000 +000000019500600000000000000600080500040000300000010000380000040000200700010900000 +000000019500600000000000000600080500040000300000010000480000070000200400010900000 +000000019500800000000000000300070500040000300000010000470000060000200400010900000 +000000019800500000000000000300070500040000300000010000470000060000200400010900000 +000000021000030070040080000100207000050000400000000003200100000000040500000600000 +000000021000083000000040000500200070080000400030900000000060800100500000200000000 +000000021000083000000040000500200070080000400030900000000060800100700000200000000 +000000021000306000000800000400010600000700300200000000000090040530000000086000000 +000000021000407000000008000031060000000000750020000000500210000400000800000300000 +000000021000500030400600000000021000800000007500000600000400800010070000030000000 +000000021004090000070000030100203000500800000006000000200000600000060400030000000 +000000021005080000600000000000670300120000500400000000000201040003000000080000000 +000000021006800000000000070070021000020000400000005000500430600100000000000600000 +000000021030400000700000000100082000000000540000000000000560300290000000004700000 +000000021030600000000080000201000050500400000000370000700002000080000300000000600 +000000021040500000700000000100082000000000650000000000000610400320000000005700000 +000000021040500000800000000700092000000000650000000000000610400320000000005800000 +000000021040600000000000000201000050500800000000400300700020000060000800000300400 +000000021050030000000800000102000070700300000000540000600002000030000400000000500 +000000021060300000000708000100050040070000300000020000200040000000600800500000000 +000000021060500000000090000400002000070000300000600000102400000000030640800000000 +000000021060700000000000000402000000000600300500000700000340050080000600100002000 +000000021070030000000040000100205040030000800000100000200600000000070300600000000 +000000021070030000000090000100205040030000800000100000200600000000070300600000000 +000000021070300000000000000402000000000700300600000800000540060090000500100002000 +000000021070300000000408000100060050030000400000020000200050000000700800600000000 +000000021080300000000409000100060050030000400000020000200070000000800900500000000 +000000021090300000000000000402000000000700300600000700000540060080000500100002000 +000000021090300000000060000201000050500400000000970000600002000080000300000000900 +000000021090700000000000000000514000630000000000002000000600930001040000200000800 +000000021300050000000000000500630000010000080000000500704000600600200000000108000 +000000021300050000000000000500630000010000080000000900704000600600200000000108000 +000000021300050000000000000500830000010000090000000500704000600600200000000109000 +000000021300090000000000000500630000010000080000000500704000600600200000000108000 +000000021300090000000000000500630000010000080000000900704000600600200000000108000 +000000021300700000000000000060500300020000070000000800100040700500012000000006000 +000000021300800000000000000060500700020000040000000300100040800500012000000006000 +000000021300900000000000070200000400000060300000001000071040000000200508090000000 +000000021400300000000000000000010600080000300020007000600000470500120000000800000 +000000021400600000000000000000012800609000000000030000510000030000709600020000000 +000000021400600000000000000000012900706000000000030000510000030000807600020000000 +000000021430000000600000000201500000000006370000000000068000400000230000000070000 +000000021500040000000000070000300600000020500010000000600000203003107000000008000 +000000021500040000000600000031000080000070000020000000600300400405000700000200000 +000000021500400000000000000300000570600080000000010000010605000082000000000007400 +000000021500400000000800000021500000070000600000000030400000800300070000006020000 +000000021503000000600000000000104060700000500000200000000480300010070000200000000 +000000021600000030070900000000043700100000000000020000000600008002100000040000500 +000000021700060000490000000000070900003800000020000000960000800000302000000100000 +000000021700600000300500000000082000040010000500000000020040000000300700000000650 +000000021750000000000000000070000890000201000000400000030090500100030000400000600 +000000021800040000000000060090200000700000400000501000015000000000030900602000000 +000000021800400000009000000600570040300000800000020000070900400021000000000000000 +000000021800500000000060000030102000500000840000000000000780500620000000004000000 +000000021800600000000050000030102000500000840000000000000780500620000000004000000 +000000021800700000400005000023000060000800500010000000600000700000081000000030000 +000000023000500080000100000020000900000400100580000000600009500000020070001000000 +000000023000800010800400000032500000000000100070000000600070004100000500000003000 +000000023010040000500000000100000400000200080000803000000050160040000700003000000 +000000023010040000500000000100000400000200080000903000000050160040000700003000000 +000000023010040000500000000100000400000600090000203000000050170040000800003000000 +000000023010800000000000060300020000050000700000400000000507100002010000600000400 +000000023080000070400020000030002000000000401000060500100000600000807000000300000 +000000023080000070500090000030002000000000401000060500100000600000807000000300000 +000000023300010000000500060400000700000106000000200000092000100000040800060000000 +000000023400800000100000900050032000000000400000060000000401800030000050000900000 +000000023400800000100000900050032000000000400000070000000401800030000060000900000 +000000023480000000010000000503000060000010800000000000170000400000602000000300005 +000000023600010000000400000000080700502000000000000100080203000010000640000500000 +000000023600700000000000080000038500200000800000010000000200640003400000010000000 +000000023800000050000100000010600400507030000000000000300052000064000100000000000 +000000024000010000000000080107000900300800100000200000020400060500070300000000000 +000000024000010000000000080307000100100800500000200000020400060500070300000000000 +000000024000080010600005000000300700040700000010000000000040501300600000200000000 +000000024007000000006000000500090100000300600020000000940000050000607300000800000 +000000024010008000000070000600201500400000003000000000070000810500430000000000000 +000000024010300000060000000050000300000082000700000000400100500200000063008000000 +000000024010300000070000000060000300000029000800000000400100600200000075009000000 +000000024010300000070000000060000300000082000500000000400100600200000075008000000 +000000024100000000000600000000180700020000009030500000500070600004002000000000030 +000000024100000000000700000000560800020000009030100000600080700004002000000000030 +000000024100800000000000003000400500700000100000030000000510600002000050030007000 +000000024600800000100000000000040010070000300040600000520004000000000806000070000 +000000024700000060000900000004001000020050000000030700000400800300000500600200000 +000000024900700000000000000800000730000041000000000000002500800046000300010020000 +000000025000000070800000000600000103000070400000020000053100000020005000000600300 +000000025000800010400000000050000700000300600010000000600020400800007000000015000 +000000025000800010900000000050000700000300900010000000600020400800007000000015000 +000000025030006000000090000000740000600500000020000700000208300504000000000000100 +000000025050000040000100000207000000300000070000800600089000100000002700000040000 +000000025080000600000001000300400700000050008000000000000280400107000030000500000 +000000025190000000000600000006030700000000100002000000400205000060000340000800000 +000000026000080040000500000100600700300000080000020000000703100042000000000000500 +000000026000080040000500000100600700300000080000020000000903100042000000000000500 +000000026040700000000000001000900800400000500001000000000012050070000300300060000 +000000026080003000000070000100400800605200000007000300030000900000050000000600000 +000000026501000000000000000070206000300000150000800000020700000000000540000010300 +000000026800500000000000704300070100000040000000000030000300810040900000060000000 +000000026800700000000000005700030100000006500000020000026400000000000810030000000 +000000027000051000000000600504000100000200000300000000020740000060000039000000500 +000000027010900000500000060000300400600000050000000008049000100000026000000000300 +000000027010900000500000060000300400600000050000000008094000100000026000000000300 +000000027040800000000000001000400900600000500001000000000012050080000300300070000 +000000027300000040100000000000605100000100500040000000070020030008000600000040000 +000000027300000040100000000000605100000100500040000000070040030008000600000020000 +000000028000050000000040000708200000040000300000600000600801000030000450000000900 +000000028000070040000300000074000050000600300000001000630000100200040000000000600 +000000028000500060010000000506020000400000300000000100000100700000403000680000000 +000000028000800030100000000000070400080600000035000000700060100000000705000300000 +000000028030000050600000000100050604000062000000000700028000000000700300000100000 +000000028070009000000000003000302000040000500000000000800050100000040760300600000 +000000028300000070000100000000080030049000000050000600000604100000500400200000000 +000000029000306000000000008060000500053000000000020000000600150200070400900000000 +000000029000600070010000000507020000400000300000000100000100800000403000790000000 +000000029000730000000050080000600700082000000000000100400100600000002050100000000 +000000029000730000000400060203000400000100300600000000080050100000002000010000000 +000000029000730000000400060208000300000100500600000000070050100000002000010000000 +000000029000830000000400070203000600000100300700000000040050100000002000010000000 +000000029000830000000400070203000600000100300700000000080050100000002000010000000 +000000029300600000000080070800000600000021000000000100029000000000800030000400500 +000000029300700000000800040600000700000042000000000100049000000000010050000300600 +000000031000079000000000000013200000004000700000100000500040670280000000000300000 +000000031000407000000600000600300000407000000500080000030010000020000700000000450 +000000031000602000000700000007000600010080000400030000000500270140000000800000000 +000000031004020000080000000100300000000008200600000000020000740300510000000600000 +000000031004020000080000000600300000000008200100000000020000740300510000000600000 +000000031004020000090000000700300000000008200100000000050000840300610000000700000 +000000031005020000080000000700300000000008400100000000040000250300610000000700000 +000000031007020000080000000100300000000008200600000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000020000740300510000000600000 +000000031007020000080000000600300000000008200100000000040000720300510000000600000 +000000031008020000070000000600300000000008200100000000020000740300510000000600000 +000000031008020000090000000600300000000009200100000000040000720300510000000600000 +000000031008020000090000000700300000000009400100000000050000240300610000000700000 +000000031020500000000000000301070000000400200700000500070200600800010000000000080 +000000031020700000008500000000016200400030000050000000300000050000200700000040000 +000000031028000000000000000000208400730000060000500000160070000000400200300000000 +000000031040060000000009000060005200000300070500000000308100000000020400000000700 +000000031050060000000007000070004600000300050600000000403100000000020500000000800 +000000031050070000000009000070006400000300050600000000403100000000020500000000800 +000000031050080000000000000600307000040000500000100020100000800000050400003200000 +000000031060040000000000000002801400500300010000007000000050600730000000100000000 +000000031060200000000708000300050040070000200000010000100040000000600800500000000 +000000031060400000000000000500037000090000200000001000700840000000600490100000000 +000000031060500000000020000000460500300007000800000000000700080100003000020000600 +000000031080000070000920000401000000000200800300000000090000250000080600000001000 +000000031080040000070000000106300070300000000000080000540000800000600200000100000 +000000031080400000600000000000200840700600000100000000500073000090000200000010000 +000000031080600000000070000000700290500400000300000000020050800000031000400000000 +000000031200040000000000000031700080000020500400000000000803000500000200000100600 +000000031200070000000009000000301040600400000708000000000060200030500000000000700 +000000031200080000000400000031005060000720800000000000000603000400000200700000000 +000000031200700000400000000038000060000400300010000000000514000700000200000080000 +000000031280000000000000000003610000000004270000000000420000800500070400000300000 +000000031280000000500100000000037800600000200000040000030000040100500000000600000 +000000031400020000000007000000301050700500000206000000000080200030600000000000400 +000000031400020000000009000000301050600500000208000000000070200030600000000000400 +000000031400020000000009000000301050700500000204000000000080200030600000000000400 +000000031400020000000009000000301050700500000206000000000080200030600000000000400 +000000031400020000010500000000300060200006000800000000000700800060000200039000000 +000000031400070000208000000700000200000300000000900000630000090000580400000020000 +000000031500070000000006000700000560001400000020000700600000800030100000000200000 +000000031600008000000050000000370020580000000060000000200000600007100000000400800 +000000031600020000000070000050108000200000600000300070000040200030500000700000000 +000000031600200000000090000000080290310000000400000000049000500000603000000700000 +000000031600800000000000000030000850020010000000400000804000600006030000700005000 +000000031700020000000006000040100050030080000000000200600400900200005000000300000 +000000031700200000000480000000700800030000000060000000000039060520000400800000000 +000000031700200000040000000502700060000800700030000000000093000200000500000010000 +000000031740000000000000009000003460200000500000090000000570800030800000001000000 +000000031800020000200000000037100060010080500000000000500400800060300000000000000 +000000031800060000000000000600000470000100600500200000023500000000070800010000000 +000000031800900000000000040400000800000060200000001000031050000000200407090000000 +000000032000100000050000000040000800000310000000602000300000760000080500802000000 +000000032000100000060000000803000000000600900000007500000580070040000100200030000 +000000032010000000000300000309700000000060100800000400200000080000540000000016000 +000000032010040000000000000000307020084000000600000000000080104700100500300000000 +000000032010040000000000000000703020084000000600000000000080104700100500300000000 +000000032040000000900000000302700050000100800600000000070000100080060000000030006 +000000032480000000010000000503000060000010800000000000170000400000602000000300005 +000000034000100000000000060070000200005003000040050000000740100300000800600200000 +000000034000100007800000090980000200600040000000700000000009800007030000010000000 +000000034060200000000000070000960800301000000700800000070003000900000200000010000 +000000034080100000000000060000039000000040800001000000360200000400000700000700500 +000000034100000000000000050020050700043000000000010000900600800000400100000302000 +000000034500000010000070000405310000000000200100000000000600700087000000020400000 +000000034500900000000000000004700100060000200038000000200000507000036040000000000 +000000034600900000000000000004700100050000200038000000200000607000043050000000000 +000000034700005000000000010000087200000020500010000000200300060001400000000000900 +000000034800600000000100000605000100000040070200090000043000000000000201090000000 +000000035000020070000010000000240000800000600100000000020507000000300800070000100 +000000035040000080100000000007000200000085000600000000000400106030100700008000000 +000000035200100000080000000040000700000200040005003000300070006000040200000000100 +000000035490000000010000000603000070000010900000000000180000400000502000000300006 +000000036000000020800000000700000104000030500000020000064100000030006000000700400 +000000036000500040000700000000200705108000000600000000340060000050000200000010000 +000000036000500040000700000000200705108000000600000000340060000070000200000010000 +000000036007100000000040050405003000000700200000000100010200800300000000090000000 +000000036030000050200000000000060800700000400000053000000700210060900000001000000 +000000036040200000010000000000004019008000200600030000700050000000100800300000000 +000000036200030000500000001400070200010000000000000080308000400000501000000600000 +000000036200030000500000001700080200010000000000000080309000400000501000000600000 +000000036800010000000020000030602000000000190000500800100000900060000070000300000 +000000036800700000000000090090000001060000020000500400000039000004000800700000500 +000000036840000000000000020000203000010000700000600400000410050003000200600000000 +000000036900040000000000010000103000200000400000600050007500200000060800010000000 +000000037002000050010000000000200104000001600300400000700063000000000200000080000 +000000037004600000000000010078000200000007500000010000310000020000800600400000000 +000000037040600000000000010096000200000005800000010000107000050000400600300000000 +000000037060000040500000000100040502000083000000000600037000000000500100000200000 +000000037400200000000000000107000040000800200300500000000031000080000500060000400 +000000037500000040090000000000510200003000900060000000200000160000703000000800000 +000000037900040000000000010000103000200000400000700060006500200000070800010000000 +000000038000000710900400000000017000600000900000003000000650200003000060010000000 +000000038000009001000500020000460500800200000100000000040000600000021000700000000 +000000038000020000000090000800000200000600100007300000000701060290000500040000000 +000000038060020000007000050500400000000060700000000100100508000040000600000300000 +000000038090200000000000510740000600000003070000010000005600200003000000100000000 +000000038200050000000400010800000600000001000000200000041000500000620700030000000 +000000038200400000000070010800000500000001000000200000071000400000520600030000000 +000000038600001000000000050100200700800000004000750000025030000000000100030000000 +000000038700040000000000010000108000200000600000300040006500200000060700010000000 +000000039000070080000140000600000500200600000000003070000200600083000000000000100 +000000039000140000000060080000500200083000000000000100500200700000003060200000000 +000000039000140000000080070000500200037000000000000100500200600000003040200000000 +000000039000140000000080070000600200037000000000000100500200600000003040600000000 +000000039000600040800100000500000600000020070000004000000280700043000000000000100 +000000039000740000000050080000600700083000000000000100100200600000003050200000000 +000000039000740000000050080000600700083000000000000100100200600000003050600000000 +000000039500070000000000010000503000400000200000600000003000860000240700010000000 +000000039700400000003000010480000200000030700000001000040600500000000020000090000 +000000039700400000003000010680000200000030700000001000040600500000000020000090000 +000000039700400000003000010840000200000030700000001000080600500000000020000090000 +000000041000062000000000000000710030602000500500000000310400000000008200040000000 +000000041000700000300000000000045060700000300020010000000800200045000000601000000 +000000041000700000300000000000045060700000800020010000000900200045000000601000000 +000000041005080000600000000000670200410000500300000000000104030002000000080000000 +000000041007300000000000520000800300420000000500000007060004200000010000008000000 +000000041009300000000000520000800300420000000500000007060004200000010000008000000 +000000041020000050800000000000280700060030000001000000300000807000501600000000000 +000000041020060000800070000300400600000002000000100000000030700010500000005000030 +000000041020500000000000000000084060570000000000000200000120300804000000600700000 +000000041020500000000000000000094070580000000000000200000620300904000000700800000 +000000041020700000000000000400013000070000200600000000000270500103000060000800000 +000000041050080000000000000600107000030000500000400020400000800000050300001600000 +000000041050800000090000000000007020000041000000000503700260800100000000000300000 +000000041050900000070000000000008020000041000000000503800760900100000000000300000 +000000041060800000000300000200054070080000000000001000000630800700000200400000000 +000000041060900000070000000000008020000041000000000305800720600100000000000300000 +000000041070060000030000000400201050060000700000800000000050300100400000200000000 +000000041070200000000308000400060050020000300000010000100050000000700800600000000 +000000041080030000200000000500060700002000300400008000000500020010400000000000800 +000000041080070000030000000600201050070000800000900000000050300100400000200000000 +000000041090700000000080000000800290600500000400000000030060900000041000500000000 +000000041200500000000007000500000200000040600000036000034000000010000030000800500 +000000041200600000530000000700080300000041000000000060008300000000500200040000000 +000000041200700000000000006000300800090000500060040000700000230300060000000001000 +000000041300020000000500000015000000000070600080000000600000370200104000000800000 +000000041320000000500000000600300200004000080000500000200000300000081000000740000 +000000041500020000000800000018000000000030600090000000600000350700104000000900000 +000000041500300000200000000000260300010000060700500000080041000000080200000000000 +000000041500900000070600000000350600402000000800000000000040080090000300030000000 +000000041520000000000030000000070530100800000400000000600105000030000200000400000 +000000041600000000000800000500600200040000070000300000000071600002000300070040000 +000000041600300000000020000040100080000506000700000000300000500000070300010004000 +000000041630000000000800000010000070070030000000020500500104000200000600000700000 +000000041700050000200000000000801030650000700000400000081600000000020900000000000 +000000041700090000200000000030104000040200000008000500100050600000000080000000700 +000000041700600000200500000000081000030040000500000000010030000000200700000000650 +000000041800020000000000000040509000007000200000000800600000390200410000000700000 +000000041800050000200000000000701030650000200000400000071600000000080900000000000 +000000041800500000000000000200000860070140000000030000600008200000300500040000000 +000000041900300000000000000300200800000010060200000000067040000010050000000800200 +000000041900300000000000000300200900000010060200000000067040000010050000000800300 +000000041900500000000000000200000960080140000000030000600009700000300500040000000 +000000041900600000000200000000810300540000000002000000031040000700000600000000020 +000000041900700000000000000200000960080140000000030000600009700000300500040000000 +000000042000500080000001000000900300200000100400080000090060050010000700000800000 +000000042100700000000000080600300500040000020000100000000060105090040000000000300 +000000042100800000000000070600300500070000020000100000000060105090040000000000300 +000000042500090000000000000006100700000030800024000000390000000000004006000200050 +000000042600900000000000030500000800007600000020040000000508100034000000000000700 +000000042650000000000800000100000600000045000700002000000100780002030000040000000 +000000043000015000000200000000420000050000600000900000000008170403000000200000800 +000000043000015000000200000000420000090000500000800000000007160403000000200000700 +000000043000080050000001000700500600000304000100000000040200000000070100030000900 +000000043000800070000020000060500800000304000001000000370000200000010900400000000 +000000043010050000000000000000408030095000000700000000000090105800200600400000000 +000000043010050000000000000000804030095000000700000000000090105800200600400000000 +000000043050200000080009000060000800100030000000000000307510000000800200400000000 +000000043100200000000000000000600700030000200005080000270100000000030065900000000 +000000043200700000000000080600200500040000030000100000000060205090040000000000100 +000000043200800000000000070600200500070000030000100000000060205090040000000000100 +000000043500080000000000010000370500010000000000000200000104020005700000800000600 +000000043800050000000000010007600200000080700010000000000104020600000500000300000 +000000045000800020100000000005620000700000004000000700086000100000045000030000000 +000000045700200000000100000106000200000050060300080000054000000000000302080000000 +000000045800200000000100000106000200000050070300090000054000000000000302090000000 +000000046000070010060020000108000000000500300400000500030000200000108000000400000 +000000046000500010500000000709000300000100800000400000600030200000070050010000000 +000000046000500010500000000709000300000100800000400000600030200000090050010000000 +000000046000800010500000000709000300000100800000400000600030200000070050010000000 +000000046000800010500000000709000300000100800000400000600030200000090050010000000 +000000046005800000000000020160000300000300500020000000000267000309000000000040000 +000000046020000300001000000000001730600000008000000000030000210400680000000500000 +000000046020000700001000000000001830600000009000000000080000210400690000000500000 +000000046050010000000000000000408030017000000600000000000070102300200500400000000 +000000046100000000000000080000130200084005000000700000060084000300000100000200000 +000000046700010000000030000040603000000000190000800700100000900020000080000400000 +000000047010050000000000000000408030065000000700000000000060102300200500400000000 +000000047300500000000000010709000600000010000000000200000200705041008000030000000 +000000048600200000000700010000040060500000300002001000000350700010000000000000200 +000000049000050060000030000400900000700800000000000300503000100060000200000702000 +000000049700200000000800010000040070500000300002001000000360800010000000000000200 +000000051000036000000000000040500080200000600000001000000020340010400700600000000 +000000051000083000000040000600500020080000400030900000000070800500600000200000000 +000000051000203000000400000050080060094000000000000300302000600700000200000050000 +000000051000307000000008000021060000000000740050000000400150000300000800000200000 +000000051000307000000800000500010700000600300200000000000090020430000000087000000 +000000051000308000000100000090050040020000100000000000601700800400020000500000000 +000000051000308000000100000090050060020000100000000000601700800400020000500000000 +000000051000309000000100000080050040020000100000000000601700300400020000500000000 +000000051000309000000100000080050060020000100000000000601700300400020000500000000 +000000051000402000800070000200600400700000030000500000000030200016000000050000000 +000000051000402000800070000200600400700000080000500000000030200016000000050000000 +000000051000702000000400000050080030084000000000000700302000600700000200000050000 +000000051020060000700040000640000300000105080200000000001800000300000600000000000 +000000051020070000000000000000145000040000890000300000109500000000060200300000000 +000000051020400000000000000000390200500080000000000400040600700100050080000200000 +000000051020600000000000000000300780400900000100000000070005200600010000000040600 +000000051020600000000000000070000200300050000000040800501000030400008000000200600 +000000051030800000000000000000400830100700000200000000040006300700020000000010900 +000000051040006000000300000105030000000000820700000000620000400000750000000100000 +000000051040700000000000000000013700500020000060000400000600840100800000200000000 +000000051040700000000000000090000700000051000000060030000406200300000800506000000 +000000051040900000000300080107050000030000200000000000000209300605000000800000000 +000000051060007000000030000000006200700000030500100000014000600000850700000000000 +000000051060007000000030000000006200700000030500100000024000600000850700000000000 +000000051060020000000000000000145000040000780000300000108500000000060200300000000 +000000051060020000100700000000500030020030000040000000300000200000800400509000000 +000000051060400000000000000000380600500070000000000400040600300100050070000200000 +000000051060400000000000000000390600500080000000000400040600700100050080000200000 +000000051070030000800000000000501040030000600000800000500420000001000300000000700 +000000051080200000000000000930000800000014000000500000401000070000600200000380000 +000000051080400000000000000000031009507000000040000000000700460100200000300000800 +000000051090030000000000000070400620000501000000800000000070300504000000200000400 +000000051090700000000000000000400930100500000200000000080006300700010000000020700 +000000051200030000000000000000070620050400000000000300004501000600000830000700000 +000000051200060000000000000000080720050400000000000600004501000600000230000800000 +000000051200080000040030000017200000000000630000000400000507000600000300000100000 +000000051200600000000800000071050000040300200000000600000010040600000300800000000 +000000051200600000000800000071050000040300600000000200000010040600000300800000000 +000000051200800000400000000010057000300000200000060400057000060000200300000000000 +000000051260000000008600000000071020040050000000000300000300400500900000700000000 +000000051300020000000800000042000000000090600010000000600000390700501000000400000 +000000051300040000200000000056100000070600000000030800010500060400000300000000000 +000000051400030000000800000250100000300000740000006000000040300060007000010000000 +000000051400070000200000000037006400008000000000500000000020780510300000000000000 +000000051400200000000000000000406200050300000070000000000075030608000400000010000 +000000051400800000200000000010057000300000200000060400057000060000200300000000000 +000000051460000000080000000000050670001020000300000000050000400200300000000109000 +000000051600003000090040000012500000000007900400000000500000780000020000000100000 +000000051600030000000000000000504090802600000000001000000020800700000300050100000 +000000051600200000000000000000406200050300000070000000000075030408000600000010000 +000000051700200000003000000004058000000010600600000200010000080260000000000300000 +000000051700200000800000000054010030010030000000000200200700600030000000000000700 +000000051800020000300000000017600000000030200050000090400700800060500000000000000 +000000051800070000300000000040080700000400000005000000006501000030000870000000200 +000000051800070000300000000040080700000600000005000000006501000030000870000000200 +000000051800200000000000000040070300000051000090000000000309200507000060100000000 +000000051800200000400000000010095000000000840030000000000760300250000000000800000 +000000051800300000000000000520010000300000790000006000067000400000400300010000000 +000000051800700000300600000000012000090050000600000000010040000000300800000000760 +000000051803000000000000000250400000010000700000020300000506040007000200000100000 +000000051900200000000000000451060000000400380000000000240000700000003200000050000 +000000052000700040100000000010600000000030800024000000000200100000405000300000600 +000000052000700040100000000010600000000030800042000000000200100000405000300000600 +000000052003400000070000000030005600000020010000081000200000008000600700100000000 +000000052005400000070000000030005600000020010000081000200000008000600700100000000 +000000052009400000070000000030005600000020010000081000200000008000600700100000000 +000000052400060000000000010070200000600000400000108000018000000000030700502000000 +000000053000008010300400000000015020700000400006000000000720600010000000000000200 +000000053000400006080000000506000700000010400300000020010000200000305000000700000 +000000053160000000000000000400000607000305000000800000000024100003000020070010000 +000000053600700000000000020000039500200000800000010000000200640003400000010000000 +000000053700600000000000040024000000008050000000300000010040200600007000300000600 +000000053800060000000000070000200800000705000100000000072003000000610400050000000 +000000054000803000000000000105040000000200930600000000500007000000010002030000800 +000000054010700000200000000000056000030000700080000000600100300004000072500000000 +000000054010900000200000000000056000030000900070000000600100700004000082500000000 +000000054070300000200000000010000700000045000000208000000670100800000300500000000 +000000054100300000000000000000700300040000200006080000320100000000040076900000000 +000000054200070000000010000060000730005400000000000000710000200800300000000500009 +000000054300020000000000010003700200000080600010000000000105030600000800000400000 +000000054300800000000000010041000060030008000000900700905000800000010000000000200 +000000054700020000000010000060000730005400000000000000170000200200300000000500008 +000000054700030000000000000000400016380070000020000000000500800105000000006000300 +000000054900700000000000060006052000800000300000000700020300100040070000005000000 +000000056003800000400000000000062000000000410000000300000450100060100000720000000 +000000056080010000002000030000203000300600000010000900600700000000080400000000100 +000000057000040000000000003000307060800500400100000000000080100070000200030600000 +000000057000080010070020000301000000000600400500000600040000200000103000000500000 +000000059000130000000000000340000020050009000000800600800000307000054000000000100 +000000059700600000000300000059001000020040000000000130807000300000050000400000000 +000000061000027000000000000704000200000100040300000000510000700000048000090600000 +000000061000203000000700000005060400000002300100000000000540080320000000700000000 +000000061000320000500000000230000700000801040900000000001604000000030200000000000 +000000061000400080300000000000020540010000000800000000700800300005000200000603000 +000000061000704000000000000500400700602000050100000000000016000080020000030000900 +000000061000704000000000000500800700602000050100000000000016000090020000030000800 +000000061000800000400000000000300780160500000200000000030060000000020400080000300 +000000061000904000000000000500400700602000050100000000000016000080020000030000900 +000000061000904000000000000500700400102000050600000000000061000080020000030000700 +000000061000904000000000000500700400602000050100000000000016000080020000030000700 +000000061005700000020000000000430500100060000980000000600008010000500700000000000 +000000061009800000000000000004020500030000800000006000000700430160300000200000000 +000000061020500000000000000100064000050000200800000000000250300601000040000700000 +000000061030200000000000000106050040000700300500000000400300200080000700000010000 +000000061030400000000000000600300780105000000000900000200010000040000300000050400 +000000061040050000000007000070003500000100040500000000301600000000020800000000400 +000000061040300000000500090108060000030000200000000000000205300706000000900000000 +000000061040300000000500090108060000050000200000000000000205300706000000900000000 +000000061043000000000000000020008300600070050100000000700160000008000400000500000 +000000061050020000000000000000000250600400000000070300020000530400601000000800000 +000000061050030000000000000000000250600400000000050300020000730400601000000800000 +000000061050030000000000000680040700200600000000000500900106000000000380000200000 +000000061050090000000000000200000070000080500601000000000700320090000400000602000 +000000061050700000200009000000800300401000000600000000000060080030040000020000700 +000000061070005000400030000300000200000100070000800000001600000000070400500000300 +000000061070040000000000000102006000000080300500000000030000740600501000000200000 +000000061070500000000000000900460000050000200000000700601000030300200000000708000 +000000061070500000000400000603050000000200100000000040200006000000039000010000800 +000000061070800000500090000000600300302000000400000000000030040010002000060000900 +000000061200030000000000000000070240060500000000000300005601000300000820000700000 +000000061200030000400000000020801000500600700000000040081000000000070400003000000 +000000061200300000000000000000160000020040000800000300060000740000800200003500000 +000000061200500000800000000000200700037000000060400000100000200000038000000060040 +000000061200500000800000000000200700037000000060400000100000200000068000000030040 +000000061200700000000800000013060000050400200000000700000010050700000400800000000 +000000061200700000000800000013060000050400700000000200000010050700000400800000000 +000000061200800000000000000000402800063000000000700000000036200410000000000010050 +000000061300020000000700000017000000000080500090000000500000380600401000000900000 +000000061300700000090400000710080000000300400000000020000062000500000900000010000 +000000061300800000000000000500000400000014000000070800010620000000500390007000000 +000000061350000000400050000020000800000601000000700000000080200600400000007000010 +000000061400003000000700000010690000020000300000000000304000200000180050700000000 +000000061400030000000500000026000080000070000010000000500200300304000700000100000 +000000061400070000000090000000608200901000000200100000000050400060300000000000090 +000000061400070000020000000061500000000030740500000000005108000700000400000000000 +000000061400200000900000000067015030010070000000000400200800500030000000000000000 +000000061402000000030000000380000400000602000000100000006500000100000070000080300 +000000061403000000020000000308000400000602000000100000060500000100000070000080300 +000000061480000000000000000000520400000030000060000000530006070200000800000107000 +000000061500020000970000000061400000000050900000000080000806000300000500000700000 +000000061700020000000000000060530000010000200000000400000107030208000000400300000 +000000061700400000800000000000720400300000000000010000009800700010000500060000020 +000000061800007000000020000032100000000650800000000000000003720910400000000000000 +000000061890000000000000000000520400000030000060000000530006070200000800000107000 +000000061890000000000000000000520400000030000060000000530006070200000900000107000 +000000061900200000000400000070068030200000700000010000006050000000900200040000000 +000000062800300000000000050040200100060000040000000700001056000700000300000040000 +000000063000100000200000000050000100000400200009006000630090000000200740008000000 +000000063000500004080000000603000700000010500400000020010000200000406000000700000 +000000063020040000000001000040000210000370000000500400503600000000000700800000000 +000000063020040000000001000040000210000370000000500400803600000000000700500000000 +000000063800090000000000010005020400010000000000000200200600500000103070000400000 +000000064005800000000000020160000300000300500020000000000267000309000000000040000 +000000064300800000000000010041000070050008000000900500906000800000010000000000200 +000000064500080000000000010000305700010000040000070000708000200000600800000100000 +000000065000300000000010000000040170509000000000000800270500000010000300000906000 +000000065000710000040000000000053000080000200000000100003200700506000000100800000 +000000065040800000000000001006000800030000700000010000000700230400002000501000000 +000000065900200000000000000000900240053000000000000000060057000100006800000030900 +000000067003900000010000004600004000050010000000000100000800520007000300400000000 +000000067060200000000000040000860300401000000700900000070004000900000200000010000 +000000068030070000100000020070000450000208000000400000000030100200600000000000900 +000000068030070000400000020070000450000208000000100000000030100200600000000000900 +000000068030090000700000020010000350000208000000400000000030100200600000000000500 +000000068100000000000000030060030000000400100008000200400200500730000000000108000 +000000068350000000000010000100000500000800400009000000060205000000400300007000010 +000000068350000000000010000100000500000900400006000000070205000000400300008000010 +000000068900000002000400500041000000000035000050000000000800010300000700000100400 +000000069070000040050800000000507200300100000600000000000030008400060000000000500 +000000069800040000000010000000300800010000400650000000701000200000905000000600000 +000000071000040000600000000000705000200000600000100300087000050010300000000060400 +000000071000052000000000000000008540710400000300000000460070000005000200000300000 +000000071000208000000600000501000000000300200700000000030040600260000000000070050 +000000071000520000000000000000070080300001000204000000500600200000300600070004000 +000000071000580000000000000000031060200400000508000000070006000030000500000100200 +000000071000604000000000000500400600102000050700000000000071000080020000030000900 +000000071000604000000000000500800600102000050700000000000071000090020000030000800 +000000071000800000000300000040000300270000000000500800600070500008060000000010040 +000000071000904000000000000500400600102000050700000000000071000080020000030000900 +000000071002500000000000000780000030000420000000100000050007200004600500300000000 +000000071005020000040000000100300000000009400800000000060000950300710000000800000 +000000071006090000000000050102000000000060300050000000070504000800000600000200400 +000000071020400000500000000080000600000037000000010000000600240300500000109000000 +000000071020400000600000000080000200000037000000010000000200540300500000109000000 +000000071020600000000000000100073000060000200500000000000260400703000050000800000 +000000071020800000000403000700060050000200300900000000600070000080000400000050000 +000000071030020000000000000000000250600100000000080300020000530400601000000700000 +000000071040050000000600000000100600080000500000007003107000060000080200300000000 +000000071050003000040080000030000500200100000600000000000040300700000040100600000 +000000071050008000000000000060040030200170000000300600000002500401000000700000000 +000000071050080000000000000600103000020000890000400000000700200100040000403000000 +000000071050600000200009000000800300407000000100000000000010020030040000020000600 +000000071060005000000000000080000630400170000000200000907020000000003800000000500 +000000071060020000000030000700060300400000200100400000000105080020000000000700000 +000000071060020000000030000700060300400000200100400000000705080020000000000100000 +000000071060020000300000000050000260000108000000300000000430500108000000007000000 +000000071060030000000020000700060300400000200100400000000105080020000000000700000 +000000071060030000000020000700060300400000200100400000000705080020000000000100000 +000000071060300000500000000000040050007010000020000600000500900400600000801000000 +000000071060500000000000000005040600030000200000007000000800540107300000200000000 +000000071080300000000200000407020000000600800100000300500070040030000600000000000 +000000071080400000000500000100072000050000630000000000000380400207000000600000000 +000000071090800000000000000400300600701000050000902000060000300500070000000000900 +000000071200050000030060000701300000000000640800000000000107000040000500000002000 +000000071200300000860000000000500630004200000700000000000071000050000800000040000 +000000071200600000300000000000510007604000200000008000050000040000200600010000000 +000000071200900000000000000000600830071400000500000000640000200000050600000007000 +000000071300200000000000000000060300010030000004000000600000540000407200800100000 +000000071300200000000400000000078040200000300050010000400000500007060000000500000 +000000071300500000000000000000308500002600000070000000000070320800050000010040000 +000000071300500000600400000000072000080010000400000000070020000000300600000000540 +000000071300800000080000000005041000020000300000070000601000040000200600700000000 +000000071400030000000200000020700000000040300000000500000102060308000400500000000 +000000071400080000000000000000170050820000000300000000001703000600000800000500400 +000000071400500000600000003050037000200000800000010000000800040000400200010000000 +000000071400900000300500000000300450070060000000000900000072000080010000500000000 +000000071500020000000800000047000000000090600010000000600000250700103000000400000 +000000071500030000000600000600000800200400000000702000000080300041000000070000020 +000000071500400000300000000400306500010000060000200000080000200000017000000080000 +000000071580000000030900000407200000000000810060000000200000500000067000000010000 +000000071600040000000000000087500000000020900010000000300800600406000020000100000 +000000071600200000800000000070031040000600500200000000030070000000500600000000200 +000000071600200000900000000400650300010000080000400000070081000020000600000000000 +000000071600500000040000000502600030000900600070000000000013000800000900000070000 +000000071600500000200000000340010000000070620000000500000600300080400000010000000 +000000071600500000300400000000072000080010000400000000070020000000300600000000540 +000000071800020000300000000076500000000030200010000090400600800050100000000000000 +000000071800030000000000000670200000000090300000000500020701000500000830000400000 +000000071800040000000000000070200000030000800000090400000701030400500600900000000 +000000071800040000000000000670200000000090300000000400020701000300000840000500000 +000000071800300000400050000670000500000012000000400000002000050000800400010000000 +000000071900000060020000000004070000030000400000910000700600008000300200100000000 +000000071930000000000000000000620400000030000070000000650007080200000900000108000 +000000072000051000000000000000060180720300000400000000300200000000400600008000500 +000000072006800000000000050170000300000400800020000000000217000309000000000050000 +000000072010000000000060000000700510902000000400000000000510600300000009000807000 +000000072080500000010000000200097000000000100300000000703000060000180500000400000 +000000072080500000010000000200097000000000800600000000703000060000180500000400000 +000000072080600000010000000400097000000000800300000000703000040000180600000500000 +000000073200500000000000610003100000000900040800000700000086200010000000000030000 +000000074002800000000000003070530000600000010000000200540000600000071000700000000 +000000074010030000000000080000010520700600000400000000053000100000708000000000200 +000000074010030000000000080000010520700600000400000000053000100000807000000000200 +000000074150000000000000008010000230600048000000070000200500100000300000004000000 +000000074200050000000000001000104030500000600008700000000390800010000000000000200 +000000074500100000000000009800009500000040000000000010070200600000080300040700000 +000000075320000000000000008010000240600058000000070000200400100000300000005000000 +000000075400060000000000010002105000000700040600000300000390800010000000000000200 +000000075400060000000000010002105000000700040900000300000390800010000000000000200 +000000075400060000000000010003105000000700040600000300000390800010000000000000200 +000000075400060000000000010003105000000700040900000300000390800010000000000000200 +000000075620000000000000008010000240300058000000070000200400100000300000005000000 +000000076060200000000000050000860400501000000700900000030005000900000200000010000 +000000076400900000000000080008070000000200400090000300200000530000006001000080000 +000000078500200000000000600067000050080000020000300400300000102000070000000006000 +000000078500300000000000010400070200000018000030000000060400500000000430001000000 +000000078600000050000040000058000000000001300040000000300600100000250000000700400 +000000079030080000500000020080000560000209000000400000000030100200700000000000400 +000000079030080000500000020080000560000209000000400000000040100200700000000000400 +000000081000090030700004000000200600030800000010000000000010403500600000200000000 +000000081000090040700005000000300600040800000010000000000010504300600000200000000 +000000081000409000000200000060081000004000230000000000380070000200500900000000000 +000000081000602000300700000604000700000090010700000000500400200010080000000000000 +000000081020030000000000000000060320700450000100000000500708000060000200000100000 +000000081020040000000700000000050620300090000100000000040300200500008000000100000 +000000081020300000000000000109000040000200500800000000000580200070000300600010000 +000000081020300000040006000000600420801050000000000700000400200500080000000000000 +000000081020300000700000000040000700000018000000050000000600230500400000106000000 +000000081020500000000000000400031000700000200060000000000260500103000040000700000 +000000081020600000400000000090000200000038000000010000000500720300400000105000000 +000000081020700000000000000000900250800000030400000700600018000050000300000040000 +000000081020700000000403000100060050000200300500000000800010000040000700000050000 +000000081020700000000403000100060050000200300500000000800010000070000400000050000 +000000081020700000500000000060000200000038000000010000000600740200500000103000000 +000000081020700000500000000090000400000038000000010000000600240300500000106000000 +000000081030005000000000000500074600109000000000000000080000370600910000000200000 +000000081030005000000000000500074600901000000000000000080000370600910000000200000 +000000081030020000000700000000050620400090000100000000020400300500008000000100000 +000000081030020000000700000000050620400090000100000000060400300500008000000100000 +000000081030200000000000000108060040000700300600000000500300700090000200000010000 +000000081030200000000000000108060040000900300600000000500300700070000200000010000 +000000081030200000500000000000600230100400000700000000400070000000010800060000300 +000000081030500000000020000100007000000080500050000400600100070000403000800000000 +000000081030500000000020000100009000000080500050000400600100070000403000800000000 +000000081030600000000020000500007000000080600060000400100500070000403000800000000 +000000081030600000000020000700009000000080600060000400100500070000403000800000000 +000000081040300000020006000000600420801050000000000700000400200500080000000000000 +000000081050600000200009000000700300408000000100000000000010070030040000020000600 +000000081060020000300000000050000260000107000000300000000430500701000000008000000 +000000081060500000300000000500028000070000400000010000000600730002400000100000000 +000000081060500000700000000200600500008000020100300000040021000050000600000000000 +000000081060700000000200000040000600000083000000000020000502700308040000100000000 +000000081070600000300000000400018000030000500000020000000500760002400000100000000 +000000081070600000300000000400028000030000500000010000000500790002400000100000000 +000000081080000020300000000016000000000500600090200000000091000500000300400080000 +000000081090005000000000000070000630400810000000200000201060000000003500000000700 +000000081090005000000000000070000630400810000000200000201060000000003700000000500 +000000081090300000000200000708040000000600900100000300500080040030000600000000000 +000000081100060000070050000009000760000102000000800400000300500800000020000000000 +000000081200060000000000000048500000000020300010000000500000670000103000700400000 +000000081200060000000700000000408070630000000000100000004000600000050200018000000 +000000081200400000000000000000230700010000050008600000700000400090080000000050200 +000000081200500000030000000020406000001000070000200000008010000000030200700000400 +000000081200500000030000000020406000008000070000200000001080000000030200700000400 +000000081200600000000000000089010050000403200000000600400000700000250000000080000 +000000081200700000000000000000230700010000050008600000700000400030080000000050200 +000000081200700000000000000000230700010000050008600000700000400040080000000050200 +000000081200700000000000000000230700010000050008600000700000400090080000000050200 +000000081200700000000500000000080650400010000500000700060300000089000000000000400 +000000081200700000960000000000500630004200000800000000000081000050000900000040000 +000000081230000000040700000000600370005300000100000000400000200000058000000010000 +000000081250000000060700000000500670004200000100000000300000900000048000000010000 +000000081300020000000700000048000000000060200010000000600000350700504000000100000 +000000081300200000000074000200000560700010000000009000000800200014000000090000000 +000000081300600000090400000680070000000300400000000020000012000500000300000080000 +000000081360000000040700000500000300000021000000080000002000010000400600400300000 +000000081400300000300050000190000500000028000000600000082000050000400700000000000 +000000081400300000300050000190000500000028000000600000082000050000700400000000000 +000000081400300000300050000190000500000082000000600000082000050000400700000000000 +000000081400300000300050000190000500000082000000600000082000050000700400000000000 +000000081400300000300050000610000500000082000000700000002000050000600400080000000 +000000081400300000300050000680000500000012000000700000002000050000600400010000000 +000000081500400000073000000000028000060000300000010000000600740200500000100000000 +000000081600002000000700000500000360800100000000400000000060200047000000010030000 +000000081600030000000200000020800000000040300000000500000102070304000600500000000 +000000081600040000000230000400000050300700000000100000000050300010000200087000000 +000000081600070000000000000000801040702000000300400000200000700000060300080500000 +000000081600070000000000000000805040702000000300100000200000700000090300080500000 +000000081600200000000000000010089000503000200000000600000300570240000000080000000 +000000081600400000500700000012000000080090000000500000000010050030000600700000400 +000000081600500000040000000502700030000600700080000000000013000900000600000080000 +000000081690000000040300000508200000000000910070000000300000600000018000000070000 +000000081700050000020000000601200000080000040000090300300004000200000500000800000 +000000081700060000000000000400507000600000720000100000058200000000030200010000000 +000000081700200000200000000000510030050040000600000800000700900003006000010000000 +000000081700300000400050000610000500000082000000400000002000050000700400080000000 +000000081700400000000200000400000300005010000000090000010350000200000640000000700 +000000081700600000300500000000082000090010000500000000080040000000300700000000650 +000000081700600000500000000040081000000000290000030000000504700600200000080000000 +000000081900400000700600000082000000010050000000700000000080050030000900600000400 +000000082000031000000000000080420000400000100000500000601000300000200050700000600 +000000082000031000000000000080420000700000100000500000601000300000200050400000700 +000000082005060000010000000090302000000100500800000040600040000300000001000000300 +000000082040600000010000000200098000000000100300000000803000070000410600000500000 +000000082500006000000000090600000300000920000000000040000053100090600000008000700 +000000082500300000000000000300072000400000630000010000000800500081000000020000007 +000000082600400000000000000400072000500000430000010000000800600081000000020000007 +000000083000014000000200000000320000090000400000700000000006150308000000200000600 +000000083000030010070000000000204000030000600000010000200600405000500700100000000 +000000083020100000000000040000610200800000900004000000060300500100000070000008000 +000000083020700000000000040000610200800000900004000000060300100500000070000008000 +000000083040300000000500060300000400000700500208000000050060100000002000000080000 +000000083400020000000000510002300000700000600000100040000075200010000000000800000 +000000083500400000000100000000020700100000400000008000038600000020070000000000520 +000000083900100000000000020100009700020080000000000100005700400003000060080000000 +000000084000100000200000000000600130408000000050000000560000200000080007010030000 +000000084000510000000030000400000200300008000000600070000200403076000000000000100 +000000084050010000000000050000030620800200000400000000073000100000508000000000900 +000000084100600000000000000000040103030020000500000600048000020000701500000000000 +000000084600010000000000000500000106000800300070200000087000020000063500000000000 +000000084750000000000000009010000730600049000000080000200500100000300000004000000 +000000085004070000000000030100060700570000100030800000006200000000503000000000000 +000000085200030000000000030040010600058000000000700000700400100000500200000008000 +000000085760000000000000009010000640300059000000080000200400100000300000005000000 +000000086320000000000000009010000250700069000000080000200500400000300000006000000 +000000087004010000000000030100060500570000100030800000006200000000703000000000000 +000000087004050000000000030100060500570000100030800000006200000000703000000000000 +000000091000020000000400000507000200100900000860000000040000080090001000000070300 +000000091000030000000500000608000300200900000170000000050000020090001000000080400 +000000091002080000040700000050061400000090000300000000000300750900000000000200000 +000000091020400000000000000000380200700090000000000400040500600900010070000200000 +000000091020700000600000000080000500000039000000010000000600840300500000107000000 +000000091030600000000020000700008000000090600060000400100500080000403000900000000 +000000091060005000000000000080000630400910000000200000201070000000003500000000800 +000000091060005000000000000080000630400910000000200000201070000000003800000000500 +000000091060070000000000000005030760000000200100000000300100004082000000000409000 +000000091060070000000000000005030760000000300100000000300100004082000000000409000 +000000091070020000000004000000380000040000900000100000300000640000005700100800000 +000000091070080000000000000006040870000000300100000000400100005032000000000509000 +000000091080040000400000000000720500801000060900000000020000300000601000000900000 +000000091080200000000000000930000800000014000000500000104000070000600200000380000 +000000091080600000000030000000700260500400000100000000030050800000019000400000000 +000000091080600000000030000000700280500400000100000000030050800000019000400000000 +000000091200050000000000000500000240700800000060100000089400000000060300010000000 +000000091200400000030000000060507000009000080000200000001090000000030200800000400 +000000091200600000000000000040010600000039000070000200000400570300800000100000000 +000000091200800000600000000040091000000000250000030000000604800700500000090000000 +000000091300040000500600000007200600090000080000300000200000500000091000000080000 +000000091300200000000085000600000270800040000000001000000600500049000000010000000 +000000091400070000000000000700300000800000400000106000019500060000040700200000000 +000000091400070000000000000700300000800000400000106000019500060000040800200000000 +000000091400300000000000000000219000200000850000060000090000060000400700300000400 +000000091400300000300050000710000500000092000000600000092000050000400800000000000 +000000091400300000300050000790000500000012000000600000012000050000400800000000000 +000000091500080000200000000000720600010300000090000000640100000000000520000000800 +000000091500200000300000000080700040090000600000500000200060500010090000000003000 +000000091600300000070000000400000500000029000000010000000500680310000000020800000 +000000091600700000200000000700000010000600500000450000030081000040000600005000000 +000000091600700000800000000040091000000000250000030000000604800200500000090000000 +000000091600700000800000000040091000000000250000030000000604800700500000090000000 +000000091603000000500000000090100040000002300700000000300000700000410000000980000 +000000091630000000000000000019080000000020400000000600200600300000703050000400000 +000000091630000000000000000051080000000020400000000600200600300000703050000400000 +000000091630000000000000000091080000000020400000000600200600300000703050000400000 +000000091700000030000200000090010080005000600200000000080090000000600400000700200 +000000091700030000200500000600000200040900000000000000500008040090001000000020300 +000000091700030000200500000600000200040900000000000000500008040090001000000060300 +000000091700400000000030000000651000200000370000000000000800200054000000310000000 +000000091700400000000380000000500800029000000010000000600002000000060010500000300 +000000091700400000200000000500290000000080010040000600081000400000700300000000000 +000000091700800000200000000000510030020040000600000900000700600003006000010000000 +000000091700800000200000000000510030050040000600000900000700200003006000010000000 +000000091700800000200000000000510030050040000600000900000700800003006000010000000 +000000091700800000200000000000510030070040000600000900000700200003006000010000000 +000000091700800000600000000040091000000000250000030000000604700200500000090000000 +000000091800200000000400000060017030200000600000090000001050000000800200040000000 +000000091800200000200000000000510030050040000600000900000700800003006000010000000 +000000091800300000300050000470000500000092000000600000002000050000800400090000000 +000000091800700000200000000000510030090040000600000900000200800003006000010000000 +000000092010400000000000000030100400100060000000020007000500830209000000600000000 +000000092700000010000300000090020080005000600300000000010090000000600400000700300 +000000093000014000000200000000320000040000500000800000000007160309000000200000700 +000000093480000000010000000503000060000010800000000000170000400000902000000300005 +000000094000400070100000000208000600000750000000000100030060500047000000000002000 +000000094030090000000000060070000820200600000000004000000750300906000000000000100 +000000096200030000000000030050010700069000000000800000800400100000600200000009000 +000000097000050000000040000107200000040000300000900000600701000030000450000000800 +000000097300400000000000020600098100400007300000020000072000000000100000080000000 +000000100000300000900000000700100600200000090000500000008020040010006005050090000 +000000100000500000200000000035400000000010700080000200004000059600002000000070030 +000000100000500000200000000035400000000010700080000200004000059600070000000002030 +000000100000500000200000000035400000000010800070000200004000095600008000000020030 +000000100000500000200000000035400000000010800070000200004000095600020000000008030 +000000102000000340005080000360000000000090050010000000100403000007000600000100000 +000000102000300500000608000000400030200050000100000000000070200080010000030000060 +000000102000300500000708000000400070600050000100000000000040600070010000030000040 +000000102000300600000408000000500040200060000100000000000070200050010000040000030 +000000102000300600000709000000400030200050000100000000000080200040010000030000070 +000000102000300600000809000000400080200050000100000000000070200080010000030000060 +000000102000300700000409000000500040200060000100000000000080200090010000040000030 +000000102000300700000809000000500080200060000100000000000010600080040000030000070 +000000102030000400000700500080000030000015000000020000000300064201000000900000000 +000000102040700000300500000008001000600000070000020000002000600000600300010070000 +000000102080300000000000500000690080001000000500000000060000470000201000700050000 +000000102400050000000000900060070080001000000000300000000001460320000050000900000 +000000102500600000000000000023000700000405000010000300000170000000020080800000040 +000000102700050000000000800060070040001000000000300000000001460320000050000800000 +000000102700050000000000900060070080001000000000300000000001460320000050000900000 +000000102700400000000000800300000640400009000000010000012600000000500030090000000 +000000102900050000000000800040060070001000000000300000000001460320000050000800000 +000000102900050000000000800060070040001000000000300000000001460320000050000800000 +000000103000400500670000000000020070300000000001000000000063400007500000020000080 +000000103020090000000000400000025080010000000400000000300104000008000020000700600 +000000103020400000000670000070000400000001000000000070000240060301000500800000000 +000000103080020000000004500030000020000500070000100000100300600700080000005000000 +000000103800050000000000700060020040001000000000300000000001460420000050000700000 +000000103800600000200000700000406080010000000000700000008003000030010000400050000 +000000103900050000000000700060020040001000000000300000000001460820000050000700000 +000000103900050000000000800060020070001000000000300000000001460720000050000800000 +000000104000003600000050002503000000200600000000100080000070230010000000000400000 +000000104000010800600700000391000000080500000000200000506000070400080000000000000 +000000104000060000000050000200430000000107000600000800010500000070000040000000023 +000000104000080300040050000000200070300000600001004000870000050000300000000100000 +000000104000702000000000000460010000000500070100000000000380600027000030004000000 +000000104000802000000000000460070000000600080100000000000340700028000050009000000 +000000104080900000000000500000702080001000000500000000000530600020000030400010000 +000000104702000000000000000000705020300600000010000000200000630050014000000080000 +000000104800070000000000600700200000000104000030000080012000000000050030604000000 +000000104800090000000000600700200000000401000030000090012000000000050030604000000 +000000105000700400700200000000500080403000000061000000500000020040060000000010000 +000000105002000600030800000100000400000308000000200000570000030400060000000010000 +000000105002600000000902000300000090000070800000010000710000500000200040080000000 +000000105004070000000000300150300000000600080020000000000051200006000070800000000 +000000105030800000000000000000012000060000030000000700102000400500360000000700080 +000000105030800000000000600020030000500006000000000270601000004000200030000070000 +000000105200007000000030600009000400010500000000002030300000070000980000000100000 +000000105200800000000000300000071000000004800300050000000300026004000050010000000 +000000105300040000000000000000080720905600000000000040020000800000100030000509000 +000000105302000000000000000000206030710000000000300000400000820070015000000090000 +000000105802000000000000000000406030200300000010000000400000720060015000000090000 +000000105802000000000000000000406030400700000010000000300000720060015000000090000 +000000105802000000000000000000806020300700000010000000400000730060015000000090000 +000000105802000000000000000000806020400700000010000000200000730060015000000090000 +000000105802000000000000000000806030300700000010000000400000720060015000000090000 +000000106000025000300000000009100400000400000000000020520000080000630700000007000 +000000106020000500000082000010000200000040030000500000703000040400600000000001000 +000000106020070000800000500097000030000500040000100000000020780100600000000000000 +000000106020070000900000500078000030000500040000100000000020780100600000000000000 +000000106030070000400000500078000020000500040000100000000020780100600000000000000 +000000106030070000900000500078000020000500040000100000000020780100600000000000000 +000000106040700000000500300070000450600010000000000000000450020300000080100000000 +000000106040800000000500300070000450600010000000000000000480020300000090100000000 +000000106200005000000000800320000070000010000000800000071000400000023050000600000 +000000106302000000000000000000207030400800000010000000500000840070016000000090000 +000000106302000000000000000000507030500800000010000000200000840070016000000090000 +000000106390000000000000500000610200870000000000500000000407030001050000000000080 +000000106402000000000000000000207030500800000010000000300000840070016000000090000 +000000106402000000000000000000507030500800000010000000200000840070016000000090000 +000000106402000000000000000000507030500800000010000000300000840070016000000090000 +000000107000001300800040000500300000006000040200000000000200050010000200030700000 +000000107000001300800050000200300000006000050400000000000200040010000200030700000 +000000107000025000300000000004100600000400000000000020520000090000730800000008000 +000000107000500300000602000800000026600000040000010000410000700000200000030000000 +000000107000800300800200000000700090403000000061000000500000020090060000000010000 +000000107000800400200300000000700090504000000061000000300000020090060000000010000 +000000107000800400800300000000700090504000000061000000300000020090060000000010000 +000000107000902000000500600900000850000010000400000000007400020010000030060000000 +000000107020030000000000600000040020700600000100000000040200050008000300000105000 +000000107024000000000500600030000050000100400900000000000039020700000008001000000 +000000107040080000900000600028000030000600050000100000000020890100700000000000000 +000000107040080000900000600082000030000600050000100000000020890100700000000000000 +000000107090020000000000004000401500020003060000700000000090030400800000100000000 +000000107400200000080300000200000480000076000000000000567000000000400030001000000 +000000107400200000100000000098000050070000006000100000000095300000070400000000020 +000000107830000000000060400600200050000107000000000000071400000000050680000000000 +000000107900020000000000800000701500400000030000900000000340060008000020010000000 +000000108000008300700040000500300000006000040200000000000200050080000200030100000 +000000108000008300700050000200300000006000050400000000000200040080000200030100000 +000000108000407000000500300040000620000010000020000000701000050000200070300000000 +000000108000600400200300000000800090504000000071000000600000020090070000000010000 +000000108000605000000400300040000620000010000020000000106000050000200070300000000 +000000108009400000000300700600000040000020000000010000370005000010000200000600080 +000000108040200000000600000020400030700010500000000000100080000000000340000000026 +000000108050400000000200000020500030700010600000000000100080000000000350000000042 +000000108200300000600000000010054000000000020000008000000230040080000500700600000 +000000108200700000000000300500000090000038000020010000010000400000500020007600000 +000000108300060000000000500900000600000800020000401000085000001000030070040000000 +000000108400200000100000000089000050070000006000100000000075300000080400000000020 +000000108500040000000000700030050020001000000000200000000001360820000040000700000 +000000108500200000000000400900000050000340000000060200000605070041000000000000030 +000000108600200000000000400200000050000340000000070300000605020041000000000000030 +000000108600300000200000000010058000000000020000001000000230040080000900700600000 +000000108700400000000000000000038600400000070000010000000500064035200000010000000 +000000108900040000000000700030050060001000000000200000000001350820000040000700000 +000000108900040000000000700050060030001000000000200000000001350820000040000700000 +000000109000200300040070000070000080000300000000100000203000600000004050100080000 +000000109000400200000508000000300080100000040200000000060000730430000000000010000 +000000109000807000000500300040000620000010000080000000701000050000400070300000000 +000000109040200000030000400600405020100000000000700000000000870000019000000060000 +000000109200600000000050400000010500000700030300000000000802060014000000000000070 +000000109300400000000000200027006000000800500009000000510020000400000030000090000 +000000109400050000000020300000109000500007000000300000013000000080000040009000020 +000000109400050000090020000000401700060000000000700000000060020700300000801000000 +000000109700008000000000000360000080010590000000000020000140600205000000000900000 +000000109700400000000000000000039600400000070000010000000500084035200000010000000 +000000120000040700030007000057000008000410000000200000000000053400600000100000000 +000000120063000000000000000040000503100208000000700000500000080002600000000030400 +000000126000850000000000004000300700400001000105000000070000380000046000000000000 +000000126000950000000000004000300800400001000105000000030000790000046000000000000 +000000130000080005420000000600000020005010000000000400070402000000600200000000001 +000000130020400000000000000000600025700080000100000000000016700005200000040000300 +000000130040020000000000000000000026700900000100000000062050004000107300000800000 +000000130047000000050000000100302000000050007000000040800000200000603000000740000 +000000130200600000700500000040010300000200050010000000500000007000084000000030000 +000000130400070000800000000000506200700300004000100000000080076015000000000000000 +000000130800600000200500000040010300000200050010000000500000008000074000000030000 +000000135608000000000000040030400010000027000050000000200000706000000200000300000 +000000135608000000000000040050400010000076000030000000200000706000000200000300000 +000000135807000000000000040030400010000076000050000000200000706000000200000300000 +000000136087000000000000050000740900360000000000000000004080200600305000000000000 +000000140090020000000000000000107400950000000000400000001000302000090050800600000 +000000140090020000000600700401000000000580000300000000080000502000001030000400000 +000000140400000600000500000000305008200700000106000000050000083600010000000000000 +000000150080020000000000000000501400870000000000400000001000320000080007500600000 +000000150900700000000000030042000700001030000050000000200600800300400000000050000 +000000160000009500000040000041020000000300600080000000700000024300900000000000008 +000000160020700000000000900600010000000040002030000000100000470000300005800200000 +000000160040020000000009070300100000000000402600000000000630500029000000000800000 +000000160200040000000000708000530020007000050010000000300006400000107000000000000 +000000160200070000300000800000608900420000000000500000000010002008000050060000000 +000000160200070000300000800000608900420000000000500000000040002008000050060000000 +000000160800400000000000700000070600010030000200000050000208000076000000000500004 +000000170000004600000050000051020000000300700080000000700000025400900000000000008 +000000170020900000000000600600010000000040002030000000100000460000300005800200000 +000000170030040000000000600600100000000006030005000004000650200740000000000800000 +000000170040800000000000002000500048200070000100000000000010260080600000000000300 +000000175049600000000000000500000300100090000000420000020000049300001000000000000 +000000180000205000000003000010080000000600002003000000000040710600000300200500000 +000000180300500000000000020061000000000300400008000000710000300000086005000020000 +000000180300900000000000020068000000000300400001000000710000300000086005000020000 +000000190300400000000000020071000000000300500009000000810000400000097006000020000 +000000201000020500080004000000230000090000040000500000602100000500000300000000070 +000000201000080400300050000000204000500000070000600000004100002020000600000000030 +000000201000370000000000000430010000000002600080000070000800530001000020700000000 +000000201004030000000000000370000080600200000000500000540000600000070040002001000 +000000201005090000038000000120400000000030080700000000000000430000201000000600000 +000000201005090000038000000120400000000030080700000000000000530000201000000600000 +000000201009050000400700000600102000000000030000800000000040690710000000000030000 +000000201030070000000400800000050040801000000006000000200801000050000700000000090 +000000201040030000000006000600072000030000040000100500201800000000000730000000000 +000000201060400000003000000200070100500020000000000060100000500000308000000600040 +000000201070300000000000000060000030000205000000041000005780060100000400200000000 +000000201080050000000000000600201000000500740000300000000084050302000000100000000 +000000201080300000000000000060000030000205000000041000005780060100000400200000000 +000000201080400000000700000000540080302000000100000000500032600070000040000000000 +000000201090004000030000000000008530700000400100000000200670000000020800000100000 +000000201090030000000000004006000530300400000000100000000090080204000000170000000 +000000201090400000000300000170020000000008600000000050208000500000900040006000000 +000000201096000000000000500000090040200030000100000000070502000000006083000100000 +000000201500300000000070000000500030020004000076000000000000350000021000800000400 +000000201600300000700000000008540000020000030000600700010082000500000060000000000 +000000201730000000600040000000060030008000500200000000001200000000508000060000070 +000000201800000900000400000000610030270000000900000000090072000001000040000800000 +000000203006400000000000500100600070820000000000830000000059000050002000000000040 +000000203010700000000000000000023400090060000800000000000800019600900070200000000 +000000203080700000000000100005000040300010000000000600000407060100000080200500000 +000000203800600000000000700002000100040800000000300060000027040300000005000010000 +000000204000001000000080000020400500000030700000000080100200006806000010000700000 +000000204001000000050000000006500080200009000000000010000150700940000300000800000 +000000204050030000000000690000850010206000000900000000000206000130000000000400000 +000000204050700000680000000300000090000014000000020000201000000000800050000600700 +000000204100900000000000007670300000000100830040000000000025000500000090000040000 +000000204100900000000000008680700000000100730040000000000025000500000090000040000 diff --git a/Lab1/src/Sudoku/Makefile b/Lab1/src/Sudoku/Makefile deleted file mode 100644 index c5e2a079..00000000 --- a/Lab1/src/Sudoku/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -CXXFLAGS+=-O2 -ggdb -DDEBUG -CXXFLAGS+=-Wall -Wextra - -all: sudoku - -sudoku: main.cc neighbor.cc sudoku_basic.cc sudoku_min_arity.cc sudoku_min_arity_cache.cc sudoku_dancing_links.cc - g++ -O2 -o $@ $^ diff --git a/Lab1/src/Sudoku/main.cc b/Lab1/src/Sudoku/main.cc index 4ed2f3a5..51f071b3 100644 --- a/Lab1/src/Sudoku/main.cc +++ b/Lab1/src/Sudoku/main.cc @@ -22,19 +22,19 @@ int main(int argc, char* argv[]) int total_solved = 0; int total = 0; bool (*solve)(int) = solve_sudoku_basic; - if (argv[2] != NULL) - if (argv[2][0] == 'a') - solve = solve_sudoku_min_arity; - else if (argv[2][0] == 'c') - solve = solve_sudoku_min_arity_cache; - else if (argv[2][0] == 'd') - solve = solve_sudoku_dancing_links; + // if (argv[2] != NULL) + // if (argv[2][0] == 'a') + // solve = solve_sudoku_min_arity; + // else if (argv[2][0] == 'c') + // solve = solve_sudoku_min_arity_cache; + // else if (argv[2][0] == 'd') + // solve = solve_sudoku_dancing_links; int64_t start = now(); while (fgets(puzzle, sizeof puzzle, fp) != NULL) { if (strlen(puzzle) >= N) { ++total; input(puzzle); - init_cache(); + //init_cache(); //if (solve_sudoku_min_arity_cache(0)) { //if (solve_sudoku_min_arity(0)) //if (solve_sudoku_basic(0)) { diff --git a/Lab1/src/Sudoku/makefile b/Lab1/src/Sudoku/makefile new file mode 100644 index 00000000..0941e054 --- /dev/null +++ b/Lab1/src/Sudoku/makefile @@ -0,0 +1,20 @@ +cc = g++ +prom = sudoku_solve +deps = sudoku.h +obj = main.o neighbor.o sudoku_basic.o + +$(prom): $(obj) + $(cc) -o $(prom) $(obj) + +main.o: main.cc $(deps) + $(cc) -c main.cc + +neighbor.o: neighbor.cc $(deps) + $(cc) -c neighbor.cc + +sudoku_basic.o: sudoku_basic.cc $(deps) + $(cc) -c sudoku_basic.cc + +.PHONY:clean +clean: + rm *.o $(prom) diff --git a/Lab1/src/images/hardware.png b/Lab1/src/images/hardware.png new file mode 100644 index 00000000..f3be39a9 Binary files /dev/null and b/Lab1/src/images/hardware.png differ diff --git a/Lab1/src/images/input.png b/Lab1/src/images/input.png new file mode 100644 index 00000000..99a641bd Binary files /dev/null and b/Lab1/src/images/input.png differ diff --git a/Lab1/src/images/time.png b/Lab1/src/images/time.png new file mode 100644 index 00000000..483a0e98 Binary files /dev/null and b/Lab1/src/images/time.png differ diff --git a/Lab2/Lab2/Lab2/CloudComputingLabs b/Lab2/Lab2/Lab2/CloudComputingLabs new file mode 160000 index 00000000..cc7dacaa --- /dev/null +++ b/Lab2/Lab2/Lab2/CloudComputingLabs @@ -0,0 +1 @@ +Subproject commit cc7dacaa3db680fe81576651912df78976ad54a3 diff --git a/Lab2/Lab2/Lab2/Http_Server.cpp b/Lab2/Lab2/Lab2/Http_Server.cpp new file mode 100755 index 00000000..1a9abd95 --- /dev/null +++ b/Lab2/Lab2/Lab2/Http_Server.cpp @@ -0,0 +1,167 @@ +#include "Http_Server.h" +#include +#include + +void HttpServer::deal_get(string url,string method){ + string s="./html"; + if(url.find(".")==string::npos){ + if(url.length()==0||url[url.length()-1]=='/') + s=s+url+"index.html"; + else s=s+url+"/index.html"; + } + else s=s+url; + + int filefd=open(s.c_str(),O_RDONLY); + if(filefd<0){ + Not_Found(url,method); + } + else{ + struct stat filestat; + stat(s.c_str(), &filestat); + char buf[128]; + sprintf(buf, "HTTP/1.1 202 OK\r\ncontent-length:%d\r\n\r\n", (int)filestat.st_size); + write(socketfd, buf, strlen(buf)); + sendfile(socketfd, filefd, 0, filestat.st_size); + } +} + +void HttpServer::deal_post(string name,string id){ + string entity1="POST Method\n"; + string str2="Your name: "+name+"\nYour id: "+id+"\n"; + string entity2="
HTTP Web Server\n\n"; + string entity=entity1+str2+entity2; + string str="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: "+to_string(entity.length())+"\r\n\r\n"; + string total=str+entity; + char buf[512]; + sprintf(buf,"%s",total.c_str()); + write(socketfd, buf, strlen(buf)); +} + +void HttpServer::Not_Found(string url,string method){ + string entity1="404 Not Found\n Not Found\n"; + string file="

Could not find this file: "+url+"\n"; + string entity2="


HTTP Web Server\n\n"; + string entity=entity1+file+entity2; + if(method=="POST"){ + entity=entity1+entity2; + } + string header="HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\nContent-Length: "+to_string(entity.length())+"\r\n\r\n"; + string total=header+entity; + char buf[512]; + sprintf(buf,"%s",total.c_str()); + write(socketfd, buf, strlen(buf)); +} + +void HttpServer::Not_Implemented(string method){//非GET/POST请求 + string entity1="501 Not Implemented\n Not Implemented\n"; + string entity2="

Does not implement this method: "+method+"\n


HTTP Web Server\n\n"; + string entity=entity1+entity2; + string header="HTTP/1.1 501 Not Implemented\r\nContent-Type: text/html\r\nContent-Length: "+to_string(entity.length())+"\r\n\r\n"; + string total=header+entity; + char buf[512]; + sprintf(buf,"%s",total.c_str()); + write(socketfd, buf, strlen(buf)); +} + + + +void HttpServer::dealHttp(){ + string strbuf; + while(1){ + bool aliveflag=true;//持久连接标志 + char buf[BUFFER_SIZE]; + int size=0; + size=recv(socketfd,buf,BUFFER_SIZE-1,0); + if(size>0){ + buf[size]='\0'; + strbuf+=string(buf); + while(strbuf.find("HTTP/")!=string::npos){ + int pos=0; + int postPos=0; + + + if((pos=strbuf.find("\r\n\r\n"))!=-1){ + string httprequest=""; + + pos+=4; + httprequest=strbuf.substr(0,pos); + postPos=httprequest.length(); + int entitypos=httprequest.find("Content-Length:"); + + if(entitypos!=-1){ + string num; + entitypos+=16; + while(httprequest[entitypos]!='\r'){ + num+=httprequest[entitypos++]; + } + int entityLen=atoi(num.c_str()); + if((int)(strbuf.length()-httprequest.length())>=entityLen){ + httprequest+=strbuf.substr(httprequest.length(),entityLen); + pos+=entityLen; + } + else continue; + } + + strbuf=strbuf.substr(pos); + string method,url; + pos=0; + + + while(httprequest[pos]!=' '){ + method+=httprequest[pos++]; + } + + if(method!="GET"&&method!="POST"){ + Not_Implemented(method); + continue; + } + + ++pos; + while(httprequest[pos]!=' '){ + url+=httprequest[pos++]; + } + ++pos;//提取URL + + if(method=="GET"){ + deal_get(url,method); + } + else if(method=="POST"){ + + if(url!="/Post_show"){ + Not_Found(url,method); + continue; + } + string entity=httprequest.substr(postPos,httprequest.length()-postPos); + + int namepos=entity.find("Name="),idpos=entity.find("&ID="); + if(namepos==-1||idpos==-1||idpos<=namepos){//请求体中存在Name和ID并且按照Name、ID排列 + Not_Found(url,method); + continue; + } + if(entity.find("=",idpos+4)!=string::npos){ + Not_Found(url,method); + continue; + } + + string name,id; + + name=entity.substr(namepos+5,idpos-namepos-5); + id=entity.substr(idpos+4); + deal_post(name,id); + } + if(httprequest.find("Connection: close")!=string::npos){//判断是否是持久连接 + aliveflag=false; + break; + } + } + } + if(!aliveflag)break; + } + else{ + if(size<=0&&errno!=EINTR){ + } + } + } + sleep(3); + close(socketfd); +} diff --git a/Lab2/Lab2/Lab2/Http_Server.h b/Lab2/Lab2/Lab2/Http_Server.h new file mode 100755 index 00000000..dc7e9f9c --- /dev/null +++ b/Lab2/Lab2/Lab2/Http_Server.h @@ -0,0 +1,37 @@ +#ifndef _HTTPSERVER_H_ +#define _HTTPSERVER_H_ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + + +#define BUFFER_SIZE 4096 +class HttpServer{ + private: + int socketfd; + public: + HttpServer(){} + HttpServer(int id):socketfd(id){} + ~HttpServer(){} + void dealHttp(); + void deal_get(string url,string method);//处理get请求 + void deal_post(string name,string id);//处理post请求 + void Not_Implemented(string method);//非post,get请求 + void Not_Found(string url,string method);//文件未找到 + +}; + +#endif diff --git a/Lab2/Lab2/Lab2/Makefile b/Lab2/Lab2/Lab2/Makefile new file mode 100755 index 00000000..5b8a9361 --- /dev/null +++ b/Lab2/Lab2/Lab2/Makefile @@ -0,0 +1,23 @@ +CC = g++ + +STD = -std=c++11 + +CFLAGS = -g -Wall -pthread + +SRC = $(wildcard *.cpp) + +OBJ = $(patsubst %cpp, %o, $(SRC)) + +BIN = HttpServer + + +all:$(OBJ) + $(CC) $(OBJ) $(CFLAGS) -o $(BIN) + +%.o:%.cpp + $(CC) $(STD) $(CFLAGS) -c $< -o $@ + + +.PHONY : clean +clean: + rm *.o $(BIN) -rf \ No newline at end of file diff --git a/Lab2/Lab2/Lab2/Makefile.win b/Lab2/Lab2/Lab2/Makefile.win new file mode 100755 index 00000000..c7d64a82 --- /dev/null +++ b/Lab2/Lab2/Lab2/Makefile.win @@ -0,0 +1,34 @@ +# Project: HttpServer +# Makefile created by Dev-C++ 5.11 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +OBJ = HttpSer.o main.o Threadpool.o +LINKOBJ = HttpSer.o main.o Threadpool.o +LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3 +INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" +CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" +BIN = HttpServer.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm.exe -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before $(BIN) all-after + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) + +HttpSer.o: HttpSer.cpp + $(CPP) -c HttpSer.cpp -o HttpSer.o $(CXXFLAGS) + +main.o: main.cpp + $(CPP) -c main.cpp -o main.o $(CXXFLAGS) + +Threadpool.o: Threadpool.cpp + $(CPP) -c Threadpool.cpp -o Threadpool.o $(CXXFLAGS) diff --git a/Lab2/Lab2/Lab2/Thread_Pool.cpp b/Lab2/Lab2/Lab2/Thread_Pool.cpp new file mode 100755 index 00000000..958adb9c --- /dev/null +++ b/Lab2/Lab2/Lab2/Thread_Pool.cpp @@ -0,0 +1,41 @@ +#include "Thread_Pool.h" +//创建并启动线程池 +void Thread_Pool::initPool(){ + pthread_mutex_lock(&lock); + for(int i=0;iqueue_Pop(); + return NULL; +} + +void Thread_Pool::queue_Pop(){ + while(1){ + pthread_mutex_lock(&lock); + while(task_queue.empty()){ + pthread_cond_wait(&cond,&lock); + } + HttpServer http=task_queue.front(); + task_queue.pop(); + + pthread_mutex_unlock(&lock); + http.dealHttp(); + } +} + +void Thread_Pool::queue_Add(HttpServer task){ + pthread_mutex_lock(&lock); + task_queue.push(task); + pthread_cond_signal(&cond); + pthread_mutex_unlock(&lock); +} + diff --git a/Lab2/Lab2/Lab2/Thread_Pool.h b/Lab2/Lab2/Lab2/Thread_Pool.h new file mode 100755 index 00000000..5ef37023 --- /dev/null +++ b/Lab2/Lab2/Lab2/Thread_Pool.h @@ -0,0 +1,38 @@ +#ifndef _THREADPOOL_H_ +#define _THREADPOOL_H_ + +#include +#include +#include "Http_Server.h" +#include +using namespace std; + +class Thread_Pool{ + private: + pthread_mutex_t lock; + pthread_cond_t cond; + queue task_queue; + int thread_count; //线程数 + vector thread; //线程池中的线程 + + public: + + Thread_Pool(int num):thread_count(num){ + pthread_mutex_init(&lock,NULL); + cond = PTHREAD_COND_INITIALIZER; + thread=vector(thread_count); + } + + ~Thread_Pool(){ + pthread_mutex_destroy(&lock); + pthread_cond_destroy(&cond); + } + void initPool();//构建线程池 + + void queue_Add(HttpServer t);//向工作队列中加入请求 + void queue_Pop();//消费工作队列中的请求 + + static void* work(void *arg);//所有子线程创建完成后,子线程才开始运行 +}; + +#endif diff --git a/Lab2/Lab2/Lab2/error.txt b/Lab2/Lab2/Lab2/error.txt new file mode 100644 index 00000000..a183f0de --- /dev/null +++ b/Lab2/Lab2/Lab2/error.txt @@ -0,0 +1,27 @@ + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 20911 0 --:--:-- --:--:-- --:--:-- 179k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 146k 0 --:--:-- --:--:-- --:--:-- 179k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 44422 0 --:--:-- --:--:-- --:--:-- 61333 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 71679 0 --:--:-- --:--:-- --:--:-- 92000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 211k 0 --:--:-- --:--:-- --:--:-- 179k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 43467 0 --:--:-- --:--:-- --:--:-- 61333 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 27777 0 --:--:-- --:--:-- --:--:-- 179k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 184 100 184 0 0 41704 0 --:--:-- --:--:-- --:--:-- 46000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:01:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:02:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:03:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:04:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:05:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:06:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:07:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:08:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:09:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:10:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:11:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:12:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:35 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:36 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:37 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:38 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:39 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:40 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:41 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:42 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:43 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:44 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:45 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:46 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:47 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:48 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:49 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:50 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:51 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:52 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:53 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:54 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:55 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:56 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:57 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:58 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:13:59 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:00 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:01 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:02 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:03 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:04 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:05 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:06 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:07 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:08 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:09 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:10 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:11 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:12 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:13 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:14 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:15 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:16 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:17 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:18 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:19 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:20 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:21 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:22 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:23 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:24 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:25 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:26 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:27 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:28 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:29 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:30 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:31 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:32 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:33 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:34 --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:14:35 --:--:-- 0 \ No newline at end of file diff --git a/Lab2/Lab2/Lab2/error2.txt b/Lab2/Lab2/Lab2/error2.txt new file mode 100644 index 00000000..9b6bca35 --- /dev/null +++ b/Lab2/Lab2/Lab2/error2.txt @@ -0,0 +1,300 @@ + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 866 126 --:--:-- --:--:-- --:--:-- 872 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2127 310 --:--:-- --:--:-- --:--:-- 2166 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3608 527 --:--:-- --:--:-- --:--:-- 3714 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 8499 1242 --:--:-- --:--:-- --:--:-- 9285 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1691 247 --:--:-- --:--:-- --:--:-- 1710 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 6789 992 --:--:-- --:--:-- --:--:-- 8666 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2001 292 --:--:-- --:--:-- --:--:-- 2031 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2303 336 --:--:-- --:--:-- --:--:-- 2363 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 16339 2388 --:--:-- --:--:-- --:--:-- 18571 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2307 337 --:--:-- --:--:-- --:--:-- 2363 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2050 299 --:--:-- --:--:-- --:--:-- 2063 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 9193 1343 --:--:-- --:--:-- --:--:-- 10000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2227 325 --:--:-- --:--:-- --:--:-- 2241 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2795 408 --:--:-- --:--:-- --:--:-- 2826 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 8541 1248 --:--:-- --:--:-- --:--:-- 8666 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2563 374 --:--:-- --:--:-- --:--:-- 2653 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2189 320 --:--:-- --:--:-- --:--:-- 2203 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 23866 3488 --:--:-- --:--:-- --:--:-- 126k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2761 403 --:--:-- --:--:-- --:--:-- 2826 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2138 312 --:--:-- --:--:-- --:--:-- 2166 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 6660 973 --:--:-- --:--:-- --:--:-- 9285 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2224 325 --:--:-- --:--:-- --:--:-- 2241 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2082 304 --:--:-- --:--:-- --:--:-- 2096 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 7019 1025 --:--:-- --:--:-- --:--:-- 7222 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 100 149 100 130 100 19 47 6 0:00:03 0:00:02 0:00:01 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2325 339 --:--:-- --:--:-- --:--:-- 2363 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1523 222 --:--:-- --:--:-- --:--:-- 1529 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 130k 19547 --:--:-- --:--:-- --:--:-- 126k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3055 446 --:--:-- --:--:-- --:--:-- 3095 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1241 181 --:--:-- --:--:-- --:--:-- 1250 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 11768 1720 --:--:-- --:--:-- --:--:-- 13000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3619 529 --:--:-- --:--:-- --:--:-- 3714 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 7 0:00:02 0:00:02 --:--:-- 47 100 149 100 130 100 19 47 7 0:00:02 0:00:02 --:--:-- 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1273 186 --:--:-- --:--:-- --:--:-- 1287 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 6839 999 --:--:-- --:--:-- --:--:-- 7222 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4148 606 --:--:-- --:--:-- --:--:-- 4333 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1336 195 --:--:-- --:--:-- --:--:-- 1382 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3635 531 --:--:-- --:--:-- --:--:-- 3714 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4806 702 --:--:-- --:--:-- --:--:-- 5000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1071 156 --:--:-- --:--:-- --:--:-- 1074 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2468 360 --:--:-- --:--:-- --:--:-- 2500 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4525 661 --:--:-- --:--:-- --:--:-- 5416 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1185 173 --:--:-- --:--:-- --:--:-- 1203 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3648 533 --:--:-- --:--:-- --:--:-- 3714 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4930 720 --:--:-- --:--:-- --:--:-- 5000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 47 7 0:00:02 0:00:02 --:--:-- 47 100 149 100 130 100 19 47 7 0:00:02 0:00:02 --:--:-- 47 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1454 212 --:--:-- --:--:-- --:--:-- 1460 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3705 541 --:--:-- --:--:-- --:--:-- 4062 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 33531 4900 --:--:-- --:--:-- --:--:-- 43333 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1219 178 --:--:-- --:--:-- --:--:-- 1226 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 5147 752 --:--:-- --:--:-- --:--:-- 5200 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1817 265 --:--:-- --:--:-- --:--:-- 1857 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1562 228 --:--:-- --:--:-- --:--:-- 1585 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 5333 779 --:--:-- --:--:-- --:--:-- 5416 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1614 235 --:--:-- --:--:-- --:--:-- 1645 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1437 210 --:--:-- --:--:-- --:--:-- 1477 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 5735 838 --:--:-- --:--:-- --:--:-- 5909 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3011 440 --:--:-- --:--:-- --:--:-- 3095 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1323 193 --:--:-- --:--:-- --:--:-- 1340 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2732 399 --:--:-- --:--:-- --:--:-- 2765 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2130 311 --:--:-- --:--:-- --:--:-- 2166 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1229 179 --:--:-- --:--:-- --:--:-- 1238 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 5427 793 --:--:-- --:--:-- --:--:-- 5652 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 100 149 100 130 100 19 48 7 0:00:02 0:00:02 --:--:-- 48 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2224 325 --:--:-- --:--:-- --:--:-- 2241 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 1301 190 --:--:-- --:--:-- --:--:-- 1313 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 9813 1434 --:--:-- --:--:-- --:--:-- 10833 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 2975 434 --:--:-- --:--:-- --:--:-- 3023 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 56423 8246 --:--:-- --:--:-- --:--:-- 126k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4891 714 --:--:-- --:--:-- --:--:-- 5000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3469 507 --:--:-- --:--:-- --:--:-- 3513 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4580 669 --:--:-- --:--:-- --:--:-- 5416 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 13574 1983 --:--:-- --:--:-- --:--:-- 14444 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 21623 3160 --:--:-- --:--:-- --:--:-- 26000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 8331 1217 --:--:-- --:--:-- --:--:-- 10000 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 19 0 0 100 19 0 15 0:00:01 0:00:01 --:--:-- 15 100 19 0 0 100 19 0 8 0:00:02 0:00:02 --:--:-- 8 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 100 149 100 130 100 19 49 7 0:00:02 0:00:02 --:--:-- 49 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 12587 1839 --:--:-- --:--:-- --:--:-- 14444 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 5324 778 --:--:-- --:--:-- --:--:-- 5416 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 3495 510 --:--:-- --:--:-- --:--:-- 3611 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 4808 702 --:--:-- --:--:-- --:--:-- 6842 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 28102 4107 --:--:-- --:--:-- --:--:-- 43333 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 47671 6967 --:--:-- --:--:-- --:--:-- 126k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed + 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 149 100 130 100 19 7012 1024 --:--:-- --:--:-- --:--:-- 7647 diff --git a/Lab2/Lab2/Lab2/html/index.html b/Lab2/Lab2/Lab2/html/index.html new file mode 100755 index 00000000..f4545d35 --- /dev/null +++ b/Lab2/Lab2/Lab2/html/index.html @@ -0,0 +1,13 @@ + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + diff --git a/Lab2/Lab2/Lab2/html/test.jpg b/Lab2/Lab2/Lab2/html/test.jpg new file mode 100755 index 00000000..7ba5c10b Binary files /dev/null and b/Lab2/Lab2/Lab2/html/test.jpg differ diff --git a/Lab2/Lab2/Lab2/index.html b/Lab2/Lab2/Lab2/index.html new file mode 100755 index 00000000..f4545d35 --- /dev/null +++ b/Lab2/Lab2/Lab2/index.html @@ -0,0 +1,13 @@ + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + diff --git a/Lab2/Lab2/Lab2/main.cpp b/Lab2/Lab2/Lab2/main.cpp new file mode 100755 index 00000000..46ffb7ba --- /dev/null +++ b/Lab2/Lab2/Lab2/main.cpp @@ -0,0 +1,72 @@ +#include "Http_Server.h" +#include "Thread_Pool.h" + +using namespace std; + +static int thread_count=20; +int main(int argc, char *argv[]) +{//输入不符合规范 + if(argc <5){ + printf("usage : %s --ip --port [--number-thread]\n", argv[0]); + return 1; + } + + //设置服务器ip地址 + string ip=argv[2]; + //设置服务器应用port + int port = atoi(argv[4]); + if(argc==7&&strcmp(argv[5],"--number-thread")==0) + thread_count=atoi(argv[6]); + + int socketfd, connectfd; //服务套接字和连接套接字 + + struct sockaddr_in ServerAddr, client; + //设置服务端的sockaddr_in + memset(&ServerAddr,0,sizeof(ServerAddr)); + ServerAddr.sin_family = AF_INET; + ServerAddr.sin_port = htons(port); + ServerAddr.sin_addr.s_addr = inet_addr(ip.c_str()); + + + //创建设置socket,TCP,IPv4网络 + socketfd = socket(AF_INET, SOCK_STREAM, 0); + if(socketfd < 0){ + printf("socket error\n"); + return 1; + } + + int option=1; + socklen_t optlen=sizeof(option); + setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,(void*)&option,optlen); + + + int ret = bind(socketfd, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr)); + if(ret < 0){ + printf("Bind error\n"); + return 1; + } + + + ret = listen(socketfd, 20); + if(ret < 0){ + printf("Listen Error\n"); + return 1; + } + + //创建线程池,默认20个线程 + Thread_Pool pool(thread_count); + pool.initPool(); //初始化线程池,启动服务器 + + while(1){ + socklen_t len = sizeof(client); + //接受连接 + connectfd = accept(socketfd, (struct sockaddr *)&client, &len); + if(connectfd!=-1){ + HttpServer task(connectfd); + //向线程池添加任务 + pool.queue_Add(task); + } + } + close(socketfd); + return 0; +} diff --git a/Lab2/Lab2/Lab2/result.txt b/Lab2/Lab2/Lab2/result.txt new file mode 100644 index 00000000..cdbca596 --- /dev/null +++ b/Lab2/Lab2/Lab2/result.txt @@ -0,0 +1,128 @@ +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + +HTTP/1.1 202 OK +content-length:184 + + + + index.html + + + + This is a html page.!! +
+ + +

The Tiny Web server


+ + diff --git a/Lab2/Lab2/Lab2/result2.txt b/Lab2/Lab2/Lab2/result2.txt new file mode 100644 index 00000000..1d65a496 --- /dev/null +++ b/Lab2/Lab2/Lab2/result2.txt @@ -0,0 +1,904 @@ +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + +HTTP/1.1 200 OK +Content-Type: text/html +Content-Length: 130 + +POST Method +Your name: HNU +Your id: CS06142 +
HTTP Web Server + + + + + time: 67 s diff --git a/Lab2/Lab2/Lab2/test.jpg b/Lab2/Lab2/Lab2/test.jpg new file mode 100755 index 00000000..7ba5c10b Binary files /dev/null and b/Lab2/Lab2/Lab2/test.jpg differ diff --git a/Lab2/Lab2/Lab2/test.sh b/Lab2/Lab2/Lab2/test.sh new file mode 100755 index 00000000..961c922b --- /dev/null +++ b/Lab2/Lab2/Lab2/test.sh @@ -0,0 +1,11 @@ +#!/bin/bash + + +start=`date +%s` +for i in $(seq 1 1 100) +do + curl -i -X GET http://127.0.0.1:8888/index.html +done +end=`date +%s` +dif=$[ end - start ] +echo -e "\n\n\n time: $dif s" diff --git a/Lab2/Lab2/Lab2/test2.sh b/Lab2/Lab2/Lab2/test2.sh new file mode 100755 index 00000000..17e6c124 --- /dev/null +++ b/Lab2/Lab2/Lab2/test2.sh @@ -0,0 +1,12 @@ +#!/bin/bash + + +start=`date +%s` +for i in $(seq 1 1 100) +do + curl -i -X POST --data 'Name=HNU&ID=CS06142' http://127.0.0.1:8888/Post_show + +done +end=`date +%s` +dif=$[ end - start ] +echo -e "\n\n\n time: $dif s" diff --git a/Lab2/Lab2/README.md b/Lab2/Lab2/README.md new file mode 100644 index 00000000..f20b82ad --- /dev/null +++ b/Lab2/Lab2/README.md @@ -0,0 +1,358 @@ +# Lab2: Your Own HTTP Server + +*Some materials are from Homework 2 of CS162 2019 at UC Berkeley.* *Thanks to CS162!* + +Enter in the folder you have cloned from our lab git repo, and pull the latest commit. + +`git pull` + +You can find this lab2's instruction in `Lab2/README.md` + +All materials of lab2 are in folder `Lab2/` + +## 1. Overview + +Implement an HTTP server from scratch by your own, using network programming knowledges learned from our class. Also, try to use high concurrency programming skills learned from the class to guarantee the web server's performance. + +### Goals + +* Practice basic network programming skills, such as using socket API, parsing packets; +* Get familiar with robust and high-performance concurrent programming. + +## 2. Background + +### 2.1 Hypertext Transport Protocol + +The Hypertext Transport Protocol (HTTP) is the most commonly used application protocol on the Internet today. Like many network protocols, HTTP uses a client-server model. An HTTP client opens a network connection to an HTTP server and sends an HTTP request message. Then, the server replies with an HTTP response message, which usually contains some resource (file, text, binary data) that was requested by the client. We briefly introduce the HTTP message format and structure in this section for your convenience. Detailed specification of HTTP/1.1 can be found in [RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1](https://tools.ietf.org/html/rfc2616). + +### 2.2 HTTP Messages + +HTTP messages are simple, formatted blocks of data. All HTTP messages fall into two types: **request** messages and **response** messages. Request messages request an action from a web server. Response messages carry results of a request back to a client. Both request and response messages have the same basic message structure. + +#### 2.2.1 Message Format + +HTTP request and response messages consist of 3 components: + +- a start line describing the message, +- a block of headers containing attributes, +- and an optional body containing data. + +Each component has the format as following + +##### 2.2.1.1 Start Line + +All HTTP messages begin with a start line. The start line for a request message says *what to do*. The start line for a response message says *what happened*. + +Specifically, the start line is also called ***Request line*** in *Request messages* and ***Response line*** in *Response messages*. + +1. **Request line:** The request line contains a method describing what operation the server should perform and a request URL describing the resource on which to perform the method. The request line also includes an HTTP version tells the server what dialect of HTTP the client is speaking. All of these fields are separated by whitespace. + +Example of request line: + +`GET /index.html HTTP/1.0` + +2. **Response line:** The response line contains the HTTP version that the response message is using, a numeric status code, and a textual reason phrase describing the status of the operation. + +Example of response line: + +`HTTP/1.0 200 OK` + +##### 2.2.1.2 Header + +Following the start line comes a list of zero, one, or many HTTP header fields. HTTP header fields add additional information to request and response messages. They are basically just lists of name/value pairs. Each HTTP header has a simple syntax: a name, followed by a colon (:), followed by optional whitespace, followed by the field value, followed by a CRLF. + +HTTP headers are classified into: General headers, Request headers, Response headers, Entity headers and Extension headers. Note that request-header fields are different from the response-header fields. We will not introduce those fields in details and you are not required to implement in this lab. You can find them in [RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1](https://tools.ietf.org/html/rfc2616). + +Example of headers in a request: + +``` +Host: 127.0.0.1:8888 +User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0 +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate +Connection: keep-alive +Upgrade-Insecure-Requests: 1 +Cache-Control: max-age=0 + // CRLF +``` + +Example of headers in a response: + +``` +Server: Guo's Web Server +Content-length: 248 +Content-type: text/html + // CRLF +``` + +##### 2.2.1.3 Entity Body + +The third part of an HTTP message is the optional entity body. Entity bodies are the payload of HTTP messages. They are the things that HTTP was designed to transmit. + +HTTP messages can carry many kinds of digital data: images, video, HTML documents, software applications, credit card transactions, electronic mail, and so on. + +Example of entity body: + +``` + +CS06142 + +

CS06142

+

Welcome to Cloud Computing Course.
+

+
+
Http Server at ip-127-0-0-1 Port 8888
+ +``` + +#### 2.2.2 Structure of HTTP Request + +A HTTP request message contains an HTTP request line (containing a method, a query string, and the HTTP protocol version), zero or more HTTP header lines and a blank line (i.e. a CRLF). + + Example of HTTP request message: + +``` +GET /index.html HTTP/1.0 +Host: 127.0.0.1:8888 +User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0 +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +Accept-Language: en-US,en;q=0.5 +Accept-Encoding: gzip, deflate +Connection: keep-alive +Upgrade-Insecure-Requests: 1 +Cache-Control: max-age=0 + // CRLF +``` + +#### 2.2.3 Structure of HTTP Response + +A HTTP response message contains an HTTP response status line (containing the HTTP protocol version, the status code, and a description of the status code), zero or more HTTP header lines, a blank line (i.e. a CRLF by itself) and the content requested by the HTTP request. + +Example of HTTP response message: + +``` +HTTP/1.0 200 OK +Server: Tiny Web Server +Content-length: 248 +Content-type: text/html + // CRLF + +CS06142 + +

CS06142

+

Welcome to Cloud Computing Course.
+

+
+
Http Server at ip-127-0-0-1 Port 8888
+ +``` + +### 2.3 HTTP Proxy + +HTTP proxy servers are intermediaries. Proxies sit between clients and servers and act as "middlemen", shuffling HTTP messages back and forth between the parties. + +HTTP proxy servers are middlemen that fulfill transactions on the client's behalf. Without a HTTP proxy, HTTP clients talk directly to HTTP servers. With a HTTP proxy, the client instead talks to the proxy, which itself communicates with the server on the client's behalf. + +HTTP proxy servers are both web servers and web clients. Because HTTP clients send request messages to proxies, the proxy server must properly handle the requests and the connections and return responses, just like a web server. At the same time, the proxy itself sends requests to servers, so it must also behave like a correct HTTP client, sending requests and receiving responses. + +The working pattern of HTTP proxy is shown in the following figure: + +``` + +-----------+ +-----------+ + | | | | + +----------+ Request | | Request | | + | |+---------------> |+--------------> | + | Client | | Proxy | | Server | + | <---------------+| <--------------+| | + +----------+ Response | | Response | | + | | | | + +-----------+ +-----------+ +``` + +## 3. Your Lab Task + +### 3.1 Implement your own HTTP Server + +In this Lab, we won't provide any basic code. So, you should implement a HTTP server from scratch which satisfies the following requirements: + +#### 3.1.1 HTTP Server Outline + +From a network standpoint, your HTTP server should implement the following: + +1. Create a listening socket and bind it to a port +2. Wait a client to connect to the port +3. Accept the client and obtain a new connection socket +4. Read in and parse the HTTP request +5. Start delivering services: 1) Handle HTTP GET/POST request and return an error message if an error occur. 2) Proxy the request to another HTTP server (optional for advanced version). + +The server will be in either non-proxy mode or proxy mode (we have introduced the proxy in section `2.3`). It does not do both things at the same time. + +#### 3.1.2 Handle HTTP request + +In this Lab, **you just need to implement the GET method and the POST method in your HTTP server**. That is to say, if your HTTP server receive a HTTP request but the request method is neither GET nor POST. The HTTP server just need to return a 501 Not Implemented error message (a response message with Response line having status code to be 501, see `2.2`). + +There is no need to handle the header line(s) in the request (but you need to recognize it so that you will not mix it with the next request's start line). Also, you are free to fill any (or zero) header line(s) in the HTTP response. + +##### 3.1.2.1 Handle HTTP GET request + +The HTTP server should be able to handle HTTP GET requests for html pages. + +1. If the HTTP request’s path corresponds to a html page file, respond with a 200 OK and the full contents of the file. For example, if GET /index.html is requested, and a file named index.html exists in the files directory. You should also be able to handle requests to files in subdirectories of the files directory (e.g. GET /images/hero.jpg). +2. If the HTTP request’s path corresponds to a directory and the directory contains an `index.html` file, respond with a 200 OK and the full contents of the index.html file in that folder. +3. If the requested page file does not exist, or the requested directory does not contain an `index.html` file, return a 404 Not Found response (the HTTP body is optional). + +See examples in section `3.1.7.1`. + + +##### 3.1.2.2 Handle HTTP POST request + +The HTTP server should be able to handle HTTP POST requests. In this lab, the way of handle HTTP POST is very simple. + +1. You should construct an HTTP POST request (see section `3.1.7.2`) that contains 2 keys: "Name" and "ID" (please fill in your name and student number respectively), and send the POST request to `/Post_show` (i.e. `http://127.0.0.1:8888/Post_show` if server's IP is `127.0.0.1` and service port is `8888`). + +Then, if the HTTP server receive this POST request (the request URL is `/Post_show` and the keys are "Name" and "ID"), respond with a 200 OK and echo the "Name"-"ID" pairs you have sent. + +2. Otherwise (i.e. the request URL is not `/Post_show` or the keys are not "Name" and "ID"), return a 404 Not Found response message. + +See examples in section `3.1.7.2`. + +##### 3.1.2.3 Other request + +Just return 501 Not Implemented error message for other request method (e.g. DELETE, PUT, etc.). + +See examples in section `3.1.7.3`. + +#### 3.1.3 Implement a proxy server (optional) + +Enable your server to proxy HTTP requests to another HTTP server and forward the responses to the clients. + +1. You should use the value of the `--proxy` command line argument, which contains the address and port number of the upstream HTTP server. +2. Your proxy server should wait for new data on both sockets (the HTTP client fd, and the upstream HTTP server fd). When data arrives, you should immediately read it to a buffer and then write it to the other socket. You are essentially maintaining 2-way communication between the HTTP client and the upstream HTTP server. Note that your proxy must support multiple requests/responses. +3. If either of the sockets closes, communication cannot continue, so you should close the other socket and exit the child process. + +Hints: 1) This is more tricky than writing to a file or reading from stdin, since you do not know which side of the 2-way stream will write data first, or whether they will write more data after receiving a response. 2) You should again use threads for this task. For example, consider using two threads to facilitate the two-way communication, one from A to B and the other from B to A. + +#### 3.1.4 Use multi-thread to increase concurrency + +Your HTTP server should use multiple threads to handle as many concurrent clients' requests as possible. You have at least the following three options to architect your multi-thread server: + +- **On-demand threads**. You can can create a new thread whenever a new client comes in, and use that thread to handle all that clients' task, including parsing the HTTP request, fetching page files, and sending response. The thread can be destroyed after that client finishes, e.g, detect through TCP `recv()`. However,it may not be easy to detect client finish in the HTTP layer. +- **A pool of always-on threads**. You can use a fixed-sized thread pool in your HTTP server program for handling multiple client requests concurrently. If there are no tasks, those threads are in a waiting state. If a new client comes in, assign a thread to handle the client's request and send response to it. If the assigned thread is busy, you can use a work queue to buffer the request, and let the thread process it later. +- **Combined**. Combine above two styles together. For example, you can use thread pool to receive request and send response, and use on-demand threads to fetch large page files. + +Feel free to choose any one from the above three, or use other multi-thread architecture that you think is cool. + +#### 3.1.5 Specify arguments + +Your program should enable long options to accept arguments and specify those arguments during start. They are `--ip`, `--port`, and `--proxy` (optional). + +1. `--ip`             —— Specify the server IP address. +2. `--port`           —— Selects which port the HTTP server listens on for incoming connections. +4. `--proxy`         —— Selects an “upstream” HTTP server to proxy. The argument can have a port number after a colon (e.g. `https://www.CS06142.com:80`). If a port number is not specified, port 80 is the default. + +If you have no idea about *long options*, you can read [this](https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html#Argument-Syntax). And you may need to use some functions like `getopt_long()`, `getopt_long_only()`, `getopt()` and so on. Check those function's usage with the `man` command. + +#### 3.1.6 Run your HTTP Server + +Your program should be able to start at terminal. If your program is called *httpserver*, just typing: + +in the non-proxy mode: + +`./httpserver --ip 127.0.0.1 --port 8888 --number-thread 8` + +It means that your HTTP server's IP address is 127.0.0.1 and service port is 8888. The --number-thread indicates that there are 8 threads in the thread pool for handling multiple client request concurrently. + +in the proxy mode: + +`./httpserver --ip 127.0.0.1 --port 8888 --number-thread 8 --proxy https://www.CS06142.com:80` + +It means that this is an HTTP proxy. This proxy's IP address is 127.0.0.1 and service port is 8888. And the proxy has a thread pool with 8 threads. The --proxy indicates that the "upstream" HTTP server is `https://www.CS06142.COM:80`. So, if you send a request message to this proxy (i.e. `127.0.0.1:8888`), it will forward this request message to the "upstream" HTTP server (i.e. `https://www.CS06142.com:80`) and forward the response message to the client. + +When you run the command above, your HTTP server should run correctly. + +#### 3.1.7 Accessing Your HTTP Server + +##### 3.1.7.1 Using GET method + +1. You can check that your HTTP server works by opening your web browser and going to the appropriate URL. [Note] IP 127.0.0.1 refers to the IP of local host. So you can use 127.0.0.1 to test your HTTP server on the same local machine. + +For example: + +index page + +You can also send HTTP requests with the curl program. An example of how to use curl is: + +`curl -i -X GET http://127.0.0.1:8888/index.html` + +For example: + +index page curl + +2. If the request page does not exist, your HTTP server should return a 404 Not Found error message. + +For example: + +not found page curl + +##### 3.1.7.2 Using POST method + +1. You can check whether the POST method works by sending a HTTP request with the curl program. Typing the command at terminal: + +`curl -i -X POST --data 'Name=HNU&ID=CS06142' http://127.0.0.1:8888/Post_show` + +For example: + +post curl + +You can also construct a POST HTTP request and send the request to HTTP server using some browser plug-in tools. + +2. If the request URL is not `/Post_show` or the keys are not "Name" and "ID"), you will get a 404 Not Found error message. + +For example: + +post not found curl + +##### 3.1.7.3 Other method + +The HTTP server will not handle HTTP requests except GET requests and POST requests. + +If you send a HTTP DELETE (or PUT, HEAD, etc.) request to delete the specified resource, you will get a 501 Not Implemented error message: + +Not implemented + +#### 3.1.8 Implementation requirements + +##### 3.1.8.1 Basic version + +Your program should complete all the **tasks described in section `3.1.1~3.1.7` except `3.1.3`**. + +In the basic version, you have **only one request per TCP connection going on at the same time**. The client waits for response, and when it gets response, perhaps reuses the TCP connection for a new request (or use a new TCP connection). This is also what normal HTTP server supports. + +##### 3.1.8.2 Advanced version + +Your program should complete all the **tasks described in section `3.1.1~3.1.7` including`3.1.3`**. + +In the advanced version, **multiple http requests can be fired concurrently on one TCP connection**. This is also called HTTP pipelining which is supported by many real browsers and servers (such as Chrome). Note that HTTP requests that come from the same TCP connection should be responded in the same order. So take care the order problem when using complex multi-thread styles. + +### 3.2 Finish a performance test report +Please test your code first, and commit a test report along with your lab code into your group’s course github repo. + +The test report should describe the performance result under various testing conditions. Specifically, in your test report, you should at least contain the following two things: + +1. Test how many HTTP request your server can process per second, when running on various server machine environments. For example, change the number of server CPU cores, enable/disable hyper-threading, etc. +2. Test how many HTTP request your server can process per second, by varying the number of concurrent clients that send request to your server simultaneously. Do change the client's workload. For example, test when a client use new TCP connection for a new request, or when a client reuses old TCP connection for new requests. Moreover, if you implement the advanced version, try to change the number of out-bounding requests on the same client's TCP connection. You can write a simple client that send HTTP Get by your own (can run multiple client programs on the same machine to emulate multiple clients), or use some existing HTTP client testing tools such as [ab - Apache HTTP server benchmarking tool](http://httpd.apache.org/docs/current/programs/ab.html). + +**[NOTE]**: Be careful that clients may be the performance bottleneck. So you'd better use multiple machines when testing the performance. For example, you can run multiple client processes on three machines (of three group members), and run the server process on another machine (of the other group member). Moreover, the network can be the bottleneck too. You can estimate the performance limit according to the physical bandwidth of your network environment, and see if your implementation can reach the performance limit. + + +## 4. Lab submission + +Please put all your code in folder `Lab2` and write a `Makefile` so that we **can compile your code in one single command** `make`. The compiled runnable executable binary should be named `httpserver` and located in folder `Lab2`. Please carefully following above rules so that TAs can automatically test your code!!! + +Please submit your lab program and performance test report following the guidance in the [Overall Lab Instructions](../README.md) (`../README.md`) + +## 5. Grading standards + +1. You can get 23 points if you can: 1) finish all the requirements of the basic version, and 2) your performance test report has finished the two requirements described before. If you missed some parts, you will get part of the points depending how much you finished. +2. You can get 25 points (full score) if you can: 1) finish all the requirements of the advanced version, and 2) your performance test report has finished the two requirements described before. If you missed some parts, you will get part of the points depending how much you finished. \ No newline at end of file diff --git a/Lab2/Lab2/src/get_404_curl.png b/Lab2/Lab2/src/get_404_curl.png new file mode 100644 index 00000000..86b3192a Binary files /dev/null and b/Lab2/Lab2/src/get_404_curl.png differ diff --git a/Lab2/Lab2/src/index.png b/Lab2/Lab2/src/index.png new file mode 100644 index 00000000..4a5ad182 Binary files /dev/null and b/Lab2/Lab2/src/index.png differ diff --git a/Lab2/Lab2/src/index_curl.png b/Lab2/Lab2/src/index_curl.png new file mode 100644 index 00000000..ae951e0a Binary files /dev/null and b/Lab2/Lab2/src/index_curl.png differ diff --git a/Lab2/Lab2/src/not_implemented.png b/Lab2/Lab2/src/not_implemented.png new file mode 100644 index 00000000..217be758 Binary files /dev/null and b/Lab2/Lab2/src/not_implemented.png differ diff --git a/Lab2/Lab2/src/not_implemented_curl.png b/Lab2/Lab2/src/not_implemented_curl.png new file mode 100644 index 00000000..0cf244c3 Binary files /dev/null and b/Lab2/Lab2/src/not_implemented_curl.png differ diff --git a/Lab2/Lab2/src/post_404_curl.png b/Lab2/Lab2/src/post_404_curl.png new file mode 100644 index 00000000..46d0b258 Binary files /dev/null and b/Lab2/Lab2/src/post_404_curl.png differ diff --git a/Lab2/Lab2/src/post_curl.png b/Lab2/Lab2/src/post_curl.png new file mode 100644 index 00000000..74d60f47 Binary files /dev/null and b/Lab2/Lab2/src/post_curl.png differ diff --git a/Lab2/easy_version/.Makefile.swp b/Lab2/easy_version/.Makefile.swp new file mode 100644 index 00000000..a3cee95d Binary files /dev/null and b/Lab2/easy_version/.Makefile.swp differ diff --git a/Lab2/easy_version/Makefile b/Lab2/easy_version/Makefile new file mode 100644 index 00000000..966ba858 --- /dev/null +++ b/Lab2/easy_version/Makefile @@ -0,0 +1,5 @@ +httpserver:httpserver.c + gcc httpserver.c -o httpserver -lpthread + ./a.out + + diff --git a/Lab2/easy_version/a.out b/Lab2/easy_version/a.out new file mode 100644 index 00000000..7f707179 Binary files /dev/null and b/Lab2/easy_version/a.out differ diff --git a/Lab2/easy_version/httpserver b/Lab2/easy_version/httpserver new file mode 100755 index 00000000..95127c92 Binary files /dev/null and b/Lab2/easy_version/httpserver differ diff --git a/Lab2/easy_version/httpserver.c b/Lab2/easy_version/httpserver.c new file mode 100644 index 00000000..347b4f5a --- /dev/null +++ b/Lab2/easy_version/httpserver.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include + +int create_listenfd(void) +{ + int fd=socket(AF_INET,SOCK_STREAM,0); + struct sockaddr_in sin; + bzero(&sin,sizeof(sin)); + sin.sin_family=AF_INET; + sin.sin_port=htons(80); + sin.sin_addr.s_addr=INADDR_ANY; + + int res=bind(fd,(struct sockaddr*)&sin,sizeof(sin)); + if(res==-1) + { + perror("bind"); + } + + listen(fd,100); + return fd; + +} + + +void handle_request(int fd) +{ + char buffer[1024*1024]={0}; + int nread = read(fd,buffer,sizeof(buffer)); + printf("Request income%s\n",buffer); + + char filename[10]={0}; + sscanf(buffer,"GET /%s",filename); + printf("Filename%\n",filename); + + char *mime=NULL; + if(strstr(filename,".html")) + mime="text/html"; + else + if(strstr(filename,".jpg")) + mime="image/jpg"; + + + + char response[1024*1024]={0}; + sprintf(response,"HTTP/1.1 200 OK\r\nContent-Type: %s\r\n\r\n",mime); + int headlen=strlen(response); + + + + int filefd=open(filename,O_RDONLY); + int filelen=read(filefd,response+headlen,sizeof(response)-headlen); + + + write(fd,response,headlen+filelen); + close(filefd); + sleep(1); + +} + + +int main() +{ + int sockfd=create_listenfd(); + int n=1; + setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&n,4); + + + while(1) + { + + int fd=accept(sockfd,NULL,NULL); + printf("ClientConnecting\n"); + + + handle_request(fd); + + close(fd); + } + + close(sockfd); + +} diff --git a/Lab2/easy_version/index.html b/Lab2/easy_version/index.html new file mode 100644 index 00000000..64a5b8a6 --- /dev/null +++ b/Lab2/easy_version/index.html @@ -0,0 +1,12 @@ + +

test html

+ + +

+ Finish! +

+ + + + + \ No newline at end of file diff --git a/Lab2/picture.docx b/Lab2/picture.docx new file mode 100644 index 00000000..1dee1308 Binary files /dev/null and b/Lab2/picture.docx differ