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
This commit is contained in:
Martin Stein 2015-03-20 09:22:02 +01:00 committed by Christian Helmuth
parent e4f560f39b
commit 955977b516
7 changed files with 329 additions and 172 deletions

View File

@ -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
*

View File

@ -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
*/

View File

@ -84,7 +84,7 @@ class Kernel::Cpu_share : public Cpu_claim, public Cpu_fill
private:
signed const _prio;
unsigned const _quota;
unsigned _quota;
unsigned _claim;
unsigned _fill;
bool _ready;
@ -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 <typename F> void _for_prios(F f) {
template <typename F> void _for_each_prio(F f) {
for (signed p = Prio::max; p > Prio::min - 1; p--) { f(p); } }
template <typename T>
@ -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_ */

View File

@ -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();

View File

@ -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 **
**************/

View File

@ -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<Thread*>(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;

View File

@ -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
* 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 if the new head is the context
* with ID 's' that has a quota of 'q'.
* 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();
}