From 955977b516cb92c5b3520a4255e48e8b80c94dd3 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 20 Mar 2015 09:22:02 +0100 Subject: [PATCH] hw: syscall for changing a threads physical quota This commit also extends the "cpu_scheduler" test to test the back-end of the new syscall. Ref #1464 --- .../src/core/include/kernel/core_interface.h | 15 +- repos/base-hw/src/core/include/kernel/cpu.h | 5 + .../src/core/include/kernel/cpu_scheduler.h | 107 ++++-- .../base-hw/src/core/include/kernel/thread.h | 1 + repos/base-hw/src/core/kernel/cpu.cc | 7 + repos/base-hw/src/core/kernel/thread.cc | 9 + .../src/test/cpu_scheduler/kernel/test.cc | 357 +++++++++++------- 7 files changed, 329 insertions(+), 172 deletions(-) diff --git a/repos/base-hw/src/core/include/kernel/core_interface.h b/repos/base-hw/src/core/include/kernel/core_interface.h index 9104918503..4f49cea583 100644 --- a/repos/base-hw/src/core/include/kernel/core_interface.h +++ b/repos/base-hw/src/core/include/kernel/core_interface.h @@ -57,6 +57,7 @@ namespace Kernel constexpr Call_arg call_id_delete_vm() { return 31; } constexpr Call_arg call_id_new_irq() { return 32; } constexpr Call_arg call_id_delete_irq() { return 33; } + constexpr Call_arg call_id_thread_quota() { return 34; } /** * Create a domain @@ -103,7 +104,7 @@ namespace Kernel * * \param p memory donation for the new kernel thread object * \param priority scheduling priority of the new thread - * \param quota CPU-time quota of the new thread in milliseconds + * \param quota CPU quota of the new thread * \param label debugging label of the new thread * * \retval >0 kernel name of the new thread @@ -117,6 +118,18 @@ namespace Kernel } + /** + * Configure the CPU quota of a thread + * + * \param thread kernel object of the targeted thread + * \param quota new CPU quota value + */ + inline void thread_quota(Kernel::Thread * const thread, size_t const quota) + { + call(call_id_thread_quota(), (Call_arg)thread, (Call_arg)quota); + } + + /** * Pause execution of a specific thread * diff --git a/repos/base-hw/src/core/include/kernel/cpu.h b/repos/base-hw/src/core/include/kernel/cpu.h index 5a69458144..b54072be8c 100644 --- a/repos/base-hw/src/core/include/kernel/cpu.h +++ b/repos/base-hw/src/core/include/kernel/cpu.h @@ -190,6 +190,11 @@ class Kernel::Cpu_job : public Cpu_share */ void affinity(Cpu * const cpu); + /** + * Set CPU quota of the job to 'q' + */ + void quota(unsigned const q); + /** * Return wether our CPU-share is currently active */ diff --git a/repos/base-hw/src/core/include/kernel/cpu_scheduler.h b/repos/base-hw/src/core/include/kernel/cpu_scheduler.h index c93c8dd4f1..976221965a 100644 --- a/repos/base-hw/src/core/include/kernel/cpu_scheduler.h +++ b/repos/base-hw/src/core/include/kernel/cpu_scheduler.h @@ -83,11 +83,11 @@ class Kernel::Cpu_share : public Cpu_claim, public Cpu_fill private: - signed const _prio; - unsigned const _quota; - unsigned _claim; - unsigned _fill; - bool _ready; + signed const _prio; + unsigned _quota; + unsigned _claim; + unsigned _fill; + bool _ready; public: @@ -105,6 +105,7 @@ class Kernel::Cpu_share : public Cpu_claim, public Cpu_fill */ bool ready() const { return _ready; } + void quota(unsigned const q) { _quota = q; } }; class Kernel::Cpu_scheduler @@ -125,11 +126,12 @@ class Kernel::Cpu_scheduler Share * _head; unsigned _head_quota; bool _head_claims; + bool _head_yields; unsigned const _quota; unsigned _residual; unsigned const _fill; - template void _for_prios(F f) { + template void _for_each_prio(F f) { for (signed p = Prio::max; p > Prio::min - 1; p--) { f(p); } } template @@ -144,16 +146,21 @@ class Kernel::Cpu_scheduler _ucl[p].for_each([&] (Claim * const c) { _reset(c); }); } + void _next_round() + { + _residual = _quota; + _for_each_prio([&] (unsigned const p) { _reset_claims(p); }); + } + void _consumed(unsigned const q) { - if (_residual -= q) { return; } - _residual = _quota; - _for_prios([&] (unsigned const p) { _reset_claims(p); }); + if (_residual > q) { _residual -= q; } + else { _next_round(); } } void _set_head(Share * const s, unsigned const q, bool const c) { - _head_quota = Genode::min(q, _residual); + _head_quota = q; _head_claims = c; _head = s; } @@ -164,17 +171,18 @@ class Kernel::Cpu_scheduler _fills.head_to_tail(); } - void _head_claimed(unsigned const q) + void _head_claimed(unsigned const r) { - if (_head->_claim) { _head->_claim -= q; } + if (!_head->_quota) { return; } + _head->_claim = r > _head->_quota ? _head->_quota : r; if (_head->_claim || !_head->_ready) { return; } _rcl[_head->_prio].to_tail(_head); } - void _head_filled(unsigned const q) + void _head_filled(unsigned const r) { if (_fills.head() != _head) { return; } - if (q < _head->_fill) { _head->_fill -= q; } + if (r) { _head->_fill = r; } else { _next_fill(); } } @@ -198,6 +206,41 @@ class Kernel::Cpu_scheduler return 1; } + unsigned _trim_consumption(unsigned & q) + { + q = Genode::min(Genode::min(q, _head_quota), _residual); + if (!_head_yields) { return _head_quota - q; } + _head_yields = 0; + return 0; + } + + /** + * Fill 's' becomes a claim due to a quota donation + */ + void _quota_introduction(Share * const s) + { + if (s->_ready) { _rcl[s->_prio].insert_tail(s); } + else { _ucl[s->_prio].insert_tail(s); } + } + + /** + * Claim 's' looses its state as claim due to quota revokation + */ + void _quota_revokation(Share * const s) + { + if (s->_ready) { _rcl[s->_prio].remove(s); } + else { _ucl[s->_prio].remove(s); } + } + + /** + * The quota of claim 's' changes to 'q' + */ + void _quota_adaption(Share * const s, unsigned const q) + { + if (q) { if (s->_claim > q) { s->_claim = q; } } + else { _quota_revokation(s); } + } + public: /** @@ -209,16 +252,17 @@ class Kernel::Cpu_scheduler * \param f time-slice length of the fill round-robin */ Cpu_scheduler(Share * const i, unsigned const q, unsigned const f) - : _idle(i), _quota(q), _residual(q), _fill(f) { _set_head(i, f, 0); } + : _idle(i), _head_yields(0), _quota(q), _residual(q), _fill(f) + { _set_head(i, f, 0); } /** * Update head according to the consumption of quota 'q' */ void update(unsigned q) { - q = Genode::min(Genode::min(q, _head_quota), _residual); - if (_head_claims) { _head_claimed(q); } - else { _head_filled(q); } + unsigned const r = _trim_consumption(q); + if (_head_claims) { _head_claimed(r); } + else { _head_filled(r); } _consumed(q); if (_claim_for_head()) { return; } if (_fill_for_head()) { return; } @@ -268,16 +312,9 @@ class Kernel::Cpu_scheduler } /** - * As far as possible current head won't be re-choosen for max. a round + * Current head looses its current claim/fill for this round */ - void yield() - { - assert(_head != _idle); - if (_head->_claim) { _head->_claim = 0; } - if (_head != _fills.head()) { return; } - _share(_fills.head())->_fill = _fill; - _fills.head_to_tail(); - } + void yield() { _head_yields = 1; } /** * Remove share 's' from scheduler @@ -302,12 +339,26 @@ class Kernel::Cpu_scheduler _ucl[s->_prio].insert_head(s); } + /** + * Set quota of share 's' to 'q' + */ + void quota(Share * const s, unsigned const q) + { + assert(s != _idle); + if (s->_quota) { _quota_adaption(s, q); } + else if (q) { _quota_introduction(s); } + s->_quota = q; + } + /* * Accessors */ Share * head() const { return _head; } - unsigned head_quota() const { return _head_quota; } + unsigned head_quota() const { + return Genode::min(_head_quota, _residual); } + unsigned quota() const { return _quota; } + unsigned residual() const { return _residual; } }; #endif /* _KERNEL__CPU_SCHEDULER_H_ */ diff --git a/repos/base-hw/src/core/include/kernel/thread.h b/repos/base-hw/src/core/include/kernel/thread.h index 1c59a5ca5d..707393a9c4 100644 --- a/repos/base-hw/src/core/include/kernel/thread.h +++ b/repos/base-hw/src/core/include/kernel/thread.h @@ -208,6 +208,7 @@ class Kernel::Thread void _call_new_pd(); void _call_delete_pd(); void _call_new_thread(); + void _call_thread_quota(); void _call_delete_thread(); void _call_start_thread(); void _call_pause_current_thread(); diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index ba15f963b8..009ed57c86 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -114,6 +114,13 @@ void Cpu_job::affinity(Cpu * const cpu) } +void Cpu_job::quota(unsigned const q) +{ + if (_cpu) { _cpu->scheduler()->quota(this, q); } + else { Cpu_share::quota(q); } +} + + /************** ** Cpu_idle ** **************/ diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc index e545fb3582..1bbe6f4de1 100644 --- a/repos/base-hw/src/core/kernel/thread.cc +++ b/repos/base-hw/src/core/kernel/thread.cc @@ -236,6 +236,14 @@ void Thread::_call_new_thread() } +void Thread::_call_thread_quota() +{ + Thread * const thread = (Thread *)user_arg_1(); + unsigned const quota = cpu_pool()->timer()->ms_to_tics(user_arg_2()); + thread->Cpu_job::quota(quota); +} + + void Thread::_call_delete_thread() { reinterpret_cast(user_arg_1())->~Thread(); } @@ -757,6 +765,7 @@ void Thread::_call() /* switch over kernel calls that are restricted to core */ switch (call_id) { case call_id_new_thread(): _call_new_thread(); return; + case call_id_thread_quota(): _call_thread_quota(); return; case call_id_delete_thread(): _call_delete_thread(); return; case call_id_start_thread(): _call_start_thread(); return; case call_id_resume_thread(): _call_resume_thread(); return; diff --git a/repos/base-hw/src/test/cpu_scheduler/kernel/test.cc b/repos/base-hw/src/test/cpu_scheduler/kernel/test.cc index 56b56ef411..bd668d2e1e 100644 --- a/repos/base-hw/src/test/cpu_scheduler/kernel/test.cc +++ b/repos/base-hw/src/test/cpu_scheduler/kernel/test.cc @@ -21,8 +21,8 @@ using Genode::size_t; using Genode::addr_t; -using Kernel::Cpu_scheduler; using Kernel::Cpu_share; +using Kernel::Cpu_scheduler; namespace Kernel { void test(); } @@ -74,10 +74,10 @@ void create(unsigned const id) case 3: new (p) Cpu_share(3, 110); break; case 4: new (p) Cpu_share(1, 90); break; case 5: new (p) Cpu_share(3, 120); break; - case 6: new (p) Cpu_share(0, 0); break; + case 6: new (p) Cpu_share(3, 0); break; case 7: new (p) Cpu_share(2, 180); break; case 8: new (p) Cpu_share(2, 100); break; - case 9: new (p) Cpu_share(0, 0); break; + case 9: new (p) Cpu_share(2, 0); break; default: return; } data()->scheduler.insert(s); @@ -90,10 +90,21 @@ void destroy(unsigned const id) s->~Cpu_share(); } -void update_check(unsigned const l, unsigned const c, +unsigned time() +{ + return data()->scheduler.quota() - + data()->scheduler.residual(); +} + +void update_check(unsigned const l, unsigned const c, unsigned const t, unsigned const s, unsigned const q) { data()->scheduler.update(c); + unsigned const st = time(); + if (t != st) { + Genode::printf("[test] wrong time %u in line %u\n", st, l); + done(); + } Cpu_share * const hs = data()->scheduler.head(); unsigned const hq = data()->scheduler.head_quota(); if (hs != share(s)) { @@ -126,7 +137,8 @@ void ready_check(unsigned const l, unsigned const s, bool const x) #define A(s) data()->scheduler.ready(share(s)); #define I(s) data()->scheduler.unready(share(s)); #define Y data()->scheduler.yield(); -#define U(c, s, q) update_check(__LINE__, c, s, q); +#define Q(s, q) data()->scheduler.quota(share(s), q); +#define U(c, t, s, q) update_check(__LINE__, c, t, s, q); #define O(s) ready_check(__LINE__, s, true); #define N(s) ready_check(__LINE__, s, false); @@ -154,14 +166,15 @@ void Kernel::test() * N(s) do 'A(s)' and check that this won't outdate the head * Y annotate that the current head wants to yield * - * U(c,s,q) First update the head and time of the scheduler according to - * the new schedule and the fact that the head consumed a - * quantum of 'c'. Then check if the new head is the context - * with ID 's' that has a quota of 'q'. + * U(c,t,s,q) + * First update the head and time of the scheduler according to + * the new schedule and the fact that the head consumed a + * quantum of 'c'. Then, check the consumed time 't' for the + * actual round and if the new head is the context with ID 's' + * that has a quota of 'q'. * * doc Documents the expected schedule for the point after the head - * update in the corresponding line. First it shows the time left for - * the actual round followd by a comma. Then it lists all claims + * update in the corresponding line. First it lists all claims * via their ID followed by a ' (active) or a ° (inactive) and the * corresponding quota. So 5°120 is the inactive context 5 that * has a quota of 120 left for the current round. They are sorted @@ -181,148 +194,206 @@ void Kernel::test() */ /* first round - idle */ - U( 10, 0, 100) /* 0, - */ - U( 90, 0, 100) /* 10, - */ - U(120, 0, 100) /* 100, - */ - U(130, 0, 100) /* 200, - */ - U(140, 0, 100) /* 300, - */ - U(150, 0, 100) /* 400, - */ - U(160, 0, 100) /* 500, - */ - U(170, 0, 100) /* 600, - */ - U(180, 0, 100) /* 700, - */ - U(190, 0, 100) /* 800, - */ - U(200, 0, 100) /* 900, - */ + U( 10, 10, 0, 100) /* - */ + U( 90, 100, 0, 100) /* - */ + U(120, 200, 0, 100) /* - */ + U(130, 300, 0, 100) /* - */ + U(140, 400, 0, 100) /* - */ + U(150, 500, 0, 100) /* - */ + U(160, 600, 0, 100) /* - */ + U(170, 700, 0, 100) /* - */ + U(180, 800, 0, 100) /* - */ + U(190, 900, 0, 100) /* - */ + U(200, 0, 0, 100) /* - */ /* second round - one claim, one filler */ - C(1) U(111, 0, 100) /* 0, 1°230 - */ - A(1) U(123, 1, 230) /* 100, 1'230 - 1'100 */ - I(1) U(200, 0, 100) /* 200, 1°30 - */ - A(1) U( 10, 1, 30) /* 400, 1'30 - 1'100 */ - U(100, 1, 100) /* 410, 1'0 - 1'100 */ - U(200, 1, 100) /* 440, 1'0 - 1'100 */ - I(1) U(200, 0, 100) /* 540, 1°0 - */ - U(200, 0, 100) /* 640, 1°0 - */ - A(1) U( 10, 1, 100) /* 740, 1'0 - 1'100 */ - U( 50, 1, 50) /* 750, 1'0 - 1'50 */ - U( 20, 1, 30) /* 800, 1'0 - 1'30 */ - U(100, 1, 100) /* 820, 1'0 - 1'100 */ - U(200, 1, 50) /* 850, 1'0 - 1'100 */ - U(200, 1, 230) /* 950, 1'230 - 1'100 */ + C(1) U(111, 100, 0, 100) /* 1°230 - */ + A(1) U(123, 200, 1, 230) /* 1'230 - 1'100 */ + I(1) U(200, 400, 0, 100) /* 1°30 - */ + A(1) U( 10, 410, 1, 30) /* 1'30 - 1'100 */ + U(100, 440, 1, 100) /* 1'0 - 1'100 */ + U(200, 540, 1, 100) /* 1'0 - 1'100 */ + I(1) U(200, 640, 0, 100) /* 1°0 - */ + U(200, 740, 0, 100) /* 1°0 - */ + A(1) U( 10, 750, 1, 100) /* 1'0 - 1'100 */ + U( 50, 800, 1, 50) /* 1'0 - 1'50 */ + U( 20, 820, 1, 30) /* 1'0 - 1'30 */ + U(100, 850, 1, 100) /* 1'0 - 1'100 */ + U(200, 950, 1, 50) /* 1'0 - 1'100 */ + U(200, 0, 1, 230) /* 1'230 - 1'100 */ /* third round - one claim per priority */ - C(2) A(2) U( 50, 1, 180) /* 0, 1'180 - 2'170 - 1'100 2 */ - I(1) U( 70, 2, 170) /* 50, 1°110 - 2'170 - 2'100 */ - A(1) I(2) U(110, 1, 110) /* 120, 1'110 - 2°60 - 1'100 */ - U( 90, 1, 20) /* 230, 1'20 - 2°60 - 1'100 */ - A(2) I(1) U( 10, 2, 60) /* 320, 1°10 - 2'60 - 2'100 */ - C(3) U( 40, 2, 20) /* 330, 3°110 - 1°10 - 2'10 - 2'100 */ - A(3) U( 10, 3, 110) /* 370, 3'110 - 1°10 - 2'10 - 2'100 3 */ - U(150, 2, 10) /* 380, 3'0 - 1°10 - 2'10 - 2'100 3 */ - U( 10, 2, 100) /* 490, 3'0 - 1°10 - 2'0 - 2'100 3 */ - U( 60, 2, 40) /* 500, 3'0 - 1°10 - 2'0 - 2'40 3 */ - C(4) U( 60, 3, 100) /* 560, 3'0 - 1°10 - 4°90 - 2'0 - 3'100 2 */ - C(6) A(6) U(120, 2, 100) /* 600, 3'0 - 1°10 - 4°90 - 2'0 - 2'100 6 3*/ - A(4) U( 80, 4, 90) /* 700, 3'0 - 1°10 - 4'90 - 2'0 - 2'20 6 3 4 */ - I(4) A(1) U( 50, 1, 10) /* 780, 3'0 - 1'10 - 4°40 - 2'0 - 2'20 6 3 1 */ - U( 50, 2, 20) /* 830, 3'0 - 1'0 - 4°40 - 2'0 - 2'20 6 3 1 */ - U( 50, 6, 100) /* 840, 3'0 - 1'0 - 4°40 - 2'0 - 6'100 3 1 2 */ - U(100, 3, 40) /* 860, 3'0 - 1'0 - 4°40 - 2'0 - 3'100 1 2 6 */ - U( 60, 3, 110) /* 960, 3'110 - 1'230 - 4°40 - 2'170 - 3'60 1 2 6 */ + C(2) A(2) U( 50, 50, 1, 180) /* 1'180 - 2'170 - 1'100 2 */ + I(1) U( 70, 120, 2, 170) /* 1°110 - 2'170 - 2'100 */ + A(1) I(2) U(110, 230, 1, 110) /* 1'110 - 2°60 - 1'100 */ + U( 90, 320, 1, 20) /* 1'20 - 2°60 - 1'100 */ + A(2) I(1) U( 10, 330, 2, 60) /* 1°10 - 2'60 - 2'100 */ + C(3) U( 40, 370, 2, 20) /* 3°110 - 1°10 - 2'10 - 2'100 */ + A(3) U( 10, 380, 3, 110) /* 3'110 - 1°10 - 2'10 - 2'100 3 */ + U(150, 490, 2, 10) /* 3'0 - 1°10 - 2'10 - 2'100 3 */ + U( 10, 500, 2, 100) /* 3'0 - 1°10 - 2'0 - 2'100 3 */ + U( 60, 560, 2, 40) /* 3'0 - 1°10 - 2'0 - 2'40 3 */ + C(4) U( 60, 600, 3, 100) /* 3'0 - 1°10 - 4°90 - 2'0 - 3'100 2 */ + C(6) A(6) U(120, 700, 2, 100) /* 3'0 - 1°10 - 4°90 - 2'0 - 2'100 6 3*/ + A(4) U( 80, 780, 4, 90) /* 3'0 - 1°10 - 4'90 - 2'0 - 2'20 6 3 4 */ + I(4) A(1) U( 50, 830, 1, 10) /* 3'0 - 1'10 - 4°40 - 2'0 - 2'20 6 3 1 */ + U( 50, 840, 2, 20) /* 3'0 - 1'0 - 4°40 - 2'0 - 2'20 6 3 1 */ + U( 50, 860, 6, 100) /* 3'0 - 1'0 - 4°40 - 2'0 - 6'100 3 1 2 */ + U(100, 960, 3, 40) /* 3'0 - 1'0 - 4°40 - 2'0 - 3'100 1 2 6 */ + U( 60, 0, 3, 110) /* 3'110 - 1'230 - 4°40 - 2'170 - 3'60 1 2 6 */ /* fourth round - multiple claims per priority */ - C(5) U( 60, 3, 50) /* 0, 3'50 5°120 - 1'230 - 4°90 - 2'170 - 3'60 1 2 6 */ - A(4) I(3) U( 40, 1, 230) /* 60, 3°10 5°120 - 1'230 - 4'90 - 2'170 - 1'100 2 6 4 */ - C(7) A(7) U(200, 7, 180) /* 100, 3°10 5°120 - 7'180 1'30 - 4'90 - 2'170 - 1'100 2 6 4 7 */ - C(8) A(5) U(100, 5, 120) /* 300, 5'120 3°10 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 */ - A(3) U(100, 3, 10) /* 400, 3'10 5'20 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 */ - U( 30, 5, 20) /* 500, 5'20 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 */ - C(9) A(9) U( 10, 5, 10) /* 510, 5'10 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 9 */ - U( 50, 7, 80) /* 520, 5'0 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 9 */ - A(8) I(7) U( 10, 8, 100) /* 530, 5'0 3'0 - 8'100 1'30 7°70 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 8 */ - I(8) U( 80, 1, 30) /* 540, 5'0 3'0 - 1'30 7°70 8°20 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 */ - U(200, 4, 90) /* 620, 5'0 3'0 - 1'0 7°70 8°20 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 */ - U(100, 2, 170) /* 650, 5'0 3'0 - 1'0 7°70 8°20 - 4'0 - 2'170 - 1'100 2 6 4 5 3 9 */ - A(8) A(7) U( 10, 7, 70) /* 740, 5'0 3'0 - 7'70 8'20 1'0 - 4'0 - 2'160 - 1'100 2 6 4 5 3 9 8 7 */ - I(7) I(3) U( 10, 8, 20) /* 750, 5'0 3°0 - 8'20 1'0 7°60 - 4'0 - 2'160 - 1'100 2 6 4 5 9 8 */ - I(8) U( 10, 2, 160) /* 760, 5'0 3°0 - 1'0 7°60 8°10 - 4'0 - 2'160 - 1'100 2 6 4 5 9 */ - I(2) U( 40, 1, 100) /* 770, 5'0 3°0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 1'100 6 4 5 9 */ - A(3) U( 30, 1, 70) /* 810, 5'0 3'0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 1'100 6 4 5 9 3 */ - U( 80, 6, 90) /* 840, 5'0 3'0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 6'100 4 5 9 3 1 */ - A(7) A(8) U( 10, 8, 10) /* 910, 5'0 3'0 - 8'10 7'60 1'0 - 4'0 - 2°120 - 6'90 4 5 9 3 1 7 8 */ - U( 30, 7, 60) /* 920, 5'0 3'0 - 7'60 1'0 8'0 - 4°0 - 2°120 - 6'90 4 5 9 3 1 7 8 */ - A(2) I(7) U( 10, 2, 60) /* 930, 5'0 3'0 - 1'0 8'0 7°50 - 4'0 - 2'120 - 6'90 4 5 9 3 1 8 2 */ - I(3) I(5) U( 40, 2, 20) /* 940, 5°0 3°0 - 1'0 8'0 7°50 - 4'0 - 2'80 - 6'90 4 9 1 8 2 */ - I(9) I(4) U( 10, 2, 10) /* 980, 5°0 3°0 - 1'0 8'0 7°50 - 4°0 - 2'70 - 6'90 1 8 2 */ - U( 40, 1, 230) /* 990, 5°120 3°110 - 1'230 8'100 7°180 - 4°90 - 2'170 - 6'90 1 8 2 */ + C(5) U( 60, 60, 3, 50) /* 3'50 5°120 - 1'230 - 4°90 - 2'170 - 3'60 1 2 6 */ + A(4) I(3) U( 40, 100, 1, 230) /* 3°10 5°120 - 1'230 - 4'90 - 2'170 - 1'100 2 6 4 */ + C(7) A(7) U(200, 300, 7, 180) /* 3°10 5°120 - 7'180 1'30 - 4'90 - 2'170 - 1'100 2 6 4 7 */ + C(8) A(5) U(100, 400, 5, 120) /* 5'120 3°10 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 */ + A(3) U(100, 500, 3, 10) /* 3'10 5'20 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 */ + U( 30, 510, 5, 20) /* 5'20 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 */ + C(9) A(9) U( 10, 520, 5, 10) /* 5'10 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 9 */ + U( 50, 530, 7, 80) /* 5'0 3'0 - 7'80 1'30 8°100 - 4'90 - 2'170 - 1'100 2 6 4 7 5 3 9 */ + A(8) I(7) U( 10, 540, 8, 100) /* 5'0 3'0 - 8'100 1'30 7°70 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 8 */ + I(8) U( 80, 620, 1, 30) /* 5'0 3'0 - 1'30 7°70 8°20 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 */ + U(200, 650, 4, 90) /* 5'0 3'0 - 1'0 7°70 8°20 - 4'90 - 2'170 - 1'100 2 6 4 5 3 9 */ + U(100, 740, 2, 170) /* 5'0 3'0 - 1'0 7°70 8°20 - 4'0 - 2'170 - 1'100 2 6 4 5 3 9 */ + A(8) A(7) U( 10, 750, 7, 70) /* 5'0 3'0 - 7'70 8'20 1'0 - 4'0 - 2'160 - 1'100 2 6 4 5 3 9 8 7 */ + I(7) I(3) U( 10, 760, 8, 20) /* 5'0 3°0 - 8'20 1'0 7°60 - 4'0 - 2'160 - 1'100 2 6 4 5 9 8 */ + I(8) U( 10, 770, 2, 160) /* 5'0 3°0 - 1'0 7°60 8°10 - 4'0 - 2'160 - 1'100 2 6 4 5 9 */ + I(2) U( 40, 810, 1, 100) /* 5'0 3°0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 1'100 6 4 5 9 */ + A(3) U( 30, 840, 1, 70) /* 5'0 3'0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 1'100 6 4 5 9 3 */ + U( 80, 910, 6, 90) /* 5'0 3'0 - 1'0 7°60 8°10 - 4'0 - 2°120 - 6'100 4 5 9 3 1 */ + A(7) A(8) U( 10, 920, 8, 10) /* 5'0 3'0 - 8'10 7'60 1'0 - 4'0 - 2°120 - 6'90 4 5 9 3 1 7 8 */ + U( 30, 930, 7, 60) /* 5'0 3'0 - 7'60 1'0 8'0 - 4°0 - 2°120 - 6'90 4 5 9 3 1 7 8 */ + A(2) I(7) U( 10, 940, 2, 60) /* 5'0 3'0 - 1'0 8'0 7°50 - 4'0 - 2'120 - 6'90 4 5 9 3 1 8 2 */ + I(3) I(5) U( 40, 980, 2, 20) /* 5°0 3°0 - 1'0 8'0 7°50 - 4'0 - 2'80 - 6'90 4 9 1 8 2 */ + I(9) I(4) U( 10, 990, 2, 10) /* 5°0 3°0 - 1'0 8'0 7°50 - 4°0 - 2'70 - 6'90 1 8 2 */ + U( 40, 0, 1, 230) /* 5°120 3°110 - 1'230 8'100 7°180 - 4°90 - 2'170 - 6'90 1 8 2 */ /* fifth round - yield, ready & check*/ - I(6) U( 30, 1, 200) /* 0, 5°120 3°110 - 1'200 8'100 7°180 - 4°90 - 2'170 - 1'100 8 2 */ - Y U( 20, 8, 100) /* 30, 5°120 3°110 - 8'100 1'0 7°180 - 4°90 - 2'170 - 8'100 2 1 */ - U(200, 2, 170) /* 50, 5°120 3°110 - 1'0 8'0 7°180 - 4°90 - 2'170 - 8'100 2 1 */ - Y U( 70, 8, 100) /* 150, 5°120 3°110 - 1'0 8'0 7°180 - 4°90 - 2'0 - 8'100 2 1 */ - I(8) U( 40, 2, 100) /* 220, 5°120 3°110 - 1'0 7°180 8°0 - 4°90 - 2'0 - 2'100 1 */ - I(1) U( 50, 2, 50) /* 260, 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'50 */ - U( 10, 2, 40) /* 310, 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'40 */ - N(1) U(200, 1, 100) /* 320, 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 1'100 2 */ - U( 10, 1, 90) /* 360, 5°120 3°110 - 1'0 7°180 8°0 - 4°90 - 2'0 - 1'90 2 */ - I(1) U( 10, 2, 100) /* 370, 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'100 */ - O(5) U( 10, 5, 120) /* 380, 5'120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'90 5 */ - Y U( 90, 2, 90) /* 390, 5'0 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'90 5 */ - Y U( 10, 5, 100) /* 480, 5'0 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 5'100 2 */ - O(7) U( 10, 7, 180) /* 490, 5'0 3°110 - 7'180 1°0 8°0 - 4°90 - 2'0 - 5'90 2 7 */ - Y U( 10, 5, 90) /* 500, 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 5'90 2 7 */ - Y U( 10, 2, 100) /* 510, 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 2'100 7 5 */ - Y U( 10, 7, 100) /* 520, 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 7'100 5 2 */ - I(5) U( 10, 7, 90) /* 530, 5°0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 7'90 2 */ - I(7) N(5) U( 10, 2, 100) /* 540, 5'0 3°110 - 7°0 1°0 8°0 - 4°90 - 2'0 - 2'100 5 */ - N(7) U(200, 5, 100) /* 550, 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 5'100 7 2 */ - I(5) I(7) U( 10, 2, 100) /* 650, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2'0 - 2'100 */ - I(2) U( 10, 0, 100) /* 660, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ - U( 10, 0, 100) /* 670, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ - U(100, 0, 100) /* 680, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ - O(9) U( 10, 9, 100) /* 780, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - 9'100 */ - N(6) U( 20, 9, 80) /* 790, 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - 9'80 6 */ - N(8) U( 10, 9, 70) /* 810, 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 9'70 6 8 */ - Y U( 10, 6, 100) /* 820, 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 6'100 8 9 */ - Y U( 10, 8, 100) /* 830, 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 8'100 9 6 */ - N(7) Y U( 20, 9, 100) /* 840, 5°0 3°110 - 8'0 7'0 1°0 - 4°90 - 2°0 - 9'100 6 7 8 */ - I(8) I(9) U( 10, 6, 100) /* 860, 5°0 3°110 - 7'0 8°0 1°0 - 4°90 - 2°0 - 6'100 7 */ - I(6) I(7) U( 10, 0, 100) /* 870, 5°0 3°110 - 7°0 8°0 1°0 - 4°90 - 2°0 - */ - O(4) U( 20, 4, 90) /* 880, 5°0 3°110 - 7°0 8°0 1°0 - 4'90 - 2°0 - 4'100 */ - O(3) N(1) U( 10, 3, 90) /* 900, 3'110 5°0 - 1'0 7°0 8°0 - 4'80 - 2°0 - 4'100 3 1 */ - N(5) I(4) U( 10, 3, 80) /* 910, 3'100 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 3 1 5 */ - I(3) U( 10, 1, 70) /* 920, 5'0 3°90 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'100 5 */ - O(3) U( 10, 3, 60) /* 930, 3'90 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'90 5 3 */ - N(4) U( 10, 3, 50) /* 940, 3'80 5'0 - 1'0 7°0 8°0 - 4'80 - 2°0 - 1'90 5 3 4 */ - I(4) U( 10, 3, 40) /* 950, 3'70 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'90 5 3 */ - I(3) N(4) U( 10, 4, 30) /* 960, 5'0 3°60 - 1'0 7°0 8°0 - 4'80 - 2°0 - 1'90 5 4 */ - I(4) U( 10, 1, 20) /* 970, 5'0 3°60 - 1'0 7°0 8°0 - 4°70 - 2°0 - 1'90 5 */ - O(3) O(4) U( 10, 3, 10) /* 980, 3'60 5'0 - 1'0 7°0 8°0 - 4'70 - 2°0 - 1'80 5 3 4 */ - Y U( 10, 5, 120) /* 990, 5'120 3'110 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 5 3 4 */ + I(6) U( 30, 30, 1, 200) /* 5°120 3°110 - 1'200 8'100 7°180 - 4°90 - 2'170 - 1'100 8 2 */ + Y U( 20, 50, 8, 100) /* 5°120 3°110 - 8'100 1'0 7°180 - 4°90 - 2'170 - 1'100 8 2 */ + U(200, 150, 2, 170) /* 5°120 3°110 - 1'0 8'0 7°180 - 4°90 - 2'170 - 1'100 8 2 */ + Y U( 70, 220, 1, 100) /* 5°120 3°110 - 1'0 8'0 7°180 - 4°90 - 2'0 - 1'100 8 2 */ + I(8) Y U( 40, 260, 2, 100) /* 5°120 3°110 - 1'0 7°180 8°0 - 4°90 - 2'0 - 2'100 1 */ + I(1) U( 50, 310, 2, 50) /* 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'50 */ + U( 10, 320, 2, 40) /* 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'40 */ + N(1) U(200, 360, 1, 100) /* 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 1'100 2 */ + U( 10, 370, 1, 90) /* 5°120 3°110 - 1'0 7°180 8°0 - 4°90 - 2'0 - 1'90 2 */ + I(1) U( 10, 380, 2, 100) /* 5°120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'100 */ + O(5) U( 10, 390, 5, 120) /* 5'120 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'90 5 */ + Y U( 90, 480, 2, 90) /* 5'0 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 2'90 5 */ + Y U( 10, 490, 5, 100) /* 5'0 3°110 - 1°0 7°180 8°0 - 4°90 - 2'0 - 5'100 2 */ + O(7) U( 10, 500, 7, 180) /* 5'0 3°110 - 7'180 1°0 8°0 - 4°90 - 2'0 - 5'90 2 7 */ + Y U( 10, 510, 5, 90) /* 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 5'90 2 7 */ + Y U( 10, 520, 2, 100) /* 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 2'100 7 5 */ + Y U( 10, 530, 7, 100) /* 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 7'100 5 2 */ + I(5) U( 10, 540, 7, 90) /* 5°0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 7'90 2 */ + I(7) N(5) U( 10, 550, 2, 100) /* 5'0 3°110 - 7°0 1°0 8°0 - 4°90 - 2'0 - 2'100 5 */ + N(7) U(200, 650, 5, 100) /* 5'0 3°110 - 7'0 1°0 8°0 - 4°90 - 2'0 - 5'100 7 2 */ + I(5) I(7) U( 10, 660, 2, 100) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2'0 - 2'100 */ + I(2) U( 10, 670, 0, 100) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ + U( 10, 680, 0, 100) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ + U(100, 780, 0, 100) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - */ + O(9) U( 10, 790, 9, 100) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - 9'100 */ + N(6) U( 20, 810, 9, 80) /* 5°0 3°110 - 7°0 1°0 8°0 - 4°90 - 2°0 - 9'80 6 */ + N(8) U( 10, 820, 9, 70) /* 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 9'70 6 8 */ + Y U( 10, 830, 6, 100) /* 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 6'100 8 9 */ + Y U( 10, 840, 8, 100) /* 5°0 3°110 - 8'0 7°0 1°0 - 4°90 - 2°0 - 8'100 9 6 */ + N(7) Y U( 20, 860, 9, 100) /* 5°0 3°110 - 8'0 7'0 1°0 - 4°90 - 2°0 - 9'100 6 7 8 */ + I(8) I(9) U( 10, 870, 6, 100) /* 5°0 3°110 - 7'0 8°0 1°0 - 4°90 - 2°0 - 6'100 7 */ + I(6) I(7) U( 10, 880, 0, 100) /* 5°0 3°110 - 7°0 8°0 1°0 - 4°90 - 2°0 - */ + O(4) U( 20, 900, 4, 90) /* 5°0 3°110 - 7°0 8°0 1°0 - 4'90 - 2°0 - 4'100 */ + O(3) N(1) U( 10, 910, 3, 90) /* 3'110 5°0 - 1'0 7°0 8°0 - 4'80 - 2°0 - 4'100 3 1 */ + N(5) I(4) U( 10, 920, 3, 80) /* 3'100 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 3 1 5 */ + I(3) U( 10, 930, 1, 70) /* 5'0 3°90 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'100 5 */ + O(3) U( 10, 940, 3, 60) /* 3'90 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'90 5 3 */ + N(4) U( 10, 950, 3, 50) /* 3'80 5'0 - 1'0 7°0 8°0 - 4'80 - 2°0 - 1'90 5 3 4 */ + I(4) U( 10, 960, 3, 40) /* 3'70 5'0 - 1'0 7°0 8°0 - 4°80 - 2°0 - 1'90 5 3 */ + I(3) N(4) U( 10, 970, 4, 30) /* 5'0 3°60 - 1'0 7°0 8°0 - 4'80 - 2°0 - 1'90 5 4 */ + I(4) U( 10, 980, 1, 20) /* 5'0 3°60 - 1'0 7°0 8°0 - 4°70 - 2°0 - 1'90 5 */ + O(3) O(4) U( 10, 990, 3, 10) /* 3'60 5'0 - 1'0 7°0 8°0 - 4'70 - 2°0 - 1'80 5 3 4 */ + Y U( 10, 0, 5, 120) /* 5'120 3'110 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 5 3 4 */ /* sixth round - destroy and re-create */ - D(3) U( 30, 5, 90) /* 0, 5'90 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 5 4 */ - I(5) U( 30, 1, 230) /* 30, 5°60 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 4 */ - D(4) D(7) U( 20, 1, 210) /* 60, 5°60 - 1'210 8°100 - 2°170 - 1'80 4 */ - I(1) N(9) U( 40, 9, 100) /* 80, 5°60 - 1°170 8°100 - 2°170 - 9'100 */ - A(5) O(8) U( 70, 5, 60) /* 120, 5'60 - 1°170 8'100 - 2°170 - 9'30 5 8 */ - D(8) I(5) U( 10, 9, 30) /* 190, 5°60 - 1°170 - 2°170 - 9'30 */ - N(6) C(4) U( 10, 9, 20) /* 200, 5°60 - 1°170 - 4°90 - 2°170 - 9'20 6 */ - D(5) O(4) U( 10, 4, 90) /* 210, 1°170 - 4'90 - 2°170 - 9'10 6 4 */ - U(100, 9, 10) /* 220, 1°170 - 4'0 - 2°170 - 9'10 6 4 */ - U( 10, 6, 100) /* 310, 1°170 - 4'0 - 2°170 - 6'100 4 9 */ - D(4) U(200, 9, 100) /* 320, 1°170 - 2°170 - 9'100 6 */ - C(5) A(5) U( 10, 5, 120) /* 420, 5'120 - 1°210 - 2°170 - 9'90 6 5 */ - C(4) Y U( 10, 9, 90) /* 430, 5'0 - 1°170 - 4°90 - 2°170 - 9'90 6 5 */ - O(4) Y U( 50, 4, 90) /* 440, 5'0 - 1°170 - 4'90 - 2°170 - 6'100 5 4 9 */ - D(6) Y U( 10, 5, 100) /* 490, 5'0 - 1°170 - 4'0 - 2°170 - 5'100 4 9 */ - D(9) U(200, 4, 100) /* 500, 5'0 - 1°170 - 4'0 - 2°170 - 4'100 5 */ - C(7) C(8) U(200, 5, 100) /* 600, 5'0 - 1°170 7°180 8°100 - 4'0 - 2°170 - 5'100 4 */ - O(1) O(7) U( 10, 7, 180) /* 700, 5'0 - 7'180 1'170 8°100 - 4'0 - 2°170 - 5'90 4 1 7 */ - O(8) U( 40, 8, 100) /* 710, 5'0 - 8'100 7'140 1'170 - 4'0 - 2°170 - 5'90 4 1 7 8 */ - D(7) U(200, 1, 150) /* 750, 5'0 - 1'170 8'0 - 4'0 - 2°170 - 5'90 4 1 8 */ - Y U( 60, 5, 90) /* 850, 5'0 - 8'0 1'0 - 4'0 - 2°170 - 5'90 4 1 8 */ - U(100, 5, 120) /* 910, 5'120 - 8'100 1'230 - 4'90 - 2°170 - 5'90 4 1 8 */ + D(3) U( 30, 30, 5, 90) /* 5'90 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 5 4 */ + I(5) U( 30, 60, 1, 230) /* 5°60 - 1'230 7°180 8°100 - 4'90 - 2°170 - 1'80 4 */ + D(4) D(7) U( 20, 80, 1, 210) /* 5°60 - 1'210 8°100 - 2°170 - 1'80 4 */ + I(1) N(9) U( 40, 120, 9, 100) /* 5°60 - 1°170 8°100 - 2°170 - 9'100 */ + A(5) O(8) U( 70, 190, 5, 60) /* 5'60 - 1°170 8'100 - 2°170 - 9'30 5 8 */ + D(8) I(5) U( 10, 200, 9, 30) /* 5°60 - 1°170 - 2°170 - 9'30 */ + N(6) C(4) U( 10, 210, 9, 20) /* 5°60 - 1°170 - 4°90 - 2°170 - 9'20 6 */ + D(5) O(4) U( 10, 220, 4, 90) /* 1°170 - 4'90 - 2°170 - 9'10 6 4 */ + U(100, 310, 9, 10) /* 1°170 - 4'0 - 2°170 - 9'10 6 4 */ + U( 10, 320, 6, 100) /* 1°170 - 4'0 - 2°170 - 6'100 4 9 */ + D(4) U(200, 420, 9, 100) /* 1°170 - 2°170 - 9'100 6 */ + C(5) A(5) U( 10, 430, 5, 120) /* 5'120 - 1°210 - 2°170 - 9'90 6 5 */ + C(4) Y U( 10, 440, 9, 90) /* 5'0 - 1°170 - 4°90 - 2°170 - 9'90 6 5 */ + O(4) Y U( 50, 490, 4, 90) /* 5'0 - 1°170 - 4'90 - 2°170 - 6'100 5 4 9 */ + D(6) Y U( 10, 500, 5, 100) /* 5'0 - 1°170 - 4'0 - 2°170 - 5'100 4 9 */ + D(9) U(200, 600, 4, 100) /* 5'0 - 1°170 - 4'0 - 2°170 - 4'100 5 */ + C(7) C(8) U(200, 700, 5, 100) /* 5'0 - 1°170 7°180 8°100 - 4'0 - 2°170 - 5'100 4 */ + O(1) O(7) U( 10, 710, 7, 180) /* 5'0 - 7'180 1'170 8°100 - 4'0 - 2°170 - 5'90 4 1 7 */ + O(8) U( 40, 750, 8, 100) /* 5'0 - 8'100 7'140 1'170 - 4'0 - 2°170 - 5'90 4 1 7 8 */ + D(7) U(200, 850, 1, 150) /* 5'0 - 1'170 8'0 - 4'0 - 2°170 - 5'90 4 1 8 */ + U( 50, 900, 1, 100) /* 5'0 - 1'120 8'0 - 4'0 - 2°170 - 5'90 4 1 8 */ + Y U( 60, 960, 5, 40) /* 5'0 - 8'0 1'0 - 4'0 - 2°170 - 5'90 4 1 8 */ + U(100, 0, 5, 120) /* 5'120 - 8'100 1'230 - 4'90 - 2°170 - 5'50 4 1 8 */ + + /* seventh round - re-configure quota, first part */ + Q(5, 100) C(6) U( 40, 40, 5, 80) /* 5'80 - 8'100 1'230 - 4'90 - 2°170 - 5'50 4 1 8 */ + Q(5, 70) A(6) U( 10, 50, 5, 70) /* 5'70 - 8'100 1'230 - 4'90 - 2°170 - 5'50 4 1 8 6 */ + Q(5, 40) C(9) U( 10, 60, 5, 40) /* 5'40 - 8'100 1'230 - 4'90 - 2°170 - 5'50 4 1 8 6 */ + Q(5, 0) A(9) U( 20, 80, 8, 100) /* 8'100 1'230 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + Q(8, 120) U( 30, 110, 8, 70) /* 8'70 1'230 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + Q(9, 40) U( 10, 120, 8, 60) /* 8'60 1'230 9'0 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + Q(8, 130) U( 10, 130, 8, 50) /* 8'50 1'230 9'0 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + Q(8, 50) U( 20, 150, 8, 30) /* 8'30 1'230 9'0 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + Q(6, 60) U( 10, 160, 8, 20) /* 6'0 - 8'20 1'230 9'0 - 4'90 - 2°170 - 5'50 4 1 8 6 9 */ + I(8) U( 10, 170, 1, 230) /* 6'0 - 1'230 9'0 8°10 - 4'90 - 2°170 - 5'50 4 1 6 9 */ + I(1) U(100, 270, 4, 90) /* 6'0 - 9'0 8°10 1°130 - 4'90 - 2°170 - 5'50 4 6 9 */ + U(100, 360, 5, 50) /* 6'0 - 9'0 8°10 1°130 - 4'0 - 2°170 - 5'50 4 6 9 */ + Q(1, 110) U( 10, 370, 5, 40) /* 6'0 - 9'0 8°10 1°110 - 4'0 - 2°170 - 5'40 4 6 9 */ + Q(1, 120) U( 20, 390, 5, 20) /* 6'0 - 9'0 8°10 1°110 - 4'0 - 2°170 - 5'20 4 6 9 */ + Q(4, 210) U( 10, 400, 5, 10) /* 6'0 - 9'0 8°10 1°110 - 4'0 - 2°170 - 5'10 4 6 9 */ + A(1) U( 20, 410, 1, 110) /* 6'0 - 1'110 9'0 8°10 - 4'0 - 2°170 - 4'100 6 9 1 5 */ + Q(1, 100) U( 30, 440, 1, 80) /* 6'0 - 1'80 9'0 8°10 - 4'0 - 2°170 - 4'100 6 9 1 5 */ + O(8) U( 10, 450, 8, 10) /* 6'0 - 8'10 1'70 9'0 - 4'0 - 2°170 - 4'100 6 9 1 5 8 */ + N(2) U( 10, 460, 1, 70) /* 6'0 - 1'70 9'0 8'0 - 4'0 - 2'170 - 4'100 6 9 1 5 8 2 */ + Q(1, 20) U( 30, 490, 1, 20) /* 6'0 - 1'20 9'0 8'0 - 4'0 - 2'170 - 4'100 6 9 1 5 8 2 */ + Q(1, 50) U( 10, 500, 1, 10) /* 6'0 - 1'10 9'0 8'0 - 4'0 - 2'170 - 4'100 6 9 1 5 8 2 */ + Q(1, 0) U( 30, 510, 2, 170) /* 6'0 - 9'0 8'0 - 4'0 - 2'170 - 4'100 6 9 1 5 8 2 */ + Q(2, 180) U( 50, 560, 2, 120) /* 6'0 - 9'0 8'0 - 4'0 - 2'120 - 4'100 6 9 1 5 8 2 */ + I(2) Q(4, 80) U( 70, 630, 4, 100) /* 6'0 - 9'0 8'0 - 4'0 - 2°50 - 4'100 6 9 1 5 8 */ + U( 50, 680, 4, 50) /* 6'0 - 9'0 8'0 - 4'0 - 2°50 - 4'100 6 9 1 5 8 */ + I(4) U( 10, 690, 6, 100) /* 6'0 - 9'0 8'0 - 4°0 - 2°50 - 6'100 9 1 5 8 */ + C(3) U( 30, 720, 6, 70) /* 6'0 3°110 - 9'0 8'0 - 4°0 - 2°50 - 6'70 9 1 5 8 */ + Q(3, 210) Y U( 20, 740, 9, 100) /* 6'0 3°110 - 9'0 8'0 - 4°0 - 2°50 - 9'100 1 5 8 6 */ + I(9) N(4) U( 50, 790, 1, 100) /* 6'0 3°110 - 9°0 8'0 - 4'0 - 2°50 - 1'100 5 8 6 4 */ + O(2) U(170, 890, 2, 50) /* 6'0 3°110 - 9°0 8'0 - 4'0 - 2'50 - 5'100 8 6 4 2 1 */ + Y N(9) U( 60, 940, 5, 60) /* 6'0 3°110 - 9'0 8'0 - 4'0 - 2'0 - 5'100 8 6 4 2 1 9 */ + I(6) U( 20, 960, 5, 40) /* 6°0 3°110 - 9'0 8'0 - 4'0 - 2'0 - 5'80 8 4 2 1 9 */ + Y U( 10, 970, 8, 30) /* 6°0 3°110 - 9'0 8'0 - 4'0 - 2'0 - 8'100 4 2 1 9 5 */ + I(8) Y U( 10, 980, 4, 20) /* 6°0 3°110 - 9'0 8°0 - 4'0 - 2'0 - 4'100 2 1 9 5 */ + Y U( 20, 0, 9, 40) /* 6°60 3°210 - 9'40 8°50 - 4'80 - 2'180 - 2'100 1 9 5 4 */ + + /* eighth round - re-configure quota, second part */ + A(3) U( 30, 30, 3, 210) /* 3'210 6°60 - 9'10 8°50 - 4'80 - 2'180 - 2'100 1 9 5 4 3 */ + I(3) U(110, 140, 9, 10) /* 6°60 3°100 - 9'10 8°50 - 4'80 - 2'180 - 2'100 1 9 5 4 */ + U( 40, 150, 4, 80) /* 6°60 3°100 - 9'0 8°50 - 4'80 - 2'180 - 2'100 1 9 5 4 */ + U(100, 230, 2, 180) /* 6°60 3°100 - 9'0 8°50 - 4'0 - 2'180 - 2'100 1 9 5 4 */ + Q(2, 90) U( 40, 270, 2, 90) /* 6°60 3°100 - 9'0 8°50 - 4'0 - 2'90 - 2'100 1 9 5 4 */ + Y Q(8, 130) U( 40, 310, 2, 100) /* 6°60 3°100 - 9'0 8°50 - 4'0 - 2'0 - 2'100 1 9 5 4 */ + U(100, 410, 1, 100) /* 6°60 3°100 - 9'0 8°50 - 4'0 - 2'0 - 1'100 9 5 4 2 */ + Q(3, 80) O(3) U( 60, 470, 3, 80) /* 3'80 6°60 - 9'0 8°50 - 4'0 - 2'0 - 1'40 9 5 4 2 3*/ + N(8) Q(8, 50) U(100, 550, 8, 50) /* 3'0 6°60 - 8'50 9'0 - 4'0 - 2'0 - 1'40 9 5 4 2 3 8 */ + U( 20, 570, 8, 30) /* 3'0 6°60 - 8'30 9'0 - 4'0 - 2'0 - 1'40 9 5 4 2 3 8 */ + O(6) Q(6, 50) U( 10, 580, 6, 50) /* 6'50 3'0 - 8'20 9'0 - 4'0 - 2'0 - 1'40 9 5 4 2 3 8 6 */ + U( 70, 630, 8, 20) /* 6'0 3'0 - 9'0 8'20 - 4'0 - 2'0 - 1'40 9 5 4 2 3 8 6 */ + U( 40, 650, 1, 40) /* 6'0 3'0 - 9'0 8'0 - 4'0 - 2'0 - 1'40 9 5 4 2 3 8 6 */ + U( 40, 690, 9, 100) /* 6'0 3'0 - 9'0 8'0 - 4'0 - 2'0 - 9'100 5 4 2 3 8 6 1 */ + D(6) U(200, 790, 5, 100) /* 3'0 - 9'0 8'0 - 4'0 - 2'0 - 5'100 4 2 3 8 1 9 */ + D(3) U(100, 890, 4, 100) /* 9'0 8'0 - 4'0 - 2'0 - 4'100 2 8 1 9 5 */ + U(120, 990, 2, 10) /* 9'0 8'0 - 4'0 - 2'0 - 2'100 8 1 9 5 4 */ + U( 80, 0, 9, 40) /* 9'40 8'50 - 4'80 - 2'90 - 2'90 8 1 9 5 4 */ done(); }