<?php
SUBWAY => 'едешь на метро' ,
FOOT => 'идешь пешком' ,
BUS => 'едешь на автобусе'
) ;
$startPoint = 'pet' ; // Петроградская
$endPoint = 'nov' ; // Новая Голландия
'pet' => 'ст. м. Петроградская' ,
'chk' => 'ст. м. Чкаловская' ,
'gor' => 'ст. м. Горьковская' ,
'spo' => 'ст. м. Спортивная' ,
'vas' => 'ст. м. Василеостровская' ,
'kre' => 'Петропавловская крепость' ,
'let' => 'Летний сад' ,
'dvo' => 'Дворцовая площадь' ,
'isa' => 'Исакиевский собор' ,
'nov' => 'Новая Голландия' ,
'ras' => 'Дом Раскольникова' ,
'gos' => 'Гостиный Двор' ,
'sen' => 'Сенная Площадь' ,
'vla' => 'ст. м. Владимирская' ,
'vit' => 'Витебский вокзал' ,
'teh' => 'Технологический Институт'
) ;
'chk' => canGet( 10 , BUS) ,
'gor' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 10 , BUS) ,
'spo' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 3 , BUS) ,
'kre' => canGet( 5 , FOOT) ,
'gos' => canGet( 6 , SUBWAY)
) ,
'chk' => canGet( 3 , SUBWAY) ,
'vas' => canGet( 10 , BUS) ,
'sen' => canGet( 7 , SUBWAY)
) ,
'spo' => canGet( 10 , BUS) ,
'gos' => canGet( 7 , SUBWAY) ,
'nov' => canGet( 11 , FOOT)
) ,
'gor' => canGet( 5 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'gos' => canGet( 7 , FOOT)
) ,
'isa' => canGet( 6 , FOOT) ,
'gos' => canGet( 6 , FOOT) ,
'let' => canGet( 6 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'nov' => canGet( 5 , FOOT)
) ,
'vas' => canGet( 11 , FOOT) ,
'isa' => canGet( 5 , FOOT) ,
'ras' => canGet( 7 , BUS)
) ,
'nov' => canGet( 7 , BUS) ,
'sen' => canGet( 3 , FOOT)
) ,
'vas' => canGet( 7 , SUBWAY) ,
'sen' => canGet( 3 , SUBWAY) ,
'dvo' => canGet( 6 , FOOT) ,
'gor' => canGet( 6 , SUBWAY) ,
'let' => canGet( 7 , FOOT) ,
'vla' => canGet( 7 , FOOT)
) ,
'ras' => canGet( 3 , FOOT) ,
'spo' => canGet( 7 , SUBWAY) ,
'gos' => canGet( 3 , SUBWAY) ,
'vla' => canGet( 4 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 4 , SUBWAY) ,
'gos' => canGet( 7 , FOOT) ,
'vit' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 2 , SUBWAY) ,
'vla' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 3 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY)
)
) ;
function canGet( $time , $byWhat )
{
return array ( 'time' => $time , 'by' => $byWhat ) ; }
function makeOneStep( $currentPoint , $endPoint , $paths , $pathDone , $visitedPoint , $time )
{
static
$allPath = array ( ) ;
foreach ( $paths [ $currentPoint ] as $nextPoint => $value ) {
if ( $nextPoint == $endPoint ) {
$result [ 'path' ] = $pathDone ;
$result [ 'path' ] [ ] = $endPoint ;
$result [ 'time' ] = $time + $paths [ $currentPoint ] [ $endPoint ] [ 'time' ] ;;
$allPath [ ] = $result ;
} elseif ( ! in_array ( $nextPoint , $visitedPoint ) ) { /** если отправить массив visitedPoint и pathDone, то для последующих соседних точек (nextPoint)
* они будут содержать информацию с предыдущей соседней точки,
* то есть массив для teh->vit, будет содержать инфорацию о пути для teh->sen
*/
$newPathDone = $pathDone ;
$newPathDone [ ] = $nextPoint ;
$newVisitedPoint = $visitedPoint ;
$newVisitedPoint [ ] = $currentPoint ;
$newTime = $time + $paths [ $currentPoint ] [ $nextPoint ] [ 'time' ] ;
makeOneStep( $nextPoint , $endPoint , $paths , $newPathDone , $newVisitedPoint , $newTime ) ;
}
}
/** Выбор оптимального пути по времени */
$minTime = PHP_INT_MAX;
foreach ( $allPath as $path ) {
if ( $path [ 'time' ] < $minTime ) {
$minTime = $path [ 'time' ] ;
$bestPath = $path ;
}
}
return $bestPath ;
}
function printTargetPath( $startPoint , $endPoint , $targetPath , $paths , $pointNames , $transportName )
{
$countTargetPoint = count ( $targetPath [ 'path' ] ) ;
echo "Начальная точка: {$pointNames [$startPoint ]}\n " ;
for ( $i = 0 ; $i < $countTargetPoint - 1 ; $i ++ ) {
/** Определение випа транспорта */
$nmtransport = $transportName [ $paths [ $targetPath [ 'path' ] [ $i ] ] [ $targetPath [ 'path' ] [ $i + 1 ] ] [ 'by' ] ] ;
echo "Из нее {$nmtransport} до точки {$pointNames [$targetPath ['path'][$i + 1]]} {$paths [$targetPath ['path'][$i ]][$targetPath ['path'][$i + 1]]['time']} минут\n " ;
}
echo "В итоге ты попадаешь в точку " . $pointNames [ $endPoint ] . " за " . $targetPath [ 'time' ] . " минут. Приятной поездки!" ;
}
$pathDone = array ( $startPoint ) ; $time = 0 ;
$targetPath = makeOneStep( $startPoint , $endPoint , $paths , $pathDone , $visitedPoint , $time ) ;
printTargetPath( $startPoint , $endPoint , $targetPath , $paths , $pointNames , $transportName ) ;
?>
PD9waHAKICAgIGVycm9yX3JlcG9ydGluZygtMSk7CiAgICAKICAgIGRlZmluZSgnU1VCV0FZJywgJ3N1YicpOwogICAgZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKICAgIGRlZmluZSgnQlVTJywgJ2J1cycpOwoKICAgICR0cmFuc3BvcnROYW1lID0gYXJyYXkoCiAgICAgICAgU1VCV0FZICA9PiAgJ9C10LTQtdGI0Ywg0L3QsCDQvNC10YLRgNC+JywKICAgICAgICBGT09UICAgID0+ICAn0LjQtNC10YjRjCDQv9C10YjQutC+0LwnLAogICAgICAgIEJVUyAgICAgPT4gICfQtdC00LXRiNGMINC90LAg0LDQstGC0L7QsdGD0YHQtScKICAgICk7CiAgICAgCiAgICAkc3RhcnRQb2ludCA9ICdwZXQnOyAvLyDQn9C10YLRgNC+0LPRgNCw0LTRgdC60LDRjwogICAgJGVuZFBvaW50ID0gJ25vdic7IC8vINCd0L7QstCw0Y8g0JPQvtC70LvQsNC90LTQuNGPCiAgICAgCiAgICAkcG9pbnROYW1lcyA9IGFycmF5KAogICAgICAgICdwZXQnICAgPT4gICfRgdGCLiDQvC4g0J/QtdGC0YDQvtCz0YDQsNC00YHQutCw0Y8nLAogICAgICAgICdjaGsnICAgPT4gICfRgdGCLiDQvC4g0KfQutCw0LvQvtCy0YHQutCw0Y8nLAogICAgICAgICdnb3InICAgPT4gICfRgdGCLiDQvC4g0JPQvtGA0YzQutC+0LLRgdC60LDRjycsCiAgICAgICAgJ3NwbycgICA9PiAgJ9GB0YIuINC8LiDQodC/0L7RgNGC0LjQstC90LDRjycsCiAgICAgICAgJ3ZhcycgICA9PiAgJ9GB0YIuINC8LiDQktCw0YHQuNC70LXQvtGB0YLRgNC+0LLRgdC60LDRjycsCiAgICAgICAgJ2tyZScgICA9PiAgJ9Cf0LXRgtGA0L7Qv9Cw0LLQu9C+0LLRgdC60LDRjyDQutGA0LXQv9C+0YHRgtGMJywKICAgICAgICAnbGV0JyAgID0+ICAn0JvQtdGC0L3QuNC5INGB0LDQtCcsCiAgICAgICAgJ2R2bycgICA9PiAgJ9CU0LLQvtGA0YbQvtCy0LDRjyDQv9C70L7RidCw0LTRjCcsCiAgICAgICAgJ2lzYScgICA9PiAgJ9CY0YHQsNC60LjQtdCy0YHQutC40Lkg0YHQvtCx0L7RgCcsCiAgICAgICAgJ25vdicgICA9PiAgJ9Cd0L7QstCw0Y8g0JPQvtC70LvQsNC90LTQuNGPJywKICAgICAgICAncmFzJyAgID0+ICAn0JTQvtC8INCg0LDRgdC60L7Qu9GM0L3QuNC60L7QstCwJywKICAgICAgICAnZ29zJyAgID0+ICAn0JPQvtGB0YLQuNC90YvQuSDQlNCy0L7RgCcsCiAgICAgICAgJ3NlbicgICA9PiAgJ9Ch0LXQvdC90LDRjyDQn9C70L7RidCw0LTRjCcsCiAgICAgICAgJ3ZsYScgICA9PiAgJ9GB0YIuINC8LiDQktC70LDQtNC40LzQuNGA0YHQutCw0Y8nLAogICAgICAgICd2aXQnICAgPT4gICfQktC40YLQtdCx0YHQutC40Lkg0LLQvtC60LfQsNC7JywKICAgICAgICAndGVoJyAgID0+ICAn0KLQtdGF0L3QvtC70L7Qs9C40YfQtdGB0LrQuNC5INCY0L3RgdGC0LjRgtGD0YInCiAgICApOwogICAgIAogICAgJHBhdGhzID0gYXJyYXkoCiAgICAgICAgJ3BldCcgICA9PiAgYXJyYXkoCiAgICAgICAgICAgICdjaGsnICAgPT4gIGNhbkdldCgxMCwgQlVTKSwKICAgICAgICAgICAgJ2dvcicgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICAgICApLAogICAgIAogICAgICAgICdjaGsnICAgPT4gIGFycmF5KAogICAgICAgICAgICAncGV0JyAgID0+ICBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgICAgICdzcG8nICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpCiAgICAgICAgKSwKICAgICAKICAgICAgICAnZ29yJyAgID0+ICBhcnJheSgKICAgICAgICAgICAgJ3BldCcgICA9PiAgY2FuR2V0KDMsIEJVUyksCiAgICAgICAgICAgICdrcmUnICAgPT4gIGNhbkdldCg1LCBGT09UKSwKICAgICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDYsIFNVQldBWSkKICAgICAgICApLAogICAgIAogICAgICAgICdzcG8nICAgPT4gIGFycmF5KAogICAgICAgICAgICAnY2hrJyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoNywgU1VCV0FZKQogICAgICAgICksCiAgICAgCiAgICAgICAgJ3ZhcycgICA9PiAgYXJyYXkoCiAgICAgICAgICAgICdzcG8nICAgPT4gIGNhbkdldCgxMCwgQlVTKSwKICAgICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgICAgICdub3YnICAgPT4gIGNhbkdldCgxMSwgRk9PVCkKICAgICAgICApLAogICAgIAogICAgICAgICdrcmUnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnZ29yJyAgID0+ICBjYW5HZXQoNSwgRk9PVCkKICAgICAgICApLAogICAgIAogICAgICAgICdsZXQnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICAgICdnb3MnICAgPT4gIGNhbkdldCg3LCBGT09UKQogICAgICAgICksCiAgICAgCiAgICAgICAgJ2R2bycgICA9PiAgYXJyYXkoCiAgICAgICAgICAgICdpc2EnICAgPT4gIGNhbkdldCg2LCBGT09UKSwKICAgICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICAgICAnbGV0JyAgID0+ICBjYW5HZXQoNiwgRk9PVCkKICAgICAgICApLAogICAgIAogICAgICAgICdpc2EnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICAgICdub3YnICAgPT4gIGNhbkdldCg1LCBGT09UKQogICAgICAgICksCiAgICAgCiAgICAgICAgJ25vdicgICA9PiAgYXJyYXkoCiAgICAgICAgICAgICd2YXMnICAgPT4gIGNhbkdldCgxMSwgRk9PVCksCiAgICAgICAgICAgICdpc2EnICAgPT4gIGNhbkdldCg1LCBGT09UKSwKICAgICAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDcsIEJVUykKICAgICAgICApLAogICAgIAogICAgICAgICdyYXMnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnbm92JyAgID0+ICBjYW5HZXQoNywgQlVTKSwKICAgICAgICAgICAgJ3NlbicgICA9PiAgY2FuR2V0KDMsIEZPT1QpCiAgICAgICAgKSwKICAgICAKICAgICAgICAnZ29zJyAgID0+ICBhcnJheSgKICAgICAgICAgICAgJ3ZhcycgICA9PiAgY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICAgICAnZHZvJyAgID0+ICBjYW5HZXQoNiwgRk9PVCksCiAgICAgICAgICAgICdnb3InICAgPT4gIGNhbkdldCg2LCBTVUJXQVkpLAogICAgICAgICAgICAnbGV0JyAgID0+ICBjYW5HZXQoNywgRk9PVCksCiAgICAgICAgICAgICd2bGEnICAgPT4gIGNhbkdldCg3LCBGT09UKSAgICAgICAgCiAgICAgICAgKSwKICAgICAKICAgICAgICAnc2VuJyAgID0+ICBhcnJheSgKICAgICAgICAgICAgJ3JhcycgICA9PiAgY2FuR2V0KDMsIEZPT1QpLAogICAgICAgICAgICAnc3BvJyAgID0+ICBjYW5HZXQoNywgU1VCV0FZKSwKICAgICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgICAgICd2bGEnICAgPT4gIGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICAgICAndml0JyAgID0+ICBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAgICAgJ3RlaCcgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICAgICApLAogICAgIAogICAgICAgICd2bGEnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoNCwgU1VCV0FZKSwKICAgICAgICAgICAgJ2dvcycgICA9PiAgY2FuR2V0KDcsIEZPT1QpLAogICAgICAgICAgICAndml0JyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKQogICAgICAgICksCiAgICAgCiAgICAgICAgJ3ZpdCcgICA9PiAgYXJyYXkoCiAgICAgICAgICAgICdzZW4nICAgPT4gIGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICAgICAndGVoJyAgID0+ICBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAgICAgJ3ZsYScgICA9PiAgY2FuR2V0KDMsIFNVQldBWSkKICAgICAgICApLAogICAgIAogICAgICAgICd0ZWgnICAgPT4gIGFycmF5KAogICAgICAgICAgICAnc2VuJyAgID0+ICBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAgICAgJ3ZpdCcgICA9PiAgY2FuR2V0KDIsIFNVQldBWSkgICAgICAgIAogICAgICAgICkKICAgICk7CgogICAgZnVuY3Rpb24gY2FuR2V0KCR0aW1lLCAkYnlXaGF0KSAKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ3RpbWUnICAgICA9PiAgJHRpbWUsICdieScgPT4gICRieVdoYXQpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBtYWtlT25lU3RlcCgkY3VycmVudFBvaW50LCAkZW5kUG9pbnQsICRwYXRocywgJHBhdGhEb25lLCAkdmlzaXRlZFBvaW50LCAkdGltZSkKICAgIHsKICAgICAgICAgICAgc3RhdGljICRhbGxQYXRoID0gYXJyYXkoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXRoc1skY3VycmVudFBvaW50XSBhcyAkbmV4dFBvaW50ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCRuZXh0UG9pbnQgPT0gJGVuZFBvaW50KSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ3BhdGgnXSA9ICRwYXRoRG9uZTsKICAgICAgICAgICAgICAgICRyZXN1bHRbJ3BhdGgnXVtdID0gJGVuZFBvaW50OwogICAgICAgICAgICAgICAgJHJlc3VsdFsndGltZSddID0gJHRpbWUgKyAkcGF0aHNbJGN1cnJlbnRQb2ludF1bJGVuZFBvaW50XVsndGltZSddOzsKICAgICAgICAgICAgICAgICRhbGxQYXRoW10gPSAkcmVzdWx0OwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCFpbl9hcnJheSgkbmV4dFBvaW50LCAkdmlzaXRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgICAgIC8qKiDQtdGB0LvQuCDQvtGC0L/RgNCw0LLQuNGC0Ywg0LzQsNGB0YHQuNCyIHZpc2l0ZWRQb2ludCDQuCBwYXRoRG9uZSwg0YLQviDQtNC70Y8g0L/QvtGB0LvQtdC00YPRjtGJ0LjRhSDRgdC+0YHQtdC00L3QuNGFINGC0L7Rh9C10LogKG5leHRQb2ludCkKICAgICAgICAgICAgICAgICAgICAgKiAg0L7QvdC4INCx0YPQtNGD0YIg0YHQvtC00LXRgNC20LDRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINGBINC/0YDQtdC00YvQtNGD0YnQtdC5INGB0L7RgdC10LTQvdC10Lkg0YLQvtGH0LrQuCwgCiAgICAgICAgICAgICAgICAgICAgICogINGC0L4g0LXRgdGC0Ywg0LzQsNGB0YHQuNCyINC00LvRjyB0ZWgtPnZpdCwg0LHRg9C00LXRgiDRgdC+0LTQtdGA0LbQsNGC0Ywg0LjQvdGE0L7RgNCw0YbQuNGOINC+INC/0YPRgtC4INC00LvRjyB0ZWgtPnNlbiAgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgJG5ld1BhdGhEb25lID0gJHBhdGhEb25lOwogICAgICAgICAgICAgICAgICAgICRuZXdQYXRoRG9uZVtdID0gJG5leHRQb2ludDsKICAgICAgICAgICAgICAgICAgICAkbmV3VmlzaXRlZFBvaW50ID0gJHZpc2l0ZWRQb2ludDsKICAgICAgICAgICAgICAgICAgICAkbmV3VmlzaXRlZFBvaW50W10gPSAkY3VycmVudFBvaW50OwogICAgICAgICAgICAgICAgICAgICRuZXdUaW1lID0gJHRpbWUgKyAkcGF0aHNbJGN1cnJlbnRQb2ludF1bJG5leHRQb2ludF1bJ3RpbWUnXTsKICAgICAgICAgICAgICAgICAgICBtYWtlT25lU3RlcCgkbmV4dFBvaW50LCAkZW5kUG9pbnQsICRwYXRocywgJG5ld1BhdGhEb25lLCAkbmV3VmlzaXRlZFBvaW50LCAkbmV3VGltZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgLyoqINCS0YvQsdC+0YAg0L7Qv9GC0LjQvNCw0LvRjNC90L7Qs9C+INC/0YPRgtC4INC/0L4g0LLRgNC10LzQtdC90LggKi8KICAgICAgICAKICAgICAgICAkYmVzdFBhdGggPSBhcnJheSgpOwogICAgICAgICRtaW5UaW1lID0gUEhQX0lOVF9NQVg7CiAgICAgICAgCiAgICAgICAgZm9yZWFjaCAoJGFsbFBhdGggYXMgJHBhdGgpIHsKICAgICAgICAgICAgaWYgKCRwYXRoWyd0aW1lJ10gPCAkbWluVGltZSkgewogICAgICAgICAgICAgICAgJG1pblRpbWUgPSAkcGF0aFsndGltZSddOwogICAgICAgICAgICAgICAgJGJlc3RQYXRoID0gJHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRiZXN0UGF0aDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gcHJpbnRUYXJnZXRQYXRoKCRzdGFydFBvaW50LCAkZW5kUG9pbnQsICR0YXJnZXRQYXRoLCAkcGF0aHMsICRwb2ludE5hbWVzLCAkdHJhbnNwb3J0TmFtZSkKICAgIHsgICAKICAgICAgICAkY291bnRUYXJnZXRQb2ludCA9IGNvdW50KCR0YXJnZXRQYXRoWydwYXRoJ10pOwogICAgICAgIAogICAgICAgIGVjaG8gItCd0LDRh9Cw0LvRjNC90LDRjyDRgtC+0YfQutCwOiB7JHBvaW50TmFtZXNbJHN0YXJ0UG9pbnRdfVxuIjsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkY291bnRUYXJnZXRQb2ludCAtIDE7ICRpKyspIHsKICAgICAgICAgICAgLyoqINCe0L/RgNC10LTQtdC70LXQvdC40LUg0LLQuNC/0LAg0YLRgNCw0L3RgdC/0L7RgNGC0LAgKi8KICAgICAgICAgICAgJG5tdHJhbnNwb3J0ID0gJHRyYW5zcG9ydE5hbWVbJHBhdGhzWyR0YXJnZXRQYXRoWydwYXRoJ11bJGldXVskdGFyZ2V0UGF0aFsncGF0aCddWyRpICsgMV1dWydieSddXTsKICAgICAgICAgICAgZWNobyAi0JjQtyDQvdC10LUgeyRubXRyYW5zcG9ydH0g0LTQviDRgtC+0YfQutC4IHskcG9pbnROYW1lc1skdGFyZ2V0UGF0aFsncGF0aCddWyRpICsgMV1dfSB7JHBhdGhzWyR0YXJnZXRQYXRoWydwYXRoJ11bJGldXVskdGFyZ2V0UGF0aFsncGF0aCddWyRpICsgMV1dWyd0aW1lJ119INC80LjQvdGD0YJcbiI7CiAgICAgICAgfQogICAgICAgIGVjaG8gItCSINC40YLQvtCz0LUg0YLRiyDQv9C+0L/QsNC00LDQtdGI0Ywg0LIg0YLQvtGH0LrRgyAiIC4gJHBvaW50TmFtZXNbJGVuZFBvaW50XSAuICIg0LfQsCAiIC4gJHRhcmdldFBhdGhbJ3RpbWUnXSAuICIg0LzQuNC90YPRgi4g0J/RgNC40Y/RgtC90L7QuSDQv9C+0LXQt9C00LrQuCEiIDsKICAgIH0KICAgIAogICAgJHZpc2l0ZWRQb2ludCA9IGFycmF5KCk7CiAgICAkcGF0aERvbmUgPSBhcnJheSgkc3RhcnRQb2ludCk7CiAgICAkdGFyZ2V0UGF0aCA9IGFycmF5KCk7CiAgICAkdGltZSA9IDA7CgogICAgJHRhcmdldFBhdGggPSBtYWtlT25lU3RlcCgkc3RhcnRQb2ludCwgJGVuZFBvaW50LCAkcGF0aHMsICRwYXRoRG9uZSwgJHZpc2l0ZWRQb2ludCwgJHRpbWUpOwogICAgcHJpbnRUYXJnZXRQYXRoKCRzdGFydFBvaW50LCAkZW5kUG9pbnQsICR0YXJnZXRQYXRoLCAkcGF0aHMsICRwb2ludE5hbWVzLCAkdHJhbnNwb3J0TmFtZSk7CiAgICAKPz4=