<?php
// Staring straight up into the sky ... oh my my
/* Возвращает соответствующую числу форму слова: 1 рубль, 2 рубля, 5 рублей */
function inclineWord( $number , $word1 , $word2 , $word5 ) {
/* DIY */
if ( $number == 1 ) {
return "рубль" ;
} elseif ( $number == 2 || $number == 3 || $number == 4 ) {
return "рубля" ;
} elseif ( $number == 0 || $number > 5 and $number < 21 ) {
return "рублей" ;
} else {
return "рублей" ;
}
}
/*
Преобразует числа от 0 до 999 в текст. Параметр $isFemale равен нулю,
если мы считаем число для мужского рода (один рубль),
и 1 — для женского (одна тысяча)
*/
function smallNumberToText( $number , $isFemale )
{
0 => 'ноль' , 10 => 'десять' , 100 => 'сто' ,
1 => 'один' , 11 => 'одиннадцать' , 20 => 'двадцать' , 200 => 'двести' ,
2 => 'два' , 12 => 'двенадцать' , 30 => 'тридцать' , 300 => 'триста' ,
3 => 'три' , 13 => 'тринадцать' , 40 => 'сорок' , 400 => 'четыреста' ,
4 => 'четыре' , 14 => 'четырнадцать' , 50 => 'пятьдесят' , 500 => 'пятьсот' ,
5 => 'пять' , 15 => 'пятнадцать' , 60 => 'шестьдесят' , 600 => 'шестьсот' ,
6 => 'шесть' , 16 => 'шестнадцать' , 70 => 'семьдесят' , 700 => 'семьсот' ,
7 => 'семь' , 17 => 'семнадцать' , 80 => 'восемьдесят' , 800 => 'восемьсот' ,
8 => 'восемь' , 18 => 'восемнадцать' , 90 => 'девяносто' , 900 => 'девятьсот' ,
9 => 'девять' , 19 => 'девятнадцать'
) ;
1 => 'одна' , 2 => 'две'
) ;
/* DIY */
$splitter = preg_split ( '//u' , $number , - 1 , PREG_SPLIT_NO_EMPTY
) ;
if ( count ( $splitter ) < 3 and
$number <= 20 ) { return $spelling [ $number ] ;
} elseif ( $number > 20 and $number < 100 ) {
$decimal = $splitter [ 0 ] * 10 ;
return ( $spelling [ $decimal ] . " " . $spelling [ $splitter [ 1 ] ] ) ;
} elseif ( $number >= 100 and $number < 1000 ) {
// Тройка чисел!
if ( count ( $splitter ) == 3 and
$splitter [ 2 ] == 0 ) { $hundredth = $splitter [ 0 ] * 100 ;
$decimal = $splitter [ 1 ] * 10 ;
return ( $spelling [ $hundredth ] . " " . $spelling [ $decimal ] ) ;
} elseif ( count ( $splitter ) == 3 and
$splitter [ 1 ] == 0 ) { $hundredth = $splitter [ 0 ] * 100 ;
return ( $spelling [ $hundredth ] . " " . $spelling [ $splitter [ 2 ] ] ) ;
} elseif ( count ( $splitter ) == 3 and
$splitter [ 0 ] == 0 and
$splitter [ 1 ] == 0 ) { $hundredth = $splitter [ 0 ] * 100 ;
return ( $spelling [ $hundredth ] ) ;
} elseif ( count ( $splitter ) == 3 and
$splitter [ 0 ] == 0 ) { $decimal = $splitter [ 1 ] * 10 ;
return ( $spelling [ $decimal ] . " " . $spelling [ $splitter [ 2 ] ] ) ;
} elseif ( count ( $splitter ) == 3 and
$splitter [ 0 ] == 0 and
$splitter [ 1 ] == 0 ) { return ( $spelling [ $splitter [ 2 ] ] ) ;
} else {
$hundredth = $splitter [ 0 ] * 100 ;
$decimal = $splitter [ 1 ] * 10 ;
return ( $spelling [ $hundredth ] . " " . $spelling [ $decimal ] . " " . $spelling [ $splitter [ 2 ] ] ) ;
}
} elseif ( $number > 1000 and $number < 2000 ) {
echo "Принимаю больше тысячи - " . $number ;
$numbers = preg_split ( '//u' , $number , - 1 , PREG_SPLIT_NO_EMPTY
) ; if ( ( $numbers [ 2 ] ) == 0 ) {
$thousands = $numbers [ 0 ] * 1000 ;
$hundredth = $numbers [ 0 ] * 100 ;
return ( $spelling [ $thousands ] . " " . $spelling [ $hundredth ] . " " . $spelling [ $numbers [ 2 ] ] ) ;
} elseif ( ( $numbers [ 1 ] ) == 0 and ( $numbers [ 2 ] ) == 0 ) {
$thousands = $numbers [ 0 ] * 1000 ;
return ( $spelling [ $thousands ] . " " . $spelling [ $numbers [ 2 ] ] ) ;
} elseif ( ( $numbers [ 1 ] ) == 0 ) {
$thousands = $numbers [ 0 ] * 1000 ;
$decimal = $numbers [ 2 ] * 10 ;
return ( $spelling [ $thousands ] . " " . ( $spelling [ $decimal ] ) . " " . $spelling [ $numbers [ 2 ] ] ) ;
} else {
$thousands = $numbers [ 0 ] * 1000 ;
$hundredth = $numbers [ 1 ] * 100 ;
$decimal = $numbers [ 2 ] * 10 ;
return ( $femaleSpelling [ 1 ] . " " . $thousands [ 1 ] . " " . $spelling [ $hundredth ] . " " . $spelling [ $decimal ] . " " . $spelling [ $numbers [ 3 ] ] ) ;
}
}
else {
}
}
function numberToText( $number ) {
/* DIY */
$resultString = "" ;
$lastTreeDigit = "" ;
echo "Исходное число " . $number . "\n " ;
$separatedNumbers = preg_split ( '//u' , $number , NULL , PREG_SPLIT_NO_EMPTY
) ; $j = count ( $separatedNumbers ) ;
// один
0 => 'Один' ,
1 => 'десять' ,
2 => 'сто' ,
3 => 'тысяча' ,
4 => 'миллион' ,
5 => 'миллиард' ,
6 => 'триллион' ,
7 => 'квадриллион' ,
8 => 'квинтиллион' ,
9 => 'секстиллион' ,
10 => 'септиллион' ,
11 => 'октиллион' ,
12 => 'нониллион' ,
13 => 'дециллион'
) ;
//пять
1 => 'десять' ,
2 => 'сто' ,
3 => 'тысячь' ,
4 => 'миллионов' ,
5 => 'миллиардов' ,
6 => 'триллионов' ,
7 => 'квадриллионов' ,
8 => 'квинтиллионов' ,
9 => 'секстиллионов' ,
10 => 'септиллионов' ,
11 => 'октиллионов' ,
12 => 'нониллионов' ,
13 => 'дециллионов'
) ;
// три
1 => 'десять' ,
2 => 'сто' ,
3 => 'тысячи' ,
4 => 'миллиона' ,
5 => 'миллиарда' ,
6 => 'триллиона' ,
7 => 'квадриллиона' ,
8 => 'квинтиллиона' ,
9 => 'секстиллиона' ,
10 => 'септиллиона' ,
11 => 'октиллиона' ,
12 => 'нониллиона' ,
13 => 'дециллиона'
) ;
for ( $i = 0 ; $i < count ( $separatedNumbers ) ; $i ++ ) { $j --;
if ( $j > 2 ) {
switch ( ( $separatedNumbers [ $i ] ) ) {
case 1 ;
$resultString = $resultString . " " . smallNumberToText( ( $separatedNumbers [ $i ] ) , 0 ) . " " . $spedec [ $j ] ;
break ;
case 2 ;
case 3 ;
case 4 ;
$resultString = $resultString . " " . smallNumberToText( ( $separatedNumbers [ $i ] ) , 0 ) . " " . $spedecThird [ $j ] ;
break ;
case 5 ;
case 6 ;
case 7 ;
case 8 ;
case 9 ;
case 10 :
$resultString = $resultString . " " . smallNumberToText( ( $separatedNumbers [ $i ] ) , 0 ) . " " . $spedecSecond [ $j ] ;
break ;
default ;
$resultString = $resultString . " " . smallNumberToText( ( $separatedNumbers [ $i ] ) , 0 ) . " " . $spedec [ $j ] ;
break ;
}
} else {
$lastTreeDigit = $lastTreeDigit . $separatedNumbers [ $i ] ;
}
}
$resultString = $resultString . " " . smallNumberToText( ( $lastTreeDigit . $lastDigit ) , 0 ) . " " . inclineWord( $lastDigit , 1 , 1 , 1 ) . " " ;;
$result = $resultString ;
return $result ;
}
/* Вызовем функцию несколько раз */
$text1 = numberToText( $amount1 ) ;
echo "На вашем счету {$text1} \n " ;
$text2 = numberToText( $amount2 ) ;
echo "На вашем счету {$text2} \n " ;
$text3 = numberToText( $amount3 ) ;
echo "На вашем счету {$text3} \n " ;
$text4 = numberToText( $amount4 ) ;
echo "На вашем счету {$text4} \n " ;
$text5 = numberToText( $amount5 ) ;
echo "На вашем счету {$text5} \n " ;
$amount6 = 9009 ;
$text6 = numberToText( $amount6 ) ;
echo "На вашем счету {$text6} \n " ;
$amount7 = 999999999 ;
$text7 = numberToText( $amount7 ) ;
echo "На вашем счету {$text7} \n " ;
PD9waHAKLy8gU3RhcmluZyBzdHJhaWdodCB1cCBpbnRvIHRoZSBza3kgLi4uIG9oIG15IG15CmVycm9yX3JlcG9ydGluZygtMSk7Cm1iX2ludGVybmFsX2VuY29kaW5nKCd1dGYtOCcpOwoKLyog0JLQvtC30LLRgNCw0YnQsNC10YIg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnRg9GOINGH0LjRgdC70YMg0YTQvtGA0LzRgyDRgdC70L7QstCwOiAxINGA0YPQsdC70YwsIDIg0YDRg9Cx0LvRjywgNSDRgNGD0LHQu9C10LkgKi8KZnVuY3Rpb24gaW5jbGluZVdvcmQoJG51bWJlciwgJHdvcmQxLCAkd29yZDIsICR3b3JkNSkgewogICAgLyogRElZICovCiAgICBpZiAoJG51bWJlciA9PSAxKSB7CiAgICAgICAgcmV0dXJuICLRgNGD0LHQu9GMIjsKICAgIH1lbHNlaWYgKCRudW1iZXIgPT0gMiB8fCAkbnVtYmVyID09IDMgfHwgJG51bWJlciA9PSA0KXsKICAgICAgICByZXR1cm4gItGA0YPQsdC70Y8iOwogICAgfWVsc2VpZiAoJG51bWJlciA9PSAwIHx8ICRudW1iZXIgPjUgYW5kICRudW1iZXI8MjEpewogICAgICAgIHJldHVybiAi0YDRg9Cx0LvQtdC5IjsKICAgIH1lbHNlIHsKICAgICAgICByZXR1cm4gItGA0YPQsdC70LXQuSI7CiAgICB9Cn0KCi8qCiAgICDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINGH0LjRgdC70LAg0L7RgiAwINC00L4gOTk5INCyINGC0LXQutGB0YIuINCf0LDRgNCw0LzQtdGC0YAgJGlzRmVtYWxlINGA0LDQstC10L0g0L3Rg9C70Y4sCiAgICDQtdGB0LvQuCDQvNGLINGB0YfQuNGC0LDQtdC8INGH0LjRgdC70L4g0LTQu9GPINC80YPQttGB0LrQvtCz0L4g0YDQvtC00LAgKNC+0LTQuNC9INGA0YPQsdC70YwpLAogICAg0LggMSDigJQg0LTQu9GPINC20LXQvdGB0LrQvtCz0L4gKNC+0LTQvdCwINGC0YvRgdGP0YfQsCkKKi8KZnVuY3Rpb24gc21hbGxOdW1iZXJUb1RleHQoJG51bWJlciwgJGlzRmVtYWxlKQp7CgogICAgJHNwZWxsaW5nID0gYXJyYXkoCiAgICAgICAgMCA9PiAn0L3QvtC70YwnLCAxMCA9PiAn0LTQtdGB0Y/RgtGMJywgMTAwID0+ICfRgdGC0L4nLAogICAgICAgIDEgPT4gJ9C+0LTQuNC9JywgMTEgPT4gJ9C+0LTQuNC90L3QsNC00YbQsNGC0YwnLCAyMCA9PiAn0LTQstCw0LTRhtCw0YLRjCcsIDIwMCA9PiAn0LTQstC10YHRgtC4JywKICAgICAgICAyID0+ICfQtNCy0LAnLCAxMiA9PiAn0LTQstC10L3QsNC00YbQsNGC0YwnLCAzMCA9PiAn0YLRgNC40LTRhtCw0YLRjCcsIDMwMCA9PiAn0YLRgNC40YHRgtCwJywKICAgICAgICAzID0+ICfRgtGA0LgnLCAxMyA9PiAn0YLRgNC40L3QsNC00YbQsNGC0YwnLCA0MCA9PiAn0YHQvtGA0L7QuicsIDQwMCA9PiAn0YfQtdGC0YvRgNC10YHRgtCwJywKICAgICAgICA0ID0+ICfRh9C10YLRi9GA0LUnLCAxNCA9PiAn0YfQtdGC0YvRgNC90LDQtNGG0LDRgtGMJywgNTAgPT4gJ9C/0Y/RgtGM0LTQtdGB0Y/RgicsIDUwMCA9PiAn0L/Rj9GC0YzRgdC+0YInLAogICAgICAgIDUgPT4gJ9C/0Y/RgtGMJywgMTUgPT4gJ9C/0Y/RgtC90LDQtNGG0LDRgtGMJywgNjAgPT4gJ9GI0LXRgdGC0YzQtNC10YHRj9GCJywgNjAwID0+ICfRiNC10YHRgtGM0YHQvtGCJywKICAgICAgICA2ID0+ICfRiNC10YHRgtGMJywgMTYgPT4gJ9GI0LXRgdGC0L3QsNC00YbQsNGC0YwnLCA3MCA9PiAn0YHQtdC80YzQtNC10YHRj9GCJywgNzAwID0+ICfRgdC10LzRjNGB0L7RgicsCiAgICAgICAgNyA9PiAn0YHQtdC80YwnLCAxNyA9PiAn0YHQtdC80L3QsNC00YbQsNGC0YwnLCA4MCA9PiAn0LLQvtGB0LXQvNGM0LTQtdGB0Y/RgicsIDgwMCA9PiAn0LLQvtGB0LXQvNGM0YHQvtGCJywKICAgICAgICA4ID0+ICfQstC+0YHQtdC80YwnLCAxOCA9PiAn0LLQvtGB0LXQvNC90LDQtNGG0LDRgtGMJywgOTAgPT4gJ9C00LXQstGP0L3QvtGB0YLQvicsIDkwMCA9PiAn0LTQtdCy0Y/RgtGM0YHQvtGCJywKICAgICAgICA5ID0+ICfQtNC10LLRj9GC0YwnLCAxOSA9PiAn0LTQtdCy0Y/RgtC90LDQtNGG0LDRgtGMJwogICAgKTsKCiAgICAkZmVtYWxlU3BlbGxpbmcgPSBhcnJheSgKICAgICAgICAxID0+ICfQvtC00L3QsCcsIDIgPT4gJ9C00LLQtScKICAgICk7CiAgICAvKiBESVkgKi8KICAgICRzcGxpdHRlciA9IHByZWdfc3BsaXQoJy8vdScsICRudW1iZXIsIC0xLCBQUkVHX1NQTElUX05PX0VNUFRZKTsKCiAgICBpZiAoY291bnQoJHNwbGl0dGVyKSA8MyBhbmQgJG51bWJlciA8PSAyMCkgewogICAgICAgIHJldHVybiAkc3BlbGxpbmdbJG51bWJlcl07CiAgICB9IGVsc2VpZiAoJG51bWJlciA+IDIwIGFuZCAkbnVtYmVyIDwgMTAwKSB7CiAgICAgICAgJGRlY2ltYWwgPSAkc3BsaXR0ZXJbMF0gKiAxMDsKICAgICAgICByZXR1cm4gKCRzcGVsbGluZ1skZGVjaW1hbF0gLiAiICIgLiAkc3BlbGxpbmdbJHNwbGl0dGVyWzFdXSk7CgogICAgfSBlbHNlaWYgKCRudW1iZXIgPj0gMTAwIGFuZCAkbnVtYmVyIDwgMTAwMCkgewogICAgICAgIC8vINCi0YDQvtC50LrQsCDRh9C40YHQtdC7IQogICAgICAgIGlmIChjb3VudCgkc3BsaXR0ZXIpID09MyBhbmQgJHNwbGl0dGVyWzJdPT0wKXsKICAgICAgICAgICAgJGh1bmRyZWR0aCA9ICRzcGxpdHRlclswXSAqIDEwMDsKICAgICAgICAgICAgJGRlY2ltYWwgPSAkc3BsaXR0ZXJbMV0gKiAxMDsKICAgICAgICAgICAgcmV0dXJuICgkc3BlbGxpbmdbJGh1bmRyZWR0aF0gLiAiICIgLiAkc3BlbGxpbmdbJGRlY2ltYWxdKTsKICAgICAgICB9ZWxzZWlmKGNvdW50KCRzcGxpdHRlcikgPT0zIGFuZCAkc3BsaXR0ZXJbMV09PTApewogICAgICAgICAgICAkaHVuZHJlZHRoID0gJHNwbGl0dGVyWzBdICogMTAwOwogICAgICAgICAgICByZXR1cm4gKCRzcGVsbGluZ1skaHVuZHJlZHRoXSAuICIgIiAuICRzcGVsbGluZ1skc3BsaXR0ZXJbMl1dKTsKICAgICAgICB9IGVsc2VpZihjb3VudCgkc3BsaXR0ZXIpID09MyBhbmQgJHNwbGl0dGVyWzBdPT0wIGFuZCAkc3BsaXR0ZXJbMV09PTApewogICAgICAgICAgICAkaHVuZHJlZHRoID0gJHNwbGl0dGVyWzBdICogMTAwOwogICAgICAgICAgICByZXR1cm4gKCRzcGVsbGluZ1skaHVuZHJlZHRoXSk7CiAgICAgICAgfSBlbHNlaWYoY291bnQoJHNwbGl0dGVyKSA9PTMgYW5kICRzcGxpdHRlclswXT09MCl7CiAgICAgICAgICAgICRkZWNpbWFsID0gJHNwbGl0dGVyWzFdICogMTA7CiAgICAgICAgICAgIHJldHVybiAoJHNwZWxsaW5nWyRkZWNpbWFsXSAuICIgIiAuICRzcGVsbGluZ1skc3BsaXR0ZXJbMl1dKTsKICAgICAgICB9IGVsc2VpZihjb3VudCgkc3BsaXR0ZXIpID09MyBhbmQgICRzcGxpdHRlclswXT09MCBhbmQgJHNwbGl0dGVyWzFdPT0wKXsKICAgICAgICAgICAgcmV0dXJuICgkc3BlbGxpbmdbJHNwbGl0dGVyWzJdXSk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICRodW5kcmVkdGggPSAkc3BsaXR0ZXJbMF0gKiAxMDA7CiAgICAgICAgICAgICRkZWNpbWFsID0gJHNwbGl0dGVyWzFdICogMTA7CiAgICAgICAgICAgIHJldHVybiAoJHNwZWxsaW5nWyRodW5kcmVkdGhdIC4gIiAiIC4gJHNwZWxsaW5nWyRkZWNpbWFsXSAuICIgIiAuICRzcGVsbGluZ1skc3BsaXR0ZXJbMl1dKTsKICAgICAgICB9CiAgICB9IGVsc2VpZiAoJG51bWJlciA+IDEwMDAgYW5kICRudW1iZXIgPCAyMDAwKSB7CiAgICAgICAgZWNobyAi0J/RgNC40L3QuNC80LDRjiDQsdC+0LvRjNGI0LUg0YLRi9GB0Y/Rh9C4IC0gIiAuICRudW1iZXI7CiAgICAgICAgJG51bWJlcnMgPSBwcmVnX3NwbGl0KCcvL3UnLCAkbnVtYmVyLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7CiAgICAgICAgaWYgKCgkbnVtYmVyc1syXSkgPT0gMCkgewogICAgICAgICAgICAkdGhvdXNhbmRzID0gJG51bWJlcnNbMF0gKiAxMDAwOwogICAgICAgICAgICAkaHVuZHJlZHRoID0gJG51bWJlcnNbMF0gKiAxMDA7CiAgICAgICAgICAgIHJldHVybiAoJHNwZWxsaW5nWyR0aG91c2FuZHNdIC4gIiAiIC4gJHNwZWxsaW5nWyRodW5kcmVkdGhdIC4gIiAiIC4gJHNwZWxsaW5nWyRudW1iZXJzWzJdXSk7CgogICAgICAgIH0gZWxzZWlmICgoJG51bWJlcnNbMV0pID09IDAgYW5kICgkbnVtYmVyc1syXSkgPT0gMCkgewogICAgICAgICAgICAkdGhvdXNhbmRzID0gJG51bWJlcnNbMF0gKiAxMDAwOwogICAgICAgICAgICByZXR1cm4gKCRzcGVsbGluZ1skdGhvdXNhbmRzXSAuICIgIiAuICRzcGVsbGluZ1skbnVtYmVyc1syXV0pOwoKICAgICAgICB9IGVsc2VpZiAoKCRudW1iZXJzWzFdKSA9PSAwKSB7CiAgICAgICAgICAgICR0aG91c2FuZHMgPSAkbnVtYmVyc1swXSAqIDEwMDA7CiAgICAgICAgICAgICRkZWNpbWFsID0gJG51bWJlcnNbMl0gKiAxMDsKICAgICAgICAgICAgcmV0dXJuICgkc3BlbGxpbmdbJHRob3VzYW5kc10gLiAiICIgLiAoJHNwZWxsaW5nWyRkZWNpbWFsXSkgLiAiICIgLiAkc3BlbGxpbmdbJG51bWJlcnNbMl1dKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhvdXNhbmRzID0gJG51bWJlcnNbMF0gKiAxMDAwOwogICAgICAgICAgICAkaHVuZHJlZHRoID0gJG51bWJlcnNbMV0gKiAxMDA7CiAgICAgICAgICAgICRkZWNpbWFsID0gJG51bWJlcnNbMl0gKiAxMDsKICAgICAgICAgICAgcmV0dXJuICgkZmVtYWxlU3BlbGxpbmdbMV0gLiAiICIgLiAkdGhvdXNhbmRzWzFdIC4gIiAiIC4gJHNwZWxsaW5nWyRodW5kcmVkdGhdIC4gIiAiIC4gJHNwZWxsaW5nWyRkZWNpbWFsXSAuICIgIiAuICRzcGVsbGluZ1skbnVtYmVyc1szXV0pOwogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIHsKICAgIH0KfQoKZnVuY3Rpb24gbnVtYmVyVG9UZXh0KCRudW1iZXIpIHsKCiAgICAvKiBESVkgKi8KICAgICRyZXN1bHRTdHJpbmc9IiI7CiAgICAkbGFzdFRyZWVEaWdpdD0iIjsKICAgIGVjaG8gItCY0YHRhdC+0LTQvdC+0LUg0YfQuNGB0LvQviAiLiRudW1iZXIuIlxuIjsKCiAgICAkc2VwYXJhdGVkTnVtYmVycz0gcHJlZ19zcGxpdCgnLy91JywgJG51bWJlciwgTlVMTCAsIFBSRUdfU1BMSVRfTk9fRU1QVFkpOwogICAgJGo9Y291bnQoJHNlcGFyYXRlZE51bWJlcnMpOwogICAgJGxhc3REaWdpdD1hcnJheV9wb3AoJHNlcGFyYXRlZE51bWJlcnMpOwoKICAgIC8vINC+0LTQuNC9CiAgICAkc3BlZGVjID0gYXJyYXkoCiAgICAgICAgMCAgID0+ICAn0J7QtNC40L0nLAogICAgICAgIDEgICA9PiAgJ9C00LXRgdGP0YLRjCcsCiAgICAgICAgMiAgID0+ICAn0YHRgtC+JywKICAgICAgICAzICAgPT4gICfRgtGL0YHRj9GH0LAnLAogICAgICAgIDQgICA9PiAgJ9C80LjQu9C70LjQvtC9JywKICAgICAgICA1ICAgPT4gICfQvNC40LvQu9C40LDRgNC0JywKICAgICAgICA2ICAgPT4gICfRgtGA0LjQu9C70LjQvtC9JywKICAgICAgICA3ICAgPT4gICfQutCy0LDQtNGA0LjQu9C70LjQvtC9JywKICAgICAgICA4ICAgPT4gICfQutCy0LjQvdGC0LjQu9C70LjQvtC9JywKICAgICAgICA5ICAgPT4gICfRgdC10LrRgdGC0LjQu9C70LjQvtC9JywKICAgICAgICAxMCAgPT4gICfRgdC10L/RgtC40LvQu9C40L7QvScsCiAgICAgICAgMTEgID0+ICAn0L7QutGC0LjQu9C70LjQvtC9JywKICAgICAgICAxMiAgPT4gICfQvdC+0L3QuNC70LvQuNC+0L0nLAogICAgICAgIDEzICA9PiAgJ9C00LXRhtC40LvQu9C40L7QvScKICAgICk7CgogICAgLy/Qv9GP0YLRjAogICAgJHNwZWRlY1NlY29uZCA9IGFycmF5KAogICAgICAgIDEgICA9PiAgJ9C00LXRgdGP0YLRjCcsCiAgICAgICAgMiAgID0+ICAn0YHRgtC+JywKICAgICAgICAzICAgPT4gICfRgtGL0YHRj9GH0YwnLAogICAgICAgIDQgICA9PiAgJ9C80LjQu9C70LjQvtC90L7QsicsCiAgICAgICAgNSAgID0+ICAn0LzQuNC70LvQuNCw0YDQtNC+0LInLAogICAgICAgIDYgICA9PiAgJ9GC0YDQuNC70LvQuNC+0L3QvtCyJywKICAgICAgICA3ICAgPT4gICfQutCy0LDQtNGA0LjQu9C70LjQvtC90L7QsicsCiAgICAgICAgOCAgID0+ICAn0LrQstC40L3RgtC40LvQu9C40L7QvdC+0LInLAogICAgICAgIDkgICA9PiAgJ9GB0LXQutGB0YLQuNC70LvQuNC+0L3QvtCyJywKICAgICAgICAxMCAgPT4gICfRgdC10L/RgtC40LvQu9C40L7QvdC+0LInLAogICAgICAgIDExICA9PiAgJ9C+0LrRgtC40LvQu9C40L7QvdC+0LInLAogICAgICAgIDEyICA9PiAgJ9C90L7QvdC40LvQu9C40L7QvdC+0LInLAogICAgICAgIDEzICA9PiAgJ9C00LXRhtC40LvQu9C40L7QvdC+0LInCiAgICApOwoKICAgIC8vINGC0YDQuAogICAgJHNwZWRlY1RoaXJkID0gYXJyYXkoCiAgICAgICAgMSAgID0+ICAn0LTQtdGB0Y/RgtGMJywKICAgICAgICAyICAgPT4gICfRgdGC0L4nLAogICAgICAgIDMgICA9PiAgJ9GC0YvRgdGP0YfQuCcsCiAgICAgICAgNCAgID0+ICAn0LzQuNC70LvQuNC+0L3QsCcsCiAgICAgICAgNSAgID0+ICAn0LzQuNC70LvQuNCw0YDQtNCwJywKICAgICAgICA2ICAgPT4gICfRgtGA0LjQu9C70LjQvtC90LAnLAogICAgICAgIDcgICA9PiAgJ9C60LLQsNC00YDQuNC70LvQuNC+0L3QsCcsCiAgICAgICAgOCAgID0+ICAn0LrQstC40L3RgtC40LvQu9C40L7QvdCwJywKICAgICAgICA5ICAgPT4gICfRgdC10LrRgdGC0LjQu9C70LjQvtC90LAnLAogICAgICAgIDEwICA9PiAgJ9GB0LXQv9GC0LjQu9C70LjQvtC90LAnLAogICAgICAgIDExICA9PiAgJ9C+0LrRgtC40LvQu9C40L7QvdCwJywKICAgICAgICAxMiAgPT4gICfQvdC+0L3QuNC70LvQuNC+0L3QsCcsCiAgICAgICAgMTMgID0+ICAn0LTQtdGG0LjQu9C70LjQvtC90LAnCiAgICApOwoKICAgIGZvciAoJGk9MDsgJGkgPGNvdW50KCRzZXBhcmF0ZWROdW1iZXJzKTsgJGkrKykgewogICAgICAgICRqLS07CiAgICAgICAgaWYgKCRqPjIpewogICAgICAgICAgICBzd2l0Y2ggICgoJHNlcGFyYXRlZE51bWJlcnNbJGldKSkgewogICAgICAgICAgICAgICAgY2FzZSAxOwogICAgICAgICAgICAgICAgICAgICRyZXN1bHRTdHJpbmcgPSAkcmVzdWx0U3RyaW5nIC4iICIuIHNtYWxsTnVtYmVyVG9UZXh0KCgkc2VwYXJhdGVkTnVtYmVyc1skaV0pLCAwKS4iICIuJHNwZWRlY1skal07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDI7CiAgICAgICAgICAgICAgICBjYXNlIDM7CiAgICAgICAgICAgICAgICBjYXNlIDQ7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFN0cmluZyA9ICRyZXN1bHRTdHJpbmcgLiIgIi4gc21hbGxOdW1iZXJUb1RleHQoKCRzZXBhcmF0ZWROdW1iZXJzWyRpXSksIDApLiIgIi4kc3BlZGVjVGhpcmRbJGpdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA1OwogICAgICAgICAgICAgICAgY2FzZSA2OwogICAgICAgICAgICAgICAgY2FzZSA3OwogICAgICAgICAgICAgICAgY2FzZSA4OwogICAgICAgICAgICAgICAgY2FzZSA5OwogICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0U3RyaW5nID0gJHJlc3VsdFN0cmluZyAuIiAiLiBzbWFsbE51bWJlclRvVGV4dCgoJHNlcGFyYXRlZE51bWJlcnNbJGldKSwgMCkuIiAiLiRzcGVkZWNTZWNvbmRbJGpdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0U3RyaW5nID0gJHJlc3VsdFN0cmluZyAuIiAiLiBzbWFsbE51bWJlclRvVGV4dCgoJHNlcGFyYXRlZE51bWJlcnNbJGldKSwgMCkuIiAiLiRzcGVkZWNbJGpdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICRsYXN0VHJlZURpZ2l0ID0gJGxhc3RUcmVlRGlnaXQgLiAgJHNlcGFyYXRlZE51bWJlcnNbJGldOwogICAgICAgIH0KICAgIH0KICAgICRyZXN1bHRTdHJpbmcgPSAkcmVzdWx0U3RyaW5nIC4gIiAiLiBzbWFsbE51bWJlclRvVGV4dCgoJGxhc3RUcmVlRGlnaXQuICRsYXN0RGlnaXQpLCAwKS4gIiAiLiBpbmNsaW5lV29yZCgkbGFzdERpZ2l0LCAxLCAxLCAxKSAuICIgIjs7CiAgICAkcmVzdWx0PSRyZXN1bHRTdHJpbmc7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKLyog0JLRi9C30L7QstC10Lwg0YTRg9C90LrRhtC40Y4g0L3QtdGB0LrQvtC70YzQutC+INGA0LDQtyAqLwokYW1vdW50MSA9IG10X3JhbmQoMSw5OTk5OTk5OSk7CiR0ZXh0MSA9IG51bWJlclRvVGV4dCgkYW1vdW50MSk7CmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDF9IFxuIjsKCiRhbW91bnQyID0gbXRfcmFuZCgxLDk5OTk5OTk5KTsKJHRleHQyID0gbnVtYmVyVG9UZXh0KCRhbW91bnQyKTsKZWNobyAi0J3QsCDQstCw0YjQtdC8INGB0YfQtdGC0YMgeyR0ZXh0Mn0gXG4iOwoKJGFtb3VudDMgPSBtdF9yYW5kKDEsOTk5OTk5OTkpOwokdGV4dDMgPSBudW1iZXJUb1RleHQoJGFtb3VudDMpOwplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQzfSBcbiI7CgokYW1vdW50NCA9IG10X3JhbmQoMSw5OTk5OTk5OSk7CiR0ZXh0NCA9IG51bWJlclRvVGV4dCgkYW1vdW50NCk7CmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDR9IFxuIjsKCiRhbW91bnQ1ID0gbXRfcmFuZCgxLDkpOwokdGV4dDUgPSBudW1iZXJUb1RleHQoJGFtb3VudDUpOwplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQ1fSBcbiI7CgokYW1vdW50NiA9IDkwMDk7CiR0ZXh0NiA9IG51bWJlclRvVGV4dCgkYW1vdW50Nik7CmVjaG8gItCd0LAg0LLQsNGI0LXQvCDRgdGH0LXRgtGDIHskdGV4dDZ9IFxuIjsKCiRhbW91bnQ3ID0gOTk5OTk5OTk5OwokdGV4dDcgPSBudW1iZXJUb1RleHQoJGFtb3VudDcpOwplY2hvICLQndCwINCy0LDRiNC10Lwg0YHRh9C10YLRgyB7JHRleHQ3fSBcbiI7