주유비에 왕복 기름값까지 더한 총비용으로 줄을 세웁니다.
평균보다 쌈
평균 수준
평균보다 비쌈
주유소 목록
이 가격은 어디서 오나요
한국석유공사 오피넷이 공개하는 주유소별 판매가격입니다. 주유소가 신고한 값이라
실제 결제 금액과 다를 수 있고, 반영에 시차가 생기기도 합니다. 방문 전 확인을 권합니다.
지도의 핀 색은 목록 평균과의 차이를 나타냅니다. 파란색일수록 싸고
주황색일수록 비쌉니다. 핀에 적힌 숫자가 리터당 가격입니다.
더 싼 주유소가 왜 1등이 아닌가요
리터당 30원 싼 주유소라도 10km 더 멀면, 아끼는 돈보다 가는 데 태우는 기름값이
더 나갈 수 있습니다. 그래서 리터당 가격이 아니라 실제로 지갑에서 나가는 돈으로
줄을 세웁니다.
총비용 = 리터당 가격 × 주유량 + 왕복 주행에 드는 기름값
연비 12km/L 차에 40L를 넣는다고 해보겠습니다.
| A 주유소 | B 주유소 |
| 리터당 가격 | 1,598원 | 1,565원 (33원 쌈) |
| 거리(편도) | 3km | 13km |
| 40L 주유비 | 63,920원 | 62,600원 |
| 왕복 기름값 | 799원 | 3,391원 |
| 총비용 | 64,719원 | 65,991원 |
리터당 가격은 B가 싸지만, 실제로 내는 돈은 A가 1,272원 적습니다.
목록에서 B의 총비용 옆에 +1,272원이라고 붙는 것이 이 차액입니다.
맨 위 주유소에는 최저라고 표시됩니다.
내 차 연비와 평소 주유량을 바꾸면 값이 다시 계산됩니다. 연비가 좋을수록, 주유량이 많을수록
멀리 가는 것이 유리해집니다.
거리는 어떻게 나오나요
표시되는 거리는 직선거리에 도로 보정계수 1.35배를 적용한 예상 주행거리이고,
소요시간은 도심 평균 시속 32km 가정입니다. 실제 도로 경로 계산은 라우팅 서버가 필요해서
현재는 추정치를 쓰고 있습니다.
정확한 경로가 필요하면 목록 오른쪽 › 버튼이나 지도 팝업의 길찾기를
누르세요. 카카오맵으로 바로 연결되어 실제 도로 기준 거리와 시간을 보여줍니다.
수집 기준일 2026-11-03 · 좌표는 오피넷 KATEC 좌표를 WGS84로 변환한 값입니다.
지도 데이터 © OpenStreetMap 기여자
dmFyIEQ9SlNPTi5wYXJzZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHBoLWRhdGE0NzExNGY1M2ExJykudGV4dENvbnRlbnQpOwp2YXIgVEhFTUVfSUNPPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09J2RhcmsnPyc8c3ZnIGNsYXNzPSJ0cGgtaSBpY28tcyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjciIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgYXJpYS1oaWRkZW49InRydWUiPjxwYXRoIGQ9Ik0yMCAxNC41QTguNSA4LjUgMCAwIDEgOS41IDRhOC41IDguNSAwIDEgMCAxMC41IDEwLjV6Ii8+PC9zdmc+Jzp0PT09J2xpZ2h0Jz8nPHN2ZyBjbGFzcz0idHBoLWkgaWNvLXMiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMTIgNy41YTQuNSA0LjUgMCAxIDAgMCA5IDQuNSA0LjUgMCAwIDAgMC05ek0xMiAydjJNMTIgMjB2Mk00LjIgNC4ybDEuNCAxLjRNMTguNCAxOC40bDEuNCAxLjRNMiAxMmgyTTIwIDEyaDJNNC4yIDE5LjhsMS40LTEuNE0xOC40IDUuNmwxLjQtMS40Ii8+PC9zdmc+JzonPHN2ZyBjbGFzcz0idHBoLWkgaWNvLXMiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMTIgM2E5IDkgMCAxIDAgMCAxOCA5IDkgMCAwIDAgMC0xOHpNMTIgM3YxOGE5IDkgMCAwIDAgMC0xOHoiLz48L3N2Zz4nO307Cgp2YXIgJD1mdW5jdGlvbihpKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RwaC0nK2kpO307CnZhciB2PWZ1bmN0aW9uKGkpe3ZhciBlPSQoaSk7cmV0dXJuIGU/KCtlLnZhbHVlfHwwKTowO307CnZhciBzPWZ1bmN0aW9uKGkpe3ZhciBlPSQoaSk7cmV0dXJuIGU/ZS52YWx1ZTonJzt9Owp2YXIgZj1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5yb3VuZChuKS50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQJzt9Owp2YXIgZmQ9ZnVuY3Rpb24obixkKXtyZXR1cm4gbi50b0xvY2FsZVN0cmluZygna28tS1InLHttYXhpbXVtRnJhY3Rpb25EaWdpdHM6ZHx8MX0pO307CnZhciBjdXQxMD1mdW5jdGlvbih4KXtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJvdW5kKHgpLzEwKSoxMDt9Owp2YXIgc2V0PWZ1bmN0aW9uKGksdCl7dmFyIGU9JChpKTtpZighZSlyZXR1cm47aWYoaT09PSdtYWluJyl7Y291bnRVcChlLHQpO31lbHNle2UudGV4dENvbnRlbnQ9dDt9fTsKCi8qIOyViOyghO2VnCDsoIDsnqXshowg7KCR6re8IOKAlCDsi5ztgazrpr8g66qo65OcL+ywqOuLqCDtmZjqsr3sl5DshJzrj4Qg7KO97KeAIOyViuqyjCAqLwp2YXIgc3RvcmU9ewogIGdldDpmdW5jdGlvbihrKXt0cnl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGspO31jYXRjaChlKXtyZXR1cm4gbnVsbDt9fSwKICBzZXQ6ZnVuY3Rpb24oayx2YWwpe3RyeXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrLHZhbCk7fWNhdGNoKGUpe319LAogIGRlbDpmdW5jdGlvbihrKXt0cnl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oayk7fWNhdGNoKGUpe319Cn07Cgp2YXIgdG9hc3Q9ZnVuY3Rpb24obXNnKXsKICB2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHBoLXRvYXN0Jyk7CiAgaWYoIXQpe3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7dC5jbGFzc05hbWU9J3RwaC10b2FzdCc7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTt9CiAgdC50ZXh0Q29udGVudD1tc2c7dC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgY2xlYXJUaW1lb3V0KHQuX2gpO3QuX2g9c2V0VGltZW91dChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO30sMTkwMCk7Cn07CgovKiDthYzrp4gg7Yag6riAOiDsi5zsiqTthZwg7ISk7KCVIOKGkiDrnbzsnbTtirgg4oaSIOuLpO2BrCDsiJztmZggKi8KZnVuY3Rpb24gaW5pdFRoZW1lKHJvb3QpewogIHZhciBLPSd0cGgtdGhlbWUnLCBjdXI9c3RvcmUuZ2V0KEspOwogIGlmKGN1cikgcm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLGN1cik7CiAgdmFyIGI9JCgndGhlbWUnKTsKICBpZighYikgcmV0dXJuOwogIHZhciBsYWJlbD1mdW5jdGlvbigpewogICAgdmFyIHQ9cm9vdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnKTsKICAgIGIuaW5uZXJIVE1MPVRIRU1FX0lDTyh0KSsnIDxzcGFuPicrKHQ9PT0nZGFyayc/J+uLpO2BrCc6dD09PSdsaWdodCc/J+udvOydtO2KuCc6J+yekOuPmScpKyc8L3NwYW4+JzsKICB9OwogIGxhYmVsKCk7CiAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHZhciB0PXJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7CiAgICB2YXIgbng9IXQ/J2xpZ2h0Jzp0PT09J2xpZ2h0Jz8nZGFyayc6Jyc7CiAgICBpZihueCl7cm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLG54KTtzdG9yZS5zZXQoSyxueCk7fQogICAgZWxzZXtyb290LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10aGVtZScpO3N0b3JlLmRlbChLKTt9CiAgICBsYWJlbCgpOwogIH0pOwp9CgovKiDsnoXroKXqsJIg4oaUIFVSTCDtjIzrnbzrr7jthLAg4oaUIGxvY2FsU3RvcmFnZSAqLwpmdW5jdGlvbiBpbml0U3RhdGUoc2x1ZywgaWRzLCBvbmNoYW5nZSl7CiAgdmFyIEtFWT0ndHBoLWluLScrc2x1ZywgcT1uZXcgVVJMU2VhcmNoUGFyYW1zKGxvY2F0aW9uLnNlYXJjaCksIHVzZWQ9ZmFsc2U7CiAgaWRzLmZvckVhY2goZnVuY3Rpb24oaSl7CiAgICB2YXIgZT0kKGkpOyBpZighZSkgcmV0dXJuOwogICAgaWYocS5oYXMoaSkpeyBlLnZhbHVlPXEuZ2V0KGkpOyB1c2VkPXRydWU7IH0KICB9KTsKICBpZighdXNlZCl7CiAgICB2YXIgcmF3PXN0b3JlLmdldChLRVkpOwogICAgaWYocmF3KXsgdHJ5eyB2YXIgbz1KU09OLnBhcnNlKHJhdyk7CiAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGkpeyB2YXIgZT0kKGkpOyBpZihlJiZvW2ldIT09dW5kZWZpbmVkJiZvW2ldIT09JycpIGUudmFsdWU9b1tpXTsgfSk7CiAgICB9Y2F0Y2goZSl7fSB9CiAgfQogIHZhciBzYXZlPWZ1bmN0aW9uKCl7CiAgICB2YXIgbz17fTsgaWRzLmZvckVhY2goZnVuY3Rpb24oaSl7IHZhciBlPSQoaSk7IGlmKGUpIG9baV09ZS52YWx1ZTsgfSk7CiAgICBzdG9yZS5zZXQoS0VZLCBKU09OLnN0cmluZ2lmeShvKSk7CiAgfTsKICB2YXIgc2hhcmU9JCgnc2hhcmUnKTsKICBpZihzaGFyZSkgc2hhcmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICB2YXIgcD1uZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihpKXsgdmFyIGU9JChpKTsgaWYoZSkgcC5zZXQoaSxlLnZhbHVlKTsgfSk7CiAgICB2YXIgdXJsPWxvY2F0aW9uLm9yaWdpbitsb2NhdGlvbi5wYXRobmFtZSsnPycrcC50b1N0cmluZygpOwogICAgdmFyIGRvbmU9ZnVuY3Rpb24oKXt0b2FzdCgn66eB7YGs66W8IOuzteyCrO2WiOyKteuLiOuLpCcpO307CiAgICBpZihuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCl7CiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHVybCkudGhlbihkb25lLGZ1bmN0aW9uKCl7cHJvbXB0KCfslYTrnpgg7KO87IaM66W8IOuzteyCrO2VmOyEuOyalCcsdXJsKTt9KTsKICAgIH0gZWxzZSBwcm9tcHQoJ+yVhOuemCDso7zshozrpbwg67O17IKs7ZWY7IS47JqUJyx1cmwpOwogIH0pOwogIHZhciBjb3B5PSQoJ2NvcHknKTsKICBpZihjb3B5KSBjb3B5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIGxpbmVzPVtkb2N1bWVudC50aXRsZS5zcGxpdCgnfCcpWzBdLnRyaW0oKV07CiAgICBpZHMuZm9yRWFjaChmdW5jdGlvbihpKXsKICAgICAgdmFyIGU9JChpKTsgaWYoIWUpIHJldHVybjsKICAgICAgdmFyIGxhYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9dHBoLScraSsnXScpOwogICAgICB2YXIgdmFsPWUudGFnTmFtZT09PSdTRUxFQ1QnP2Uub3B0aW9uc1tlLnNlbGVjdGVkSW5kZXhdLnRleHQ6KCtlLnZhbHVlfHwwKS50b0xvY2FsZVN0cmluZygna28tS1InKTsKICAgICAgaWYobGFiKSBsaW5lcy5wdXNoKCfCtyAnK2xhYi50ZXh0Q29udGVudC50cmltKCkrJzogJyt2YWwpOwogICAgfSk7CiAgICBsaW5lcy5wdXNoKCcnKTsKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50cGgtdG90YWwnKS5mb3JFYWNoKGZ1bmN0aW9uKHQpewogICAgICB2YXIgbD10LnF1ZXJ5U2VsZWN0b3IoJy5sJyksIHZhbD10LnF1ZXJ5U2VsZWN0b3IoJy52Jyk7CiAgICAgIGlmKGwmJnZhbCkgbGluZXMucHVzaChsLnRleHRDb250ZW50LnRyaW0oKSsnOiAnK3ZhbC50ZXh0Q29udGVudC50cmltKCkpOwogICAgfSk7CiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHBoLXBhZ2UgdGFibGUnKS5mb3JFYWNoKGZ1bmN0aW9uKHRiKXsKICAgICAgdGIucXVlcnlTZWxlY3RvckFsbCgndHInKS5mb3JFYWNoKGZ1bmN0aW9uKHRyKXsKICAgICAgICB2YXIgdGQ9dHIucXVlcnlTZWxlY3RvckFsbCgndGQnKTsKICAgICAgICBpZih0ZC5sZW5ndGg9PT0yKSBsaW5lcy5wdXNoKCfCtyAnK3RkWzBdLnRleHRDb250ZW50LnRyaW0oKSsnOiAnK3RkWzFdLnRleHRDb250ZW50LnRyaW0oKSk7CiAgICAgIH0pOwogICAgfSk7CiAgICBsaW5lcy5wdXNoKCcnLCBsb2NhdGlvbi5vcmlnaW4rbG9jYXRpb24ucGF0aG5hbWUpOwogICAgdmFyIHR4dD1saW5lcy5qb2luKCdcbicpOwogICAgdmFyIGRvbmU9ZnVuY3Rpb24oKXt0b2FzdCgn6rKw6rO866W8IOuzteyCrO2WiOyKteuLiOuLpCcpO307CiAgICBpZihuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodHh0KS50aGVuKGRvbmUsZG9uZSk7CiAgICBlbHNlIHsgdmFyIHRhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7IHRhLnZhbHVlPXR4dDsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7CiAgICAgICAgICAgdGEuc2VsZWN0KCk7IHRyeXtkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO31jYXRjaChlKXt9IHRhLnJlbW92ZSgpOyBkb25lKCk7IH0KICB9KTsKICB2YXIgcmVzZXQ9JCgncmVzZXQnKTsKICBpZihyZXNldCkgcmVzZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgICBzdG9yZS5kZWwoS0VZKTsgbG9jYXRpb24uaHJlZj1sb2NhdGlvbi5wYXRobmFtZTsKICB9KTsKICByZXR1cm4gc2F2ZTsKfQoKLyog6riI7JWhIOyeheugpSDrsJEg67mg66W4IOyhsOyglSDsuakgKi8KZnVuY3Rpb24gaW5pdENoaXBzKG9uY2hhbmdlKXsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHBoLWNoaXAnKS5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgYy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgdmFyIGU9JChjLmRhdGFzZXQudCk7IGlmKCFlKSByZXR1cm47CiAgICAgIHZhciBkPWMuZGF0YXNldC5kOwogICAgICBlLnZhbHVlID0gZD09PScwJyA/IDAgOiBNYXRoLm1heCgwLCgrZS52YWx1ZXx8MCkrKCtkKSk7CiAgICAgIG9uY2hhbmdlKCk7CiAgICB9KTsKICB9KTsKfQoKLyog7J6F66Cl6rCS7J2EIOyCrOuejOydtCDsnb3ripQg66y47J6l7Jy866GcICgzLDAwMCwwMDAg4oaSIDMwMOunjOybkCkgKi8KZnVuY3Rpb24ga29yTW9uZXkobil7CiAgbj1NYXRoLnJvdW5kKG4pOyBpZighbikgcmV0dXJuICcw7JuQJzsKICB2YXIgZW9rPU1hdGguZmxvb3Iobi8xMDAwMDAwMDApLCBtYW49TWF0aC5mbG9vcigobiUxMDAwMDAwMDApLzEwMDAwKSwgd29uPW4lMTAwMDAsIHA9W107CiAgaWYoZW9rKSBwLnB1c2goZW9rKyfslrUnKTsKICBpZihtYW4pIHAucHVzaChtYW4udG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJ+unjCcpOwogIGlmKHdvbikgcC5wdXNoKHdvbi50b0xvY2FsZVN0cmluZygna28tS1InKSk7CiAgcmV0dXJuIHAuam9pbignICcpKyfsm5AnOwp9CmZ1bmN0aW9uIGluaXRSZWFkKG1hcCl7CiAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsKICAgIHZhciBlPSQoaWQpLCBvdXQ9JChtYXBbaWRdKTsgaWYoIWV8fCFvdXQpIHJldHVybjsKICAgIHZhciB1cGQ9ZnVuY3Rpb24oKXsgb3V0LnRleHRDb250ZW50ID0gKCtlLnZhbHVlPjApID8ga29yTW9uZXkoK2UudmFsdWUpIDogJyc7IH07CiAgICBlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0Jyx1cGQpOyB1cGQoKTsKICB9KTsKfQoKCi8qIOyIq+yekCDsubTsmrTtirjsl4Ug4oCUIOqysOqzvOqwgCDrsJTrgJQg65WMIOu2gOuTnOufveqyjCAqLwpmdW5jdGlvbiBjb3VudFVwKGVsLCB0ZXh0KXsKICBpZighZWwpIHJldHVybjsKICB2YXIgcHJldj1lbC5fcmF3fHwnJywgY3VyPXRleHQ7CiAgZWwuX3Jhdz1jdXI7CiAgdmFyIHBuPXBhcnNlRmxvYXQoU3RyaW5nKHByZXYpLnJlcGxhY2UoL1teMC05Li1dL2csJycpKTsKICB2YXIgY249cGFyc2VGbG9hdChTdHJpbmcoY3VyKS5yZXBsYWNlKC9bXjAtOS4tXS9nLCcnKSk7CiAgdmFyIHJlZHVjZT13aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlczsKICBpZihyZWR1Y2V8fCFpc0Zpbml0ZShwbil8fCFpc0Zpbml0ZShjbil8fHBuPT09Y258fE1hdGguYWJzKGNuLXBuKTwxKXtlbC50ZXh0Q29udGVudD1jdXI7cmV0dXJuO30KICB2YXIgcHJlPWN1ci5zbGljZSgwLGN1ci5zZWFyY2goL1swLTktXS8pKTsKICB2YXIgcG9zdD1jdXIuc2xpY2UoY3VyLnNlYXJjaCgvWzAtOV1bXjAtOV0qJC8pKzEpLnJlcGxhY2UoL15bMC05XS8sJycpOwogIHZhciBzdWZmaXg9Y3VyLnJlcGxhY2UoL15bXjAtOS1dKi8sJycpLnJlcGxhY2UoL15bMC05LC5cLV0rLywnJyk7CiAgdmFyIHQwPW51bGwsIGR1cj0zODA7CiAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZWwuX2FmfHwwKTsKICBmdW5jdGlvbiBzdGVwKHQpewogICAgaWYoIXQwKSB0MD10OwogICAgdmFyIGs9TWF0aC5taW4oMSwodC10MCkvZHVyKSwgZT0xLU1hdGgucG93KDEtaywzKTsKICAgIHZhciB2YWw9cG4rKGNuLXBuKSplOwogICAgZWwudGV4dENvbnRlbnQ9cHJlK01hdGgucm91bmQodmFsKS50b0xvY2FsZVN0cmluZygna28tS1InKStzdWZmaXg7CiAgICBpZihrPDEpIGVsLl9hZj1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7IGVsc2UgZWwudGV4dENvbnRlbnQ9Y3VyOwogIH0KICBlbC5fYWY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOwp9CgovKiDrqqjrsJTsnbwg6rOg7KCVIOqysOqzvOuwlCArIOunqCDsnITroZwgKi8KZnVuY3Rpb24gaW5pdFN0aWNreShyb290LCBsYWJlbCl7CiAgaWYoIXJvb3QpIHJldHVybjsKICB2YXIgbWFpbj0kKCdtYWluJyk7IGlmKCFtYWluKSByZXR1cm47CiAgdmFyIGJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICBiYXIuY2xhc3NOYW1lPSd0cGgtc3RpY2t5JzsKICBiYXIuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJsIj4nK2xhYmVsKyc8L2Rpdj48ZGl2IGNsYXNzPSJ2IiBpZD0idHBoLXN0aWNreXYiPuKApjwvZGl2Pic7CiAgcm9vdC5hcHBlbmRDaGlsZChiYXIpOwogIHZhciB0b3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgdG9wLnR5cGU9J2J1dHRvbic7IHRvcC5jbGFzc05hbWU9J3RwaC10b3AnOyB0b3Auc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywn66eoIOychOuhnCcpOwogIHRvcC5pbm5lckhUTUw9Jzxzdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgMTlWNSIvPjxwYXRoIGQ9Ik01IDEybDctNyA3IDciLz48L3N2Zz4nOwogIHRvcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt3aW5kb3cuc2Nyb2xsVG8oe3RvcDowLGJlaGF2aW9yOidzbW9vdGgnfSk7fSk7CiAgcm9vdC5hcHBlbmRDaGlsZCh0b3ApOwogIHZhciBzdj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHBoLXN0aWNreXYnKTsKICB2YXIgc3luYz1mdW5jdGlvbigpewogICAgaWYoc3YmJnN2LnRleHRDb250ZW50IT09bWFpbi50ZXh0Q29udGVudCkgc3YudGV4dENvbnRlbnQ9bWFpbi50ZXh0Q29udGVudDsKICAgIHZhciByPW1haW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBiYXIuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCByLmJvdHRvbTw1Nik7CiAgICB0b3AuY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB3aW5kb3cuc2Nyb2xsWT41MDApOwogIH07CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsc3luYyx7cGFzc2l2ZTp0cnVlfSk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsc3luYyk7CiAgaWYod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIpIG5ldyBNdXRhdGlvbk9ic2VydmVyKHN5bmMpLm9ic2VydmUobWFpbix7Y2hpbGRMaXN0OnRydWUsY2hhcmFjdGVyRGF0YTp0cnVlLHN1YnRyZWU6dHJ1ZX0pOwogIHN5bmMoKTsKfQoKLyog4pSA4pSAIOywqO2KuCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAg7IOJ7J2AIENTUyDrs4DsiJggLS1zMS8tLXMyLy0tczMgKOqygOymneuQnCDsubTthYzqs6Drpqwg7YyU66CI7Yq4KS4KICAg6rOE7Je07J20IDLqsJwg7J207IOB7J2066m0IOuylOuhgOulvCDtla3sg4Eg67aZ7J206rOgLCDqsJLsnYAg7ZGc7JeQ64+EIOq3uOuMgOuhnCDsnojri6QuICovCnZhciBTVkdOUz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwpmdW5jdGlvbiBlbCh0LGEpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdOUyx0KTtmb3IodmFyIGsgaW4gYSllLnNldEF0dHJpYnV0ZShrLGFba10pO3JldHVybiBlO30KCmZ1bmN0aW9uIHRpcChib3gpewogIHZhciB0PWJveC5xdWVyeVNlbGVjdG9yKCcudHBoLXRpcCcpOwogIGlmKCF0KXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3QuY2xhc3NOYW1lPSd0cGgtdGlwJztib3guYXBwZW5kQ2hpbGQodCk7fQogIHJldHVybiB0Owp9CmZ1bmN0aW9uIHNob3dUaXAoYm94LHgseSxodG1sKXsKICB2YXIgdD10aXAoYm94KTsgdC5pbm5lckhUTUw9aHRtbDsgdC5zdHlsZS5vcGFjaXR5PScxJzsKICB2YXIgdz10Lm9mZnNldFdpZHRoLCBidz1ib3guY2xpZW50V2lkdGg7CiAgdC5zdHlsZS5sZWZ0PU1hdGgubWF4KDQsTWF0aC5taW4oYnctdy00LHgtdy8yKSkrJ3B4JzsKICB0LnN0eWxlLnRvcD1NYXRoLm1heCgyLHktdC5vZmZzZXRIZWlnaHQtMTApKydweCc7Cn0KZnVuY3Rpb24gaGlkZVRpcChib3gpe3ZhciB0PWJveC5xdWVyeVNlbGVjdG9yKCcudHBoLXRpcCcpO2lmKHQpdC5zdHlsZS5vcGFjaXR5PScwJzt9CgovKiDshLjroZwg64iE7KCBIOunieuMgCDigJQgY2F0czpb652867KoXSwgc2VyaWVzOlt7bmFtZSxjbHMsZGF0YTpbXX1dICovCmZ1bmN0aW9uIHN0YWNrQ2hhcnQoYm94SWQsIGNhdHMsIHNlcmllcywgZm10KXsKICB2YXIgYm94PSQoYm94SWQpOyBpZighYm94KSByZXR1cm47CiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N2ZywudHBoLWxlZ2VuZCcpLmZvckVhY2goZnVuY3Rpb24obil7bi5yZW1vdmUoKTt9KTsKICB2YXIgVz02NjAsSD0yMzYsUEw9OCxQUj04LFBUPTE0LFBCPTI2OwogIHZhciBuPWNhdHMubGVuZ3RoOyBpZighbikgcmV0dXJuOwogIHZhciB0b3RhbHM9Y2F0cy5tYXAoZnVuY3Rpb24oXyxpKXtyZXR1cm4gc2VyaWVzLnJlZHVjZShmdW5jdGlvbihhLHMpe3JldHVybiBhKyhzLmRhdGFbaV18fDApO30sMCk7fSk7CiAgdmFyIG1heD1NYXRoLm1heC5hcHBseShudWxsLHRvdGFscyl8fDE7CiAgdmFyIGl3PVctUEwtUFIsIGloPUgtUFQtUEI7CiAgdmFyIGJ3PU1hdGgubWF4KDYsTWF0aC5taW4oNDYsaXcvbiowLjY4KSksIHN0ZXA9aXcvbjsKICB2YXIgc3ZnPWVsKCdzdmcnLHt2aWV3Qm94OicwIDAgJytXKycgJytILHJvbGU6J2ltZyd9KTsKICBmb3IodmFyIGc9MDtnPD0zO2crKyl7CiAgICB2YXIgZ3k9UFQraWgqZy8zOwogICAgc3ZnLmFwcGVuZENoaWxkKGVsKCdsaW5lJyx7eDE6UEwseTE6Z3kseDI6Vy1QUix5MjpneSwnY2xhc3MnOidnbCd9KSk7CiAgfQogIGNhdHMuZm9yRWFjaChmdW5jdGlvbihjLGkpewogICAgdmFyIGN4PVBMK3N0ZXAqaStzdGVwLzIsIHk9UFQraWgsIGFjYz0wOwogICAgc2VyaWVzLmZvckVhY2goZnVuY3Rpb24ocyxzaSl7CiAgICAgIHZhciB2YWw9cy5kYXRhW2ldfHwwOyBpZih2YWw8PTApIHJldHVybjsKICAgICAgdmFyIGg9dmFsL21heCppaDsgeS09aDsgYWNjKz12YWw7CiAgICAgIHZhciBpc1RvcCA9IHNpPT09c2VyaWVzLmxlbmd0aC0xIHx8ICFzZXJpZXMuc2xpY2Uoc2krMSkuc29tZShmdW5jdGlvbih6KXtyZXR1cm4gKHouZGF0YVtpXXx8MCk+MDt9KTsKICAgICAgdmFyIHI9ZWwoJ3JlY3QnLHt4OmN4LWJ3LzIseTp5LHdpZHRoOmJ3LGhlaWdodDpNYXRoLm1heCgxLGgpLCdjbGFzcyc6cy5jbHMsCiAgICAgICAgICAgICAgICAgICAgICAgcng6aXNUb3A/NDowLHJ5OmlzVG9wPzQ6MH0pOwogICAgICBzdmcuYXBwZW5kQ2hpbGQocik7CiAgICB9KTsKICAgIHZhciBoaXQ9ZWwoJ3JlY3QnLHt4OmN4LXN0ZXAvMisxLHk6UFQsd2lkdGg6c3RlcC0yLGhlaWdodDppaCwnY2xhc3MnOidoaXQnfSk7CiAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxmdW5jdGlvbihldil7CiAgICAgIHZhciBicj1ib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciByb3dzPXNlcmllcy5tYXAoZnVuY3Rpb24ocyl7CiAgICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czoycHg7JwogICAgICAgICAgICAgKyAnYmFja2dyb3VuZDp2YXIoLS0nK3MuY2xzKycpO21hcmdpbi1yaWdodDo2cHgiPjwvc3Bhbj4nK3MubmFtZSsnICcrZm10KHMuZGF0YVtpXXx8MCk7CiAgICAgIH0pLmpvaW4oJzxicj4nKTsKICAgICAgc2hvd1RpcChib3gsZXYuY2xpZW50WC1ici5sZWZ0LGV2LmNsaWVudFktYnIudG9wLAogICAgICAgICAgICAgICc8Yj4nK2MrJzwvYj48YnI+Jytyb3dzKyc8YnI+7ZWp6rOEICcrZm10KGFjYykpOwogICAgfSk7CiAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsZnVuY3Rpb24oKXtoaWRlVGlwKGJveCk7fSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoaGl0KTsKICAgIGlmKG48PTE0fHxpJU1hdGguY2VpbChuLzEyKT09PTApCiAgICAgIHN2Zy5hcHBlbmRDaGlsZChPYmplY3QuYXNzaWduKGVsKCd0ZXh0Jyx7eDpjeCx5OkgtOCwnY2xhc3MnOidsYicsJ3RleHQtYW5jaG9yJzonbWlkZGxlJ30pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dENvbnRlbnQ6Y30pKTsKICB9KTsKICBib3guYXBwZW5kQ2hpbGQoc3ZnKTsKICBib3guYXBwZW5kQ2hpbGQobGVnZW5kKHNlcmllcykpOwp9CgovKiDqsIDroZwg64iE7KCBIOunieuMgCjqtazshLEpIOKAlCBzZWdzOlt7bmFtZSxjbHMsdmFsdWV9XSDCtyDsp4HsoJEg652867KoICovCmZ1bmN0aW9uIGhTdGFjayhib3hJZCwgc2VncywgZm10KXsKICB2YXIgYm94PSQoYm94SWQpOyBpZighYm94KSByZXR1cm47CiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N2ZywudHBoLWxlZ2VuZCcpLmZvckVhY2goZnVuY3Rpb24obil7bi5yZW1vdmUoKTt9KTsKICB2YXIgdG90YWw9c2Vncy5yZWR1Y2UoZnVuY3Rpb24oYSxzKXtyZXR1cm4gYStNYXRoLm1heCgwLHMudmFsdWUpO30sMCl8fDE7CiAgdmFyIFc9NjYwLEg9NjQsUEw9OCxQUj04LEJIPTM0LFRZPTEyOwogIHZhciBzdmc9ZWwoJ3N2Zycse3ZpZXdCb3g6JzAgMCAnK1crJyAnK0gscm9sZTonaW1nJ30pOwogIHZhciB4PVBMLCBpdz1XLVBMLVBSOwogIHNlZ3MuZm9yRWFjaChmdW5jdGlvbihzLGkpewogICAgdmFyIHc9TWF0aC5tYXgoMCxzLnZhbHVlKS90b3RhbCppdzsgaWYodzw9MCkgcmV0dXJuOwogICAgdmFyIGZpcnN0PWk9PT0wLCBsYXN0PWk9PT1zZWdzLmxlbmd0aC0xOwogICAgc3ZnLmFwcGVuZENoaWxkKGVsKCdyZWN0Jyx7eDp4LHk6VFksd2lkdGg6dyxoZWlnaHQ6QkgsJ2NsYXNzJzpzLmNscywKICAgICAgcng6KGZpcnN0fHxsYXN0KT80OjAscnk6KGZpcnN0fHxsYXN0KT80OjB9KSk7CiAgICB2YXIgcGN0PXMudmFsdWUvdG90YWwqMTAwOwogICAgaWYocGN0Pj05KQogICAgICBzdmcuYXBwZW5kQ2hpbGQoT2JqZWN0LmFzc2lnbihlbCgndGV4dCcse3g6eCt3LzIseTpUWStCSC8yKzQsJ2NsYXNzJzondmwnLAogICAgICAgICd0ZXh0LWFuY2hvcic6J21pZGRsZScsZmlsbDonI2ZmZid9KSx7dGV4dENvbnRlbnQ6cGN0LnRvRml4ZWQoMCkrJyUnfSkpOwogICAgdmFyIGhpdD1lbCgncmVjdCcse3g6eCx5OlRZLHdpZHRoOncsaGVpZ2h0OkJILCdjbGFzcyc6J2hpdCd9KTsKICAgIChmdW5jdGlvbihzZWcscHgscHcpewogICAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxmdW5jdGlvbihldil7CiAgICAgICAgdmFyIGJyPWJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBzaG93VGlwKGJveCxldi5jbGllbnRYLWJyLmxlZnQsZXYuY2xpZW50WS1ici50b3AsCiAgICAgICAgICAnPGI+JytzZWcubmFtZSsnPC9iPjxicj4nK2ZtdChzZWcudmFsdWUpKycgwrcgJysoc2VnLnZhbHVlL3RvdGFsKjEwMCkudG9GaXhlZCgxKSsnJScpOwogICAgICB9KTsKICAgICAgaGl0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLGZ1bmN0aW9uKCl7aGlkZVRpcChib3gpO30pOwogICAgfSkocyx4LHcpOwogICAgc3ZnLmFwcGVuZENoaWxkKGhpdCk7CiAgICB4Kz13OwogIH0pOwogIGJveC5hcHBlbmRDaGlsZChzdmcpOwogIGJveC5hcHBlbmRDaGlsZChsZWdlbmQoc2Vncy5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHtuYW1lOnMubmFtZSsnICcrZm10KHMudmFsdWUpLGNsczpzLmNsc307fSkpKTsKfQoKLyog7ISg7ZiVIOy2lOydtCDssKjtirgg4oCUIHNlcmllczpbe25hbWUsY2xzLGRhdGE6W119XSwgY2F0czpb652867KoXSAqLwpmdW5jdGlvbiBsaW5lQ2hhcnQoYm94SWQsIGNhdHMsIHNlcmllcywgZm10KXsKICB2YXIgYm94PSQoYm94SWQpOyBpZighYm94KSByZXR1cm47CiAgYm94LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N2ZywudHBoLWxlZ2VuZCcpLmZvckVhY2goZnVuY3Rpb24obil7bi5yZW1vdmUoKTt9KTsKICB2YXIgbj1jYXRzLmxlbmd0aDsgaWYobjwyKSByZXR1cm47CiAgdmFyIFc9NjYwLEg9MjQwLFBMPTU0LFBSPTEyLFBUPTE0LFBCPTI2OwogIHZhciBhbGw9W107IHNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKHMpe2FsbD1hbGwuY29uY2F0KHMuZGF0YS5maWx0ZXIoZnVuY3Rpb24odil7cmV0dXJuIHYhPW51bGw7fSkpO30pOwogIGlmKCFhbGwubGVuZ3RoKSByZXR1cm47CiAgdmFyIG14PU1hdGgubWF4LmFwcGx5KG51bGwsYWxsKSwgbW49TWF0aC5taW4uYXBwbHkobnVsbCxhbGwpOwogIHZhciBwYWQ9KG14LW1uKSowLjE1fHxteCowLjAyfHwxOyBteCs9cGFkOyBtbj1NYXRoLm1heCgwLG1uLXBhZCk7CiAgdmFyIGl3PVctUEwtUFIsIGloPUgtUFQtUEI7CiAgdmFyIFg9ZnVuY3Rpb24oaSl7cmV0dXJuIFBMK2l3KihuPT09MT8wLjU6aS8obi0xKSk7fTsKICB2YXIgWT1mdW5jdGlvbih2KXtyZXR1cm4gUFQraWgqKDEtKHYtbW4pLygobXgtbW4pfHwxKSk7fTsKICB2YXIgc3ZnPWVsKCdzdmcnLHt2aWV3Qm94OicwIDAgJytXKycgJytILHJvbGU6J2ltZyd9KTsKICBmb3IodmFyIGc9MDtnPD00O2crKyl7CiAgICB2YXIgZ3Y9bW4rKG14LW1uKSpnLzQsIGd5PVkoZ3YpOwogICAgc3ZnLmFwcGVuZENoaWxkKGVsKCdsaW5lJyx7eDE6UEwseTE6Z3kseDI6Vy1QUix5MjpneSwnY2xhc3MnOidnbCd9KSk7CiAgICBzdmcuYXBwZW5kQ2hpbGQoT2JqZWN0LmFzc2lnbihlbCgndGV4dCcse3g6UEwtOCx5Omd5KzQsJ2NsYXNzJzonbGInLCd0ZXh0LWFuY2hvcic6J2VuZCd9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0ZXh0Q29udGVudDpNYXRoLnJvdW5kKGd2KS50b0xvY2FsZVN0cmluZygna28tS1InKX0pKTsKICB9CiAgc2VyaWVzLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICB2YXIgZD0nJywgc3RhcnRlZD1mYWxzZTsKICAgIHMuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHYsaSl7CiAgICAgIGlmKHY9PW51bGwpIHJldHVybjsKICAgICAgZCs9KHN0YXJ0ZWQ/J0wnOidNJykrWChpKS50b0ZpeGVkKDEpKycgJytZKHYpLnRvRml4ZWQoMSkrJyAnOyBzdGFydGVkPXRydWU7CiAgICB9KTsKICAgIGlmKGQpIHN2Zy5hcHBlbmRDaGlsZChlbCgncGF0aCcse2Q6ZCxmaWxsOidub25lJywnc3Ryb2tlJzondmFyKC0tJytzLmNscysnKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Ryb2tlLXdpZHRoJzoyLjIsJ3N0cm9rZS1saW5lam9pbic6J3JvdW5kJywnc3Ryb2tlLWxpbmVjYXAnOidyb3VuZCd9KSk7CiAgICB2YXIgbGFzdD1zLmRhdGEubGVuZ3RoLTE7CiAgICBpZihzLmRhdGFbbGFzdF0hPW51bGwpCiAgICAgIHN2Zy5hcHBlbmRDaGlsZChlbCgnY2lyY2xlJyx7Y3g6WChsYXN0KSxjeTpZKHMuZGF0YVtsYXN0XSkscjo0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6J3ZhcigtLScrcy5jbHMrJyknLHN0cm9rZTondmFyKC0tc3VyZmFjZSknLCdzdHJva2Utd2lkdGgnOjJ9KSk7CiAgfSk7CiAgY2F0cy5mb3JFYWNoKGZ1bmN0aW9uKGMsaSl7CiAgICBpZihuPjEwICYmIGklTWF0aC5jZWlsKG4vNykhPT0wICYmIGkhPT1uLTEpIHJldHVybjsKICAgIHN2Zy5hcHBlbmRDaGlsZChPYmplY3QuYXNzaWduKGVsKCd0ZXh0Jyx7eDpYKGkpLHk6SC04LCdjbGFzcyc6J2xiJywndGV4dC1hbmNob3InOidtaWRkbGUnfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dENvbnRlbnQ6Y30pKTsKICB9KTsKICBmb3IodmFyIGk9MDtpPG47aSsrKXsKICAgIChmdW5jdGlvbihpZHgpewogICAgICB2YXIgaGl0PWVsKCdyZWN0Jyx7eDpYKGlkeCktaXcvKG4tMSkvMix5OlBULHdpZHRoOml3LyhuLTEpfHwyMCxoZWlnaHQ6aWgsJ2NsYXNzJzonaGl0J30pOwogICAgICBoaXQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxmdW5jdGlvbihldil7CiAgICAgICAgdmFyIGJyPWJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgcm93cz1zZXJpZXMubWFwKGZ1bmN0aW9uKHMpewogICAgICAgICAgcmV0dXJuICc8c3BhbiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7Ym9yZGVyLXJhZGl1czoycHg7JwogICAgICAgICAgICAgICArICdiYWNrZ3JvdW5kOnZhcigtLScrcy5jbHMrJyk7bWFyZ2luLXJpZ2h0OjZweCI+PC9zcGFuPicrcy5uYW1lKycgJwogICAgICAgICAgICAgICArIChzLmRhdGFbaWR4XT09bnVsbD8nLSc6Zm10KHMuZGF0YVtpZHhdKSk7CiAgICAgICAgfSkuam9pbignPGJyPicpOwogICAgICAgIHNob3dUaXAoYm94LGV2LmNsaWVudFgtYnIubGVmdCxldi5jbGllbnRZLWJyLnRvcCwnPGI+JytjYXRzW2lkeF0rJzwvYj48YnI+Jytyb3dzKTsKICAgICAgfSk7CiAgICAgIGhpdC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJyxmdW5jdGlvbigpe2hpZGVUaXAoYm94KTt9KTsKICAgICAgc3ZnLmFwcGVuZENoaWxkKGhpdCk7CiAgICB9KShpKTsKICB9CiAgYm94LmFwcGVuZENoaWxkKHN2Zyk7CiAgYm94LmFwcGVuZENoaWxkKGxlZ2VuZChzZXJpZXMpKTsKfQoKZnVuY3Rpb24gbGVnZW5kKGl0ZW1zKXsKICB2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZC5jbGFzc05hbWU9J3RwaC1sZWdlbmQnOwogIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24ocyl7CiAgICB2YXIgc3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgc3AuaW5uZXJIVE1MPSc8aSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS0nK3MuY2xzKycpIj48L2k+JytzLm5hbWU7CiAgICBkLmFwcGVuZENoaWxkKHNwKTsKICB9KTsKICByZXR1cm4gZDsKfQovKiAy7LCoIOuplOuJtDog7ZiE7J6sIO2DreydtCDtnLTrjIDtj7Ag7ZmU66m0IOuwlijsmKTrpbjsqr0p7JeQIOyeiOycvOuptCDqsIDroZzroZwg64u56rKoIOuztOydtOqyjCDtlZzri6Qo7Y6Y7J207KeA64qUIOyEuOuhnOuhnCDsm4Dsp4HsnbTsp4Ag7JWK64qU64ukKSAqLwooZnVuY3Rpb24oKXsKICB2YXIgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudHBoLXN1Ym5hdiBhW2FyaWEtY3VycmVudF0nKTsgaWYoIWEpIHJldHVybjsKICB2YXIgdz1hLnBhcmVudE5vZGUsIGFyPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdyPXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgaWYoYXIucmlnaHQ+d3IucmlnaHQtOHx8YXIubGVmdDx3ci5sZWZ0KSB3LnNjcm9sbExlZnQrPWFyLmxlZnQtd3IubGVmdC0ody5jbGllbnRXaWR0aC1hLm9mZnNldFdpZHRoKS8yOwp9KSgpOwoKdmFyIENMTz0wLCBDSEk9MCwgQVZHPTA7ICAgICAgLyog7IOJIOq4sOykgOqwkiDigJQgcmVuZGVyKCkg6rCAIOqwseyLoO2VnOuLpCAqLwoKLyog6riw67O4IOyDiSDtlajsiJguIOq4sOumhOqwksK367aA64+Z7IKwIOyghOq1rSDtjpjsnbTsp4DripQg7JWE656Y7JeQ7IScIOyekOq4sCDqsoPsnYQg64uk7IucIOygleydmO2VtCDrja7slrTsk7Tri6QuCiAgICjsi5zrj4TCt+yLnOq1sOq1rCDtjpjsnbTsp4Dsl5DripQg7J206rKMIOyXhuyWtOyEnCDtgbTrn6zsiqTthLAg7JWE7J207L2Y7J20IO2GteynuOuhnCDslYgg6re466Ck7KGM7JeI64ukKSAqLwpmdW5jdGlvbiBjb2xvckZvcih2LCBsbywgaGkpewogIGlmKGhpPD1sbykgcmV0dXJuICcjOWNhM2FmJzsKICB2YXIgdD0odi1sbykvKGhpLWxvKSwgY3M9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogIGlmKHQ+MC42NikgcmV0dXJuIGNzLmdldFByb3BlcnR5VmFsdWUoJy0tczInKS50cmltKCl8fCcjZWI2ODM0JzsKICBpZih0PDAuMzMpIHJldHVybiBjcy5nZXRQcm9wZXJ0eVZhbHVlKCctLXMxJykudHJpbSgpfHwnIzJhNzhkNic7CiAgcmV0dXJuICcjOWNhM2FmJzsKfQovKiDsp4DsmKTsvZTrlKnsnbQg7Ja07KmM64ukIOyXieuase2VnCDqs7PsnYQg7KeR7Jy866m0KOuPmeuqhSDri6jsp4ApIOq3uCDtlZwg7KCQIOuVjOusuOyXkCDsp4Drj4TqsIAg7KCE6rWt7Jy866GcIOykjOyVhOybg+uQnOuLpC4KICAg7ISc7Jq4IO2OmOydtOyngOqwgCDrgqjslpHso7zCt+yduOyynOq5jOyngCDri7TslYQg67O07J24IOyggeydtCDsnojri6QuIOuwlOq5pSAyJeulvCDsnpjrnbwg67KU7JyE66W8IOyeoeuKlOuLpC4gKi8KZnVuY3Rpb24gZml0VG8obSwgcHRzLCBtYXhab29tKXsKICBpZighcHRzLmxlbmd0aCkgcmV0dXJuOwogIG0uaW52YWxpZGF0ZVNpemUoZmFsc2UpOwogIGlmKHB0cy5sZW5ndGggPCAzMCl7IG0uZml0Qm91bmRzKHB0cyx7cGFkZGluZzpbMzAsMzBdLG1heFpvb206bWF4Wm9vbXx8MTV9KTsgcmV0dXJuOyB9CiAgdmFyIGxhPXB0cy5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHBbMF07fSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fSk7CiAgdmFyIGxuPXB0cy5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHBbMV07fSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWI7fSk7CiAgdmFyIHE9ZnVuY3Rpb24oYSx0KXtyZXR1cm4gYVtNYXRoLm1pbihhLmxlbmd0aC0xLE1hdGgubWF4KDAsTWF0aC5mbG9vcihhLmxlbmd0aCp0KSkpXTt9OwogIG0uZml0Qm91bmRzKFtbcShsYSwwLjAyKSxxKGxuLDAuMDIpXSxbcShsYSwwLjk4KSxxKGxuLDAuOTgpXV0sCiAgICAgICAgICAgICAge3BhZGRpbmc6WzMwLDMwXSxtYXhab29tOm1heFpvb218fDE1fSk7Cn0KCi8qIOuniOy7pOulvCDtlZwg6rCc7JSpIGFkZFRvIO2VmOuptCDtgbTrn6zsiqTthLDqsIAg66ek67KIIOuLpOyLnCDqs4TsgrDrkJzri6QoMiw1MDDqsJzrqbQg64iI7JeQIOuztOydtOqyjCDrsoTrsoXsnbTqs6AKICAg7ZmU66m07JeQIOqyuey5nCDssYTroZwg64Ko64qU64ukKS4g66qo7JWE7IScIGFkZExheWVycyDroZwg7ZWcIOuyiOyXkCDrhKPripTri6QuICovCnZhciBQRU5EPVtdOwpmdW5jdGlvbiBhZGRBbGwobGF5ZXIsIGFycil7CiAgaWYobGF5ZXIuYWRkTGF5ZXJzKSBsYXllci5hZGRMYXllcnMoYXJyKTsKICBlbHNlIGFyci5mb3JFYWNoKGZ1bmN0aW9uKG0peyBtLmFkZFRvKGxheWVyKTsgfSk7Cn0KCmZ1bmN0aW9uIGNsdXN0ZXJHcm91cChmbXQsIGNvbEZuKXsKICBpZighd2luZG93LkwgfHwgIUwubWFya2VyQ2x1c3Rlckdyb3VwKQogICAgcmV0dXJuIEwubGF5ZXJHcm91cCgpOyAgICAgICAgICAvKiDtlIzrn6zqt7jsnbjsnbQg66q7IOuWtOycvOuptCDqt7jrg6Ug64ukIOywjeuKlOuLpCAqLwogIHJldHVybiBMLm1hcmtlckNsdXN0ZXJHcm91cCh7CiAgICBjaHVua2VkTG9hZGluZzp0cnVlLCBzaG93Q292ZXJhZ2VPbkhvdmVyOmZhbHNlLCBzcGlkZXJmeU9uTWF4Wm9vbTp0cnVlLAogICAgZGlzYWJsZUNsdXN0ZXJpbmdBdFpvb206MTUsIG1heENsdXN0ZXJSYWRpdXM6ODQsCiAgICBpY29uQ3JlYXRlRnVuY3Rpb246ZnVuY3Rpb24oYyl7CiAgICAgIHZhciBtcz1jLmdldEFsbENoaWxkTWFya2VycygpLCB2PVtdOwogICAgICBmb3IodmFyIGk9MDtpPG1zLmxlbmd0aDtpKyspeyBpZihtc1tpXS5vcHRpb25zLnB2IT1udWxsKSB2LnB1c2gobXNbaV0ub3B0aW9ucy5wdik7IH0KICAgICAgdi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEtYjt9KTsKICAgICAgdmFyIG1pZCA9IHYubGVuZ3RoPyB2W3YubGVuZ3RoPj4xXSA6IG51bGw7CiAgICAgIHZhciBuPWMuZ2V0Q2hpbGRDb3VudCgpOwogICAgICB2YXIgc3ogPSBuPjMwMD81OCA6IG4+NjA/NTAgOiA0MzsKICAgICAgcmV0dXJuIEwuZGl2SWNvbih7Y2xhc3NOYW1lOid0cGgtY2x1c3RlcicsIGljb25TaXplOltzeixzel0sCiAgICAgICAgaHRtbDonPGRpdiBjbGFzcz0iY2wiIHN0eWxlPSJ3aWR0aDonK3N6KydweDtoZWlnaHQ6JytzeisncHg7YmFja2dyb3VuZDonCiAgICAgICAgICAgICArKG1pZD09bnVsbD8nIzljYTNhZic6Y29sRm4obWlkKSkrJyI+JwogICAgICAgICAgICAgKyc8Yj4nKyhtaWQ9PW51bGw/Jyc6Zm10KG1pZCkpKyc8L2I+PGk+JytuKyfqs7M8L2k+PC9kaXY+J30pOwogICAgfX0pOwp9CjsKdmFyIG1hcCwgbGF5ZXIsIG1hcmtlcnM9W10sIG1lPW51bGwsIG1lTWFya2VyPW51bGwsIG1lQ2lyY2xlPW51bGw7CnZhciBmYWNzPXt9OyAgIC8qIO2OuOydmOyLnOyEpCDtlYTthLAuIOyYpO2UvOuEtyBBUEnsl5Ag7IWA7ZSEIOyXrOu2gOuKlCDsl4bslrTshJwg64yA7IugIOydtOqxuCDsk7Tri6QuICovCi8qIOuPhOuhnCDqsbDrpqwg67O07KCV6rOE7IiYLgogICDsi6TsoJwg64+E66Gc64qUIOyngeyEoOuztOuLpCDquLjri6QuIOq1reuCtCDrj4Tsi6wg6riw7KSAIO2GteyDgSAxLjN+MS4067CwLgogICDsoJXtmZXtlZwg64+E66Gc6rGw66as64qUIOudvOyasO2MhSBBUEko7ISc67KEIO2VhOyalCnqsIAg7J6I7Ja07JW8IO2VmOuvgOuhnCDsl6zquLDshJzripQg7LaU7KCV7LmY7J2066mwCiAgIO2ZlOuptOyXkOuPhCAn7JiI7IOBJ+ydtOudvOqzoCDtkZzsi5ztlZzri6QuIOq4uOywvuq4sCDrsoTtirzsnLzroZwg7KCV7ZmV7ZWcIOqyveuhnOulvCDrsJTroZwg7Je0IOyImCDsnojri6QuICovCnZhciBST0FEID0gMS4zNTsKdmFyIFNQRUVEID0gMzI7ICAgLyoga20vaCDigJQg64+E7IusIO2Pieq3oCDso7ztlonsho3rj4Qg6rCA7KCVICovCgpELnN0ID0gRC54Lm1hcChmdW5jdGlvbihhKXsgdmFyIGY9YVs5XXx8MCwgcHI9e307CiAgaWYoYVs2XSkgcHJbJ+2cmOuwnOycoCddPWFbNl07IGlmKGFbN10pIHByWyfqsr3snKAnXT1hWzddOwogIHJldHVybiB7bmFtZTphWzBdLCBicmFuZDpELkJbYVsxXV0sIHNpZG86RC5TW2FbMl1dLCBhZGRyOmFbM118fCcnLCBsYXQ6YVs0XSwgbG9uOmFbNV0sIHByaWNlczpwciwKICAgICAgICAgIGFnZTphWzhdfHwwLCBhZ2VkOmFbMTBdfHwwLCB3YXNoOiEhKGYmMSksIGN2czohIShmJjIpLCBtYWludDohIShmJjQpfTsgfSk7Ci8qIOqyveycoOuKlCDtnJjrsJzsnKDrs7Tri6Qg64qm6rKMKDIwMjYtMTAtMDYpIOqyqeyekCDsiJjsp5HsnYQg7Iuc7J6R7ZW0IOuNruuKlCDqs7PsnbQg7KGw6riIIOyggeuLpC4g66qHIOqzs+yduOyngCDsiKjquLDsp4Ag66eQ6rOgIOyVjOumsOuLpC4gKi8KdmFyIERJRVNFTF9OID0gRC5zdC5maWx0ZXIoZnVuY3Rpb24oeCl7IHJldHVybiB4LnByaWNlc1sn6rK97JygJ107IH0pLmxlbmd0aDsKLyog7IS47LCowrftjrjsnZjsoJDCt+qyveygleu5hCDsl6zrtoDripQgZGV0YWlsQnlJZCjso7zsnKDshozri7kgMe2ajCnroZzrp4wg7JWMIOyImCDsnojslrQg64Ko64qUIO2YuOy2nOuhnCDsobDquIjslKkg7LGE7Jq064ukIOKAlCDqsbDrpbwg65WMIOq3uCDrspTsnITrpbwg7JWM66aw64ukLiAqLwp2YXIgRkFDX04gPSBELnguZmlsdGVyKGZ1bmN0aW9uKGEpeyByZXR1cm4gKGFbOV18fDApJjg7IH0pLmxlbmd0aDsKZnVuY3Rpb24gcHJpY2UocyxwKXsgcmV0dXJuIHMucHJpY2VzICYmIHMucHJpY2VzW3BdID8gcy5wcmljZXNbcF0gOiBudWxsOyB9CmZ1bmN0aW9uIGRpc3QoYSxiLGMsZCl7CiAgdmFyIFI9NjM3MSxkTGF0PShjLWEpKk1hdGguUEkvMTgwLGRMb249KGQtYikqTWF0aC5QSS8xODA7CiAgdmFyIHE9TWF0aC5zaW4oZExhdC8yKSpNYXRoLnNpbihkTGF0LzIpK01hdGguY29zKGEqTWF0aC5QSS8xODApKk1hdGguY29zKGMqTWF0aC5QSS8xODApKk1hdGguc2luKGRMb24vMikqTWF0aC5zaW4oZExvbi8yKTsKICByZXR1cm4gUioyKk1hdGguYXRhbjIoTWF0aC5zcXJ0KHEpLE1hdGguc3FydCgxLXEpKTsKfQpmdW5jdGlvbiBlbnJpY2goeCxwKXsKICB2YXIgdj1wcmljZSh4LHApOwogIHguX3Y9djsgeC5fa209bnVsbDsgeC5fcm9hZD1udWxsOyB4Ll9taW49bnVsbDsgeC5fdHJpcD1udWxsOyB4Ll90b3RhbD1udWxsOwogIHguX2FnZSA9IChwPT09J+qyveycoCcpID8geC5hZ2VkIDogeC5hZ2U7ICAgLyog6riw7KSA7J287J2AIOycoOyiheuniOuLpCDri6TrpbTri6QgKi8KICBpZihtZSAmJiB4LmxhdCl7CiAgICB4Ll9rbSA9IGRpc3QobWVbMF0sbWVbMV0seC5sYXQseC5sb24pOwogICAgeC5fcm9hZCA9IHguX2ttKlJPQUQ7CiAgICB4Ll9taW4gPSBNYXRoLnJvdW5kKHguX3JvYWQvU1BFRUQqNjApOwogIH0KICByZXR1cm4geDsKfQpmdW5jdGlvbiBmaWx0ZXJlZCgpewogIHZhciBzaWRvPXMoJ3NpZG8nKSwgcD1zKCdwcm9kJyksIHJhZD0rcygncmFkaXVzJyl8fDA7CiAgdmFyIGxpc3QgPSBELnN0LmZpbHRlcihmdW5jdGlvbih4KXsKICAgIGlmKHNpZG8gJiYgeC5zaWRvIT09c2lkbykgcmV0dXJuIGZhbHNlOwogICAgZm9yKHZhciBmIGluIGZhY3MpeyBpZihmYWNzW2ZdICYmICF4W2ZdKSByZXR1cm4gZmFsc2U7IH0KICAgIHJldHVybiBwcmljZSh4LHApIT1udWxsOwogIH0pLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gZW5yaWNoKHgscCk7fSk7CiAgaWYobWUgJiYgcmFkKSBsaXN0ID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24oeCl7IHJldHVybiB4Ll9rbSE9bnVsbCAmJiB4Ll9rbTw9cmFkOyB9KTsKICAvKiDimIUg7JiI7KCE7JeUICfsnbTrk50gPSDrqqnroZ0g7KSR7JWZ6rCSIOuMgOu5hCDsoIjslb3rtoQgLSDsnbTrj5nruYQnIOyYgOuKlOuNsCDrkZAg6rCA7KeA6rCAIOuCmOu5tOuLpC4KICAgICAgICgxKSDquLDspIDsnbgg7KSR7JWZ6rCS7J20IOuwmOqyvcK37Iuc64+EIO2VhO2EsOyXkCDrlLDrnbwg7Z2U65Ok66Ck7IScIOqwmeydgCDso7zsnKDshozsnbjrjbAg6rCS7J20IOuLrOudvOyhjOuLpC4KICAgICAgICgyKSDsnYzsiJjqsIAg64KY7Jik66m0ICfshpDtlbQgLTEsMDAw7JuQJyDsspjrn7wg67aA7KCV7J20IOuRkCDrsogg6rK57LOQIOydveq4sCDslrTroKTsm6Dri6QuCiAgICAg6re4656Y7IScIOq4sOykgCDsnpDssrTrpbwg7JeG7JWg6rOgICoq7Iuk7KCc66GcIOyngOqwkeyXkOyEnCDrgpjqsIDripQg64+IKirrp4wg7JO064ukLiDstJ3ruYTsmqnsnYAg7ZWt7IOBIOyWkeyImOuLpC4gKi8KICB2YXIgZWZmID0gTWF0aC5tYXgoMSwgKygkKCdlZmYnKXx8e30pLnZhbHVlIHx8IDEyKTsKICB2YXIgdm9sID0gTWF0aC5tYXgoMSwgKygkKCd2b2wnKXx8e30pLnZhbHVlIHx8IDQwKTsKICB2YXIgYmVzdCA9IG51bGw7CiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHgpewogICAgeC5fZnVlbCA9IE1hdGgucm91bmQoeC5fdiAqIHZvbCk7CiAgICBpZih4Ll9yb2FkPT1udWxsKXsgeC5fdHJpcD1udWxsOyB4Ll90b3RhbD1udWxsOyByZXR1cm47IH0KICAgIHguX3RyaXAgID0gTWF0aC5yb3VuZCgoeC5fcm9hZCoyL2VmZikgKiB4Ll92KTsgICAvKiDsmZXrs7Ug7KO87ZaJ7JeQIO2DnOyasOuKlCDquLDrpoTqsJIgKi8KICAgIHguX3RvdGFsID0geC5fZnVlbCArIHguX3RyaXA7CiAgICBpZihiZXN0PT09bnVsbCB8fCB4Ll90b3RhbDxiZXN0KSBiZXN0ID0geC5fdG90YWw7CiAgfSk7CiAgbGlzdC5fYmVzdCA9IGJlc3Q7IGxpc3QuX3ZvbCA9IHZvbDsKICByZXR1cm4gbGlzdDsKfQpmdW5jdGlvbiBhdmdPZihsaXN0KXsKICB2YXIgdj1saXN0Lm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5fdjt9KS5maWx0ZXIoQm9vbGVhbik7CiAgcmV0dXJuIHYubGVuZ3RoPyB2LnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhK2I7fSwwKS92Lmxlbmd0aCA6IDA7Cn0KZnVuY3Rpb24gY29sb3JGb3IodiwgYXZnKXsKICBpZighYXZnKSByZXR1cm4gJyM5Y2EzYWYnOwogIHZhciBkPSh2LWF2ZykvYXZnLCBjcz1nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgaWYoZDwtMC4wMTUpIHJldHVybiBjcy5nZXRQcm9wZXJ0eVZhbHVlKCctLXMxJykudHJpbSgpfHwnIzJhNzhkNic7CiAgaWYoZD4wLjAxNSkgIHJldHVybiBjcy5nZXRQcm9wZXJ0eVZhbHVlKCctLXMyJykudHJpbSgpfHwnI2ViNjgzNCc7CiAgcmV0dXJuICcjOWNhM2FmJzsKfQpmdW5jdGlvbiBuYXZMaW5rKHgpewogIHJldHVybiAnaHR0cHM6Ly9tYXAua2FrYW8uY29tL2xpbmsvdG8vJytlbmNvZGVVUklDb21wb25lbnQoeC5uYW1lKSsnLCcreC5sYXQrJywnK3gubG9uOwp9CmZ1bmN0aW9uIHJlbmRlcigpewogIHZhciBwPXMoJ3Byb2QnKSwgbGlzdD1maWx0ZXJlZCgpLCBhdmc9YXZnT2YobGlzdCksIHNvcnQ9cygnc29ydCcpOwogIHZhciBiZXN0PWxpc3QuX2Jlc3QsIHZvbD1saXN0Ll92b2x8fDQwOwogIEFWRz1hdmc7CiAgbGlzdC5zb3J0KGZ1bmN0aW9uKGEsYil7CiAgICBpZihzb3J0PT09J2Rpc3QnICYmIG1lKSByZXR1cm4gKGEuX2ttfHwxZTkpLShiLl9rbXx8MWU5KTsKICAgIGlmKHNvcnQ9PT0ndG90YWwnICYmIG1lKSByZXR1cm4gKGEuX3RvdGFsPT1udWxsPzFlMTI6YS5fdG90YWwpLShiLl90b3RhbD09bnVsbD8xZTEyOmIuX3RvdGFsKTsKICAgIHJldHVybiBhLl92LWIuX3Y7CiAgfSk7CiAgaWYobGF5ZXIpIGxheWVyLmNsZWFyTGF5ZXJzKCk7CiAgUEVORD1bXTsKICBtYXJrZXJzPVtdOyB2YXIgYm91bmRzPVtdOwogIGlmKG1lKXsKICAgIC8qIOuCtCDsnITsuZgg7ZGc7Iuc64qUIO2BtOufrOyKpO2EsOyXkCDrhKPsp4Ag7JWK64qU64ukLiDrrLbsnbTrqbQg7IKs65287KeE64ukLiAqLwogICAgaWYobWVDaXJjbGUpIG1hcC5yZW1vdmVMYXllcihtZUNpcmNsZSk7CiAgICBpZihtZU1hcmtlcikgbWFwLnJlbW92ZUxheWVyKG1lTWFya2VyKTsKICAgIG1lQ2lyY2xlPUwuY2lyY2xlKG1lLHtyYWRpdXM6KCtzKCdyYWRpdXMnKXx8MCkqMTAwMCxjb2xvcjonIzM1MzhjZCcsd2VpZ2h0OjEsCiAgICAgIGZpbGxDb2xvcjonIzM1MzhjZCcsZmlsbE9wYWNpdHk6LjA1fSkuYWRkVG8obWFwKTsKICAgIG1lTWFya2VyPUwuY2lyY2xlTWFya2VyKG1lLHtyYWRpdXM6Nyxjb2xvcjonI2ZmZicsd2VpZ2h0OjIsZmlsbENvbG9yOicjMzUzOGNkJyxmaWxsT3BhY2l0eToxfSkKICAgICAgLmFkZFRvKG1hcCkuYmluZFBvcHVwKCfrgrQg7JyE7LmYJyk7CiAgICBib3VuZHMucHVzaChtZSk7CiAgfQogIGxpc3QuZm9yRWFjaChmdW5jdGlvbih4KXsKICAgIHZhciBjb2w9Y29sb3JGb3IoeC5fdixhdmcpOwogICAgdmFyIGljPUwuZGl2SWNvbih7Y2xhc3NOYW1lOid0cGgtcGluJywgaWNvblNpemU6WzU0LDI2XSwgaWNvbkFuY2hvcjpbMjcsMjZdLAogICAgICBodG1sOic8YiBzdHlsZT0iYmFja2dyb3VuZDonK2NvbCsnIj4nK3guX3YudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJzwvYj4nCiAgICAgICAgICArJzxpIHN0eWxlPSJjb2xvcjonK2NvbCsnIj48L2k+J30pOwogICAgdmFyIG09TC5tYXJrZXIoW3gubGF0LHgubG9uXSx7aWNvbjppYyxwdjp4Ll92fSk7ICBQRU5ELnB1c2gobSk7CiAgICB2YXIgZmFjPVtdOyBpZih4Lndhc2gpZmFjLnB1c2goJ+yEuOywqCcpOyBpZih4LmN2cylmYWMucHVzaCgn7Y647J2Y7KCQJyk7IGlmKHgubWFpbnQpZmFjLnB1c2goJ+qyveygleu5hCcpOwogICAgbS5iaW5kUG9wdXAoJzxiPicreC5uYW1lKyc8L2I+PGJyPicrKHguYnJhbmR8fHguc2lkb3x8JycpKyhmYWMubGVuZ3RoPycgwrcgJytmYWMuam9pbignwrcnKTonJykKICAgICAgKyc8YnI+PGIgc3R5bGU9ImZvbnQtc2l6ZToxNXB4Ij4nK3guX3YudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJ+ybkC9MPC9iPicKICAgICAgKyAoeC5fYWdlPjAgPyAnIDxzcGFuIHN0eWxlPSJjb2xvcjojOTk5Ij4oJyt4Ll9hZ2UrJ+ydvCDsoIQg6riw7KSAKTwvc3Bhbj4nIDogJycpCiAgICAgICsgKHguX3JvYWQhPW51bGwgPyAnPGJyPuyYiOyDgSAnK3guX3JvYWQudG9GaXhlZCgxKSsna20gwrcg7JW9ICcreC5fbWluKyfrtoQnIDogJycpCiAgICAgICsgKHguX3RvdGFsIT1udWxsID8gJzxicj4nK3ZvbCsnTCDso7zsnKAgKyDsmZXrs7Ug7J2064+ZID0gPGI+Jyt4Ll90b3RhbC50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQPC9iPicKICAgICAgICAgICsgKHguX3RvdGFsPmJlc3QgPyAnIDxzcGFuIHN0eWxlPSJjb2xvcjojOTk5Ij4o7LWc7KCA67O064ukICsnKyh4Ll90b3RhbC1iZXN0KS50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQKTwvc3Bhbj4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyA8c3BhbiBzdHlsZT0iY29sb3I6IzE1ODAzZCI+7Jes6riw6rCAIOy1nOyggDwvc3Bhbj4nKSA6ICcnKQogICAgICArKHguYWRkcj8nPGJyPjxzcGFuIHN0eWxlPSJjb2xvcjojNjY2Ij4nK3guYWRkcisnPC9zcGFuPic6JycpCiAgICAgICsnPGJyPjxhIGhyZWY9IicrbmF2TGluayh4KSsnIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+6ri47LC+6riwIOKGkjwvYT4nKTsKICAgIG1hcmtlcnMucHVzaChtKTsgYm91bmRzLnB1c2goW3gubGF0LHgubG9uXSk7CiAgfSk7CiAgLyog7Luo7YWM7J2064SIIO2BrOq4sOqwgCDtmZXsoJXrkJwg65Kk7JeQIOunnuy2sOyVvCDtlZzri6QuCiAgICAgaW52YWxpZGF0ZVNpemUg7JeG7J20IGZpdEJvdW5kc+2VmOuptCDsl4nrmrHtlZwg6rOz7Jy866GcIO2ZleuMgOuQnOuLpCjsi6TsoJzroZwg6re4656s7J2MKS4gKi8KICBhZGRBbGwobGF5ZXIsIFBFTkQpOwogIGZpdFRvKG1hcCwgYm91bmRzLCAxNSk7CiAgdmFyIGg9Jyc7CiAgbGlzdC5zbGljZSgwLDYwKS5mb3JFYWNoKGZ1bmN0aW9uKHgsaSl7CiAgICB2YXIgY29sPWNvbG9yRm9yKHguX3YsYXZnKTsKICAgIC8qIGFyb3VuZEFsbCDroZwg65Ok7Ja07JioIOyjvOycoOyGjOuKlCDso7zshozqsIAg7JeG64ukKEFQSeqwgCDslYgg7KSA64ukKS4KICAgICAgIOunpOydvCDrj4TripQgY29sbGVjdF9zdGF0aW9ucy5weSDsnZgg66mU7YOAIOuztOqwlSDri6jqs4TqsIAg7LGE7Jq064ukLiDqt7gg7KCE6rmM7KeA64qUIOyLnMK364+E66GcIOuMgOyLoO2VnOuLpC4gKi8KICAgIHZhciBtZXRhPSh4LmJyYW5kP3guYnJhbmQrJyDCtyAnOicnKSsoeC5hZGRyfHx4LnNpZG98fCcnKTsKICAgIGlmKHguX3JvYWQhPW51bGwpIG1ldGE9J+yYiOyDgSAnK3guX3JvYWQudG9GaXhlZCgxKSsna20gwrcg7JW9ICcreC5fbWluKyfrtoQgwrcgJyttZXRhOwogICAgLyog7LSd67mE7Jqp7J2AIOuKmCDslpHsiJjsnbTrr4DroZwgJy0nIOu2gO2YuOuPhCAn7IaQ7ZW0J+udvOuKlCDrp5Drj4Qg7JOw7KeAIOyViuuKlOuLpC4KICAgICAgIOu5hOq1kOuKlCDsmKTsp4EgJ+y1nOyggCDrjIDruYQgK+yWvOuniCfroZzrp4wg7ZWc64ukLiAqLwogICAgdmFyIGdhaW49Jyc7CiAgICBpZih4Ll90b3RhbCE9bnVsbCl7CiAgICAgIHZhciBnYXAgPSB4Ll90b3RhbCAtIGJlc3Q7CiAgICAgIGdhaW49JzxlbSBjbGFzcz0iJysoZ2FwPjA/J2RuJzondXAnKSsnIj4nK3ZvbCsnTCvsmZXrs7UgJyt4Ll90b3RhbC50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQJwogICAgICAgICAgKyhnYXA+MD8gJyDCtyArJytnYXAudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJ+ybkCcgOiAnIMK3IOy1nOyggCcpKyc8L2VtPic7CiAgICB9ZWxzZXsKICAgICAgZ2Fpbj0nPGVtPicrdm9sKydMICcreC5fZnVlbC50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQPC9lbT4nOwogICAgfQogICAgdmFyIGFnZT0oeC5fYWdlPjApPyAnPHNwYW4gY2xhc3M9InRwaC10YWcgc3RhbGUiPicreC5fYWdlKyfsnbwg7KCEPC9zcGFuPicgOiAnJzsKICAgIGgrPSc8ZGl2IGNsYXNzPSJ0cGgtcm93IiBkYXRhLWk9IicraSsnIj48ZGl2IGNsYXNzPSJyayI+JysoaSsxKSsnPC9kaXY+JwogICAgICArJzxkaXYgY2xhc3M9Im5tIj48Yj4nK3gubmFtZSthZ2UrKHgud2FzaD8nPHNwYW4gY2xhc3M9InRwaC10YWciPuyEuOywqDwvc3Bhbj4nOicnKQogICAgICArKHguY3ZzPyc8c3BhbiBjbGFzcz0idHBoLXRhZyI+7Y647J2Y7KCQPC9zcGFuPic6JycpKyc8L2I+JwogICAgICArJzxzcGFuPicrbWV0YSsnPC9zcGFuPjwvZGl2PicKICAgICAgKyc8ZGl2IGNsYXNzPSJwciIgc3R5bGU9ImNvbG9yOicrY29sKyciPicreC5fdi50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQJytnYWluKyc8L2Rpdj4nCiAgICAgICsnPGEgY2xhc3M9InRwaC1nbyIgaHJlZj0iJytuYXZMaW5rKHgpKyciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiB0aXRsZT0i6ri47LC+6riwIj7igLo8L2E+PC9kaXY+JzsKICB9KTsKICAkKCdsaXN0JykuaW5uZXJIVE1MID0gaCB8fCAnPGRpdiBjbGFzcz0idHBoLXJvdyI+PGRpdiBjbGFzcz0ibm0iPuyhsOqxtOyXkCDrp57ripQg7KO87Jyg7IaM6rCAIOyXhuyKteuLiOuLpC4g67CY6rK97J2EIOuEk+2YgCDrs7TshLjsmpQuPC9kaXY+PC9kaXY+JzsKICAvKiDtl6TrlKnsnbQg7Iuk7KCcIOygleugrOqzvCDslrTquIvrgpjrqbQg66qp66Gd7J2EIOyemOuquyDsnb3ripTri6QuIOygleugrOydhCDrsJTqv4Ag65WMIOqwmeydtCDrsJTqvrzri6QuCiAgICAg7JyE7LmY66W8IOyViCDsvJzrqbQg7LSd67mE7Jqp7J2EIOuquyDqtaztlbQg66as7YSw64u5IOqwgOqyqeyInOycvOuhnCDrlqjslrTsp4Drr4DroZwg6re46rKD64+EIOuwmOyYge2VnOuLpC4gKi8KICB2YXIgbGg9JCgnbGlzdGgnKTsKICBpZihsaCkgbGgudGV4dENvbnRlbnQgPSAoc29ydD09PSd0b3RhbCcgJiYgbWUpID8gJ+y0neu5hOyaqSDsoIHsnYAg7IicJwogICAgICAgICAgICAgICAgICAgICAgICA6IChzb3J0PT09J2Rpc3QnICYmIG1lKSAgPyAn6rCA6rmM7Jq0IOyInCcKICAgICAgICAgICAgICAgICAgICAgICAgOiAn66as7YSw64u5IOqwgOqyqSDrgq7snYAg7IicJzsKICAkKCdsaXN0JykucXVlcnlTZWxlY3RvckFsbCgnLnRwaC1yb3dbZGF0YS1pXScpLmZvckVhY2goZnVuY3Rpb24ocil7CiAgICByLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgaWYoZS50YXJnZXQuY2xvc2VzdCgnLnRwaC1nbycpKSByZXR1cm47CiAgICAgIHZhciBtPW1hcmtlcnNbK3IuZGF0YXNldC5pXTsgaWYoIW0pIHJldHVybjsKICAgICAgbWFwLnNldFZpZXcobS5nZXRMYXRMbmcoKSwxNik7IG0ub3BlblBvcHVwKCk7CiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cGgtbWFwJykuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidjZW50ZXInfSk7CiAgICB9KTsKICB9KTsKICB2YXIgbmF0diA9IEQubmF0ICYmIEQubmF0W3BdOwogIHZhciBjb3Y9JCgnY292Jyk7CiAgaWYoY292KXsKICAgIGlmKG1lICYmIGxpc3QubGVuZ3RoICYmIGxpc3RbMF0uX3JvYWQhPW51bGwgJiYgbGlzdFswXS5fcm9hZD44KQogICAgICBjb3YuaW5uZXJIVE1MPSfqsIDsnqUg6rCA6rmM7Jq0IOyjvOycoOyGjOqwgCAnK2xpc3RbMF0uX3JvYWQudG9GaXhlZCgwKSsna20g65ao7Ja07KC4IOyeiOyKteuLiOuLpC4gJwogICAgICAgICsn7ZiE7J6s64qUIDxiPuyLnMK364+E67OEIOy1nOyggOqwgCDsg4HsnITqtow8L2I+66eMIOyImOynkeuPvCDsnojslrQg7LSY7LSY7ZWY7KeAIOyViuyKteuLiOuLpC4g7IiY7KeRIOuylOychOulvCDrhJPtnojripQg7KSR7J6F64uI64ukLic7CiAgICBlbHNlIGNvdi5pbm5lckhUTUw9Jyc7CiAgfQogIHNldCgnc3RhdHVzJywgbGlzdC5sZW5ndGggKyAn6rOzJyArIChtZT8gJyAo67CY6rK9ICcrKHMoJ3JhZGl1cycpPT09JzAnPyfsoITssrQnOnMoJ3JhZGl1cycpKydrbScpKycpJzonJykKICAgICAgKyAnIMK3IO2Pieq3oCAnICsgTWF0aC5yb3VuZChhdmcpLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpICsgJ+ybkCcKICAgICAgKyAobmF0dj8gJyDCtyDsoITqta0gJyArIE1hdGgucm91bmQobmF0dikudG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykgKyAn7JuQJyA6ICcnKQogICAgICArIChtZT8gJyDCtyDstJ3ruYTsmqnsnYAgJyt2b2wrJ0wg7KO87JygICsg7JmV67O1IOydtOuPmSDquLDspIAnIDogJycpCiAgICAgICsgKHA9PT0n6rK97JygJz8gJyDCtyDqsr3snKAg6rCA6rKp7J2AIOy1nOq3vCAy7KO8IOyViOyXkCDtmZXsnbjrkJwg7KCE6rWtICcrRElFU0VMX04udG9Mb2NhbGVTdHJpbmcoJ2tvLUtSJykrJ+qzs+yeheuLiOuLpCjtnJjrsJzsnKDrs7Tri6Qg7KGw6riIIOuTrOyEse2VoCDsiJgg7J6I7J2MKScgOiAnJykKICAgICAgKyAoKGZhY3Mud2FzaHx8ZmFjcy5jdnN8fGZhY3MubWFpbnQpPyAnIMK3IOyEuOywqMK37Y647J2Y7KCQwrfqsr3soJXruYTripQg7KCV67O06rCAIO2ZleyduOuQnCAnK0ZBQ19OLnRvTG9jYWxlU3RyaW5nKCdrby1LUicpKyfqs7Mg7JWI7JeQ7ISc66eMIOqxsOumheuLiOuLpCcgOiAnJykpOwp9CmZ1bmN0aW9uIGluaXQoKXsKICBtYXA9TC5tYXAoJ3RwaC1tYXAnLHtzY3JvbGxXaGVlbFpvb206ZmFsc2V9KS5zZXRWaWV3KFszNi41LDEyNy45XSw3KTsKICBMLnRpbGVMYXllcignaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAge21heFpvb206MTksIGF0dHJpYnV0aW9uOicmY29weTsgPGEgaHJlZj0iaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJ30pLmFkZFRvKG1hcCk7CiAgbWFwLm9uKCdjbGljaycsZnVuY3Rpb24oKXttYXAuc2Nyb2xsV2hlZWxab29tLmVuYWJsZSgpO30pOwogIGxheWVyPWNsdXN0ZXJHcm91cChmdW5jdGlvbih2KXtyZXR1cm4gTWF0aC5yb3VuZCh2KS50b0xvY2FsZVN0cmluZygna28tS1InKSsn7JuQJzt9LAogICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih2KXtyZXR1cm4gY29sb3JGb3IodixBVkcpO30pLmFkZFRvKG1hcCk7CiAgWydzaWRvJywncHJvZCcsJ3NvcnQnLCdyYWRpdXMnLCdlZmYnLCd2b2wnXS5mb3JFYWNoKGZ1bmN0aW9uKGlkKXsKICAgIHZhciBlPSQoaWQpOyBpZighZSkgcmV0dXJuOwogICAgZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLHJlbmRlcik7IGUuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLHJlbmRlcik7CiAgfSk7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmFjXScpLmZvckVhY2goZnVuY3Rpb24oYil7CiAgICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICB2YXIgZj1iLmRhdGFzZXQuZmFjOyBmYWNzW2ZdPSFmYWNzW2ZdOwogICAgICBiLmNsYXNzTGlzdC50b2dnbGUoJ29uJyxmYWNzW2ZdKTsgcmVuZGVyKCk7CiAgICB9KTsKICB9KTsKICB2YXIgbG9jYXRlPWZ1bmN0aW9uKCl7CiAgICBpZighbmF2aWdhdG9yLmdlb2xvY2F0aW9uKXt0b2FzdCgn7J20IOu4jOudvOyasOyggOuKlCDsnITsuZjrpbwg7KeA7JuQ7ZWY7KeAIOyViuyKteuLiOuLpCcpO3JldHVybjt9CiAgICBzZXQoJ3N0YXR1cycsJ+ychOy5mOulvCDtmZXsnbjtlZjripQg7KSR4oCmJyk7CiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uKHBvcyl7CiAgICAgIG1lPVtwb3MuY29vcmRzLmxhdGl0dWRlLHBvcy5jb29yZHMubG9uZ2l0dWRlXTsKICAgICAgJCgnbmVhcicpLmNsYXNzTGlzdC5hZGQoJ29uJyk7CiAgICAgIHJlbmRlcigpOwogICAgfSwgZnVuY3Rpb24oKXsKICAgICAgbWU9bnVsbDsgJCgnbmVhcicpLmNsYXNzTGlzdC5yZW1vdmUoJ29uJyk7CiAgICAgIHRvYXN0KCfsnITsuZgg6raM7ZWc7J20IOqxsOu2gOuQmOyXiOyKteuLiOuLpC4g7KeA7Jet7J2EIOyngeygkSDshKDtg53tlZjshLjsmpQuJyk7IHJlbmRlcigpOwogICAgfSwge2VuYWJsZUhpZ2hBY2N1cmFjeTp0cnVlLCB0aW1lb3V0OjgwMDAsIG1heGltdW1BZ2U6MzAwMDAwfSk7CiAgfTsKICAkKCduZWFyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGxvY2F0ZSk7CiAgcmVuZGVyKCk7CiAgbG9jYXRlKCk7ICAgLyog65Ok7Ja07Jik7J6Q66eI7J6QIOuCtCDso7zrs4DrtoDthLAg67O07Jes7KSA64ukICovCiAgc2V0VGltZW91dChmdW5jdGlvbigpeyBtYXAuaW52YWxpZGF0ZVNpemUoZmFsc2UpOyByZW5kZXIoKTsgfSwgMjUwKTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKXsgbWFwLmludmFsaWRhdGVTaXplKGZhbHNlKTsgfSk7Cn0KdmFyIHJvb3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRwaC1wYWdlJyk7CmluaXRUaGVtZShyb290KTsKaWYod2luZG93LkwpIGluaXQoKTsgZWxzZSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsaW5pdCk7Cgo7KGZ1bmN0aW9uKCl7IHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0cGgtcGdzaGFyZScpOyBpZighYikgcmV0dXJuOwogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpewogICAgdmFyIHU9bG9jYXRpb24ub3JpZ2luK2xvY2F0aW9uLnBhdGhuYW1lLCB0PShkb2N1bWVudC50aXRsZXx8JycpLnNwbGl0KCcgLSAnKVswXTsKICAgIHZhciBvaz1mdW5jdGlvbigpeyB2YXIgaD1iLmlubmVySFRNTDsgYi50ZXh0Q29udGVudD0n66eB7YGs66W8IOuzteyCrO2WiOyKteuLiOuLpCc7IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgYi5pbm5lckhUTUw9aDsgfSwgMTgwMCk7IH07CiAgICBpZihuYXZpZ2F0b3Iuc2hhcmUpeyBuYXZpZ2F0b3Iuc2hhcmUoe3RpdGxlOnQsIHVybDp1fSkuY2F0Y2goZnVuY3Rpb24oKXt9KTsgcmV0dXJuOyB9CiAgICBpZihuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KXsgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodSkudGhlbihvaywgZnVuY3Rpb24oKXsgcHJvbXB0KCfslYTrnpgg7KO87IaM66W8IOuzteyCrO2VmOyEuOyalCcsIHUpOyB9KTsgfQogICAgZWxzZSBwcm9tcHQoJ+yVhOuemCDso7zshozrpbwg67O17IKs7ZWY7IS47JqUJywgdSk7CiAgfSk7IH0pKCk7