UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

65 lines 14.1 kB
import { inject, InjectionToken } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { WA_NAVIGATOR, WA_USER_AGENT, WA_WINDOW } from '@ng-web-apis/common'; import { isIos } from '@ng-web-apis/platform'; import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants'; import { fromEvent, map } from 'rxjs'; /** * Unified mobile detection regex. * https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/ */ export const TUI_MOBILE_REGEXP = /(?:android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|^(?:1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-)/i; export const TUI_IS_MOBILE = new InjectionToken(ngDevMode ? 'TUI_IS_MOBILE' : '', { factory: () => TUI_MOBILE_REGEXP.test(inject(WA_USER_AGENT)), }); export const TUI_IS_IOS = new InjectionToken(ngDevMode ? 'TUI_IS_IOS' : '', { factory: () => isIos(inject(WA_NAVIGATOR)), }); export const TUI_IS_ANDROID = new InjectionToken(ngDevMode ? 'TUI_IS_ANDROID' : '', { factory: () => inject(TUI_IS_MOBILE) && !inject(TUI_IS_IOS), }); export const TUI_IS_WEBKIT = new InjectionToken(ngDevMode ? 'TUI_IS_WEBKIT' : '', { factory: () => !!inject(WA_WINDOW)?.webkitConvertPointFromNodeToPage, }); export const TUI_PLATFORM = new InjectionToken(ngDevMode ? 'TUI_PLATFORM' : '', { factory: () => { if (inject(TUI_IS_IOS)) { return 'ios'; } return inject(TUI_IS_ANDROID) ? 'android' : 'web'; }, }); export const TUI_IS_TOUCH = new InjectionToken(ngDevMode ? 'TUI_IS_TOUCH' : '', { factory: () => { const media = inject(WA_WINDOW).matchMedia('(pointer: coarse)'); return toSignal(fromEvent(media, 'change').pipe(map(() => media.matches)), { initialValue: media.matches, }); }, }); /** * @deprecated: use only {@link TUI_IS_E2E} * Detect if app is running under Cypress * {@link https://docs.cypress.io/faq/questions/using-cypress-faq#Is-there-any-way-to-detect-if-my-app-is-running-under-Cypress Cypress docs} * TODO: remove in v5 */ export const TUI_IS_CYPRESS = new InjectionToken(ngDevMode ? 'TUI_IS_CYPRESS' : '', { factory: () => !!inject(WA_WINDOW).Cypress, }); /** * @deprecated: use only {@link TUI_IS_E2E} * Manually provide `true` when running tests in Playwright * TODO: remove in v5 */ export const TUI_IS_PLAYWRIGHT = new InjectionToken(ngDevMode ? 'TUI_IS_PLAYWRIGHT' : '', { factory: TUI_FALSE_HANDLER, }); /** * Detect if app is running under any of test frameworks */ export const TUI_IS_E2E = new InjectionToken(ngDevMode ? 'TUI_IS_E2E' : '', { factory: () => inject(TUI_IS_CYPRESS) || inject(TUI_IS_PLAYWRIGHT) || inject(WA_NAVIGATOR).webdriver, }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvdG9rZW5zL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQzFCLGsyREFBazJELENBQUM7QUFFdjJELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0NBQy9ELENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzdDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Q0FDOUQsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDOUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQU0sU0FBUyxDQUFDLEVBQUUsZ0NBQWdDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDMUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDL0I7SUFDSSxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ1YsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztDQUNKLENBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFaEUsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO1lBQ3ZFLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztTQUM5QixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFNLFNBQVMsQ0FBQyxDQUFDLE9BQU87Q0FDbEQsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUMvQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3BDO0lBQ0ksT0FBTyxFQUFFLGlCQUFpQjtDQUM3QixDQUNKLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUztDQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtXQV9OQVZJR0FUT1IsIFdBX1VTRVJfQUdFTlQsIFdBX1dJTkRPV30gZnJvbSAnQG5nLXdlYi1hcGlzL2NvbW1vbic7XG5pbXBvcnQge2lzSW9zfSBmcm9tICdAbmctd2ViLWFwaXMvcGxhdGZvcm0nO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIG1hcH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogVW5pZmllZCBtb2JpbGUgZGV0ZWN0aW9uIHJlZ2V4LlxuICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzExMzgxNzMwLzI3MDY0MjYgaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9cbiAqL1xuZXhwb3J0IGNvbnN0IFRVSV9NT0JJTEVfUkVHRVhQID1cbiAgICAvKD86YW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyhbNDZdKTB8c3ltYmlhbnx0cmVvfHVwXFwuKGJyb3dzZXJ8bGluayl8dm9kYWZvbmV8d2FwfHdpbmRvd3MgY2V8eGRhfHhpaW5vfF4oPzoxMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXwtbXxyIHxzICl8YXZhbnxiZShja3xsbHxucSl8YmkobGJ8cmQpfGJsKGFjfGF6KXxicihbZXZdKXd8YnVtYnxidy0oW251XSl8YzU1XFwvfGNhcGl8Y2N3YXxjZG0tfGNlbGx8Y2h0bXxjbGRjfGNtZC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGMtc3xkZXZpfGRpY2F8ZG1vYnxkbyhbY3BdKW98ZHMoMTJ8LWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShbLV9dKXxnMSB1fGc1NjB8Z2VuZXxnZi01fGctbW98Z28oXFwud3xvZCl8Z3IoYWR8dW4pfGhhaWV8aGNpdHxoZC0oW21wdF0pfGhlaS18aGkocHR8dGEpfGhwKCBpfGlwKXxocy1jfGh0KGMoWy0gX2FncHN0XSl8dHApfGh1KGF3fHRjKXxpLSgyMHxnb3xtYSl8aTIzMHxpYWMoWyBcXC0vXSl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKFt0dl0pYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KFsgL10pfGtsb258a3B0IHxrd2MtfGt5byhbY2tdKXxsZShub3x4aSl8bGcoIGd8XFwvKFtrbHVdKXw1MHw1NHwtW2Etd10pfGxpYnd8bHlueHxtMS13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bS1jcnxtZShyY3xyaSl8bWkobzh8b2F8dHMpfG1tZWZ8bW8oMDF8MDJ8Yml8ZGV8ZG98dChbLSBvdl0pfHp6KXxtdCg1MHxwMXx2ICl8bXdicHxteXdhfG4xMFswLTJdfG4yMFsyLTNdfG4zMChbMDJdKXxuNTAoWzAyNV0pfG43KDAoWzAxXSl8MTApfG5lKChbY21dKS18b258dGZ8d2Z8d2d8d3QpfG5vayhbNmldKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihbYWR0XSl8cGR4Z3xwZygxM3wtKFsxLThdfGMpKXxwaGlsfHBpcmV8cGwoYXl8dWMpfHBuLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdC1nfHFhLWF8cWMoMDd8MTJ8MjF8MzJ8NjB8LVsyLTddfGktKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aC18b298cC0pfHNka1xcL3xzZShjKFstMDFdKXw0N3xtY3xuZHxyaSl8c2doLXxzaGFyfHNpZShbLW1dKXxzay0wfHNsKDQ1fGlkKXxzbShhbHxhcnxiM3xpdHx0NSl8c28oZnR8bnkpfHNwKDAxfGgtfHYtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsLXx0ZGctfHRlbChbaW1dKXx0aW0tfHQtbW98dG8ocGx8c2gpfHRzKDcwfG0tfG0zfG01KXx0eC05fHVwKFxcLmJ8ZzF8c2kpfHV0c3R8djQwMHx2NzUwfHZlcml8dmkocmd8dGUpfHZrKDQwfDVbMC0zXXwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhbLSBdKXx3ZWJjfHdoaXR8d2koZyB8bmN8bncpfHdtbGJ8d29udXx4NzAwfHlhcy18eW91cnx6ZXRvfHp0ZS0pL2k7XG5cbmV4cG9ydCBjb25zdCBUVUlfSVNfTU9CSUxFID0gbmV3IEluamVjdGlvblRva2VuKG5nRGV2TW9kZSA/ICdUVUlfSVNfTU9CSUxFJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT4gVFVJX01PQklMRV9SRUdFWFAudGVzdChpbmplY3QoV0FfVVNFUl9BR0VOVCkpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBUVUlfSVNfSU9TID0gbmV3IEluamVjdGlvblRva2VuKG5nRGV2TW9kZSA/ICdUVUlfSVNfSU9TJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT4gaXNJb3MoaW5qZWN0KFdBX05BVklHQVRPUikpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBUVUlfSVNfQU5EUk9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX0FORFJPSUQnIDogJycsIHtcbiAgICBmYWN0b3J5OiAoKSA9PiBpbmplY3QoVFVJX0lTX01PQklMRSkgJiYgIWluamVjdChUVUlfSVNfSU9TKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVFVJX0lTX1dFQktJVCA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX1dFQktJVCcgOiAnJywge1xuICAgIGZhY3Rvcnk6ICgpID0+ICEhaW5qZWN0PGFueT4oV0FfV0lORE9XKT8ud2Via2l0Q29udmVydFBvaW50RnJvbU5vZGVUb1BhZ2UsXG59KTtcblxuZXhwb3J0IGNvbnN0IFRVSV9QTEFURk9STSA9IG5ldyBJbmplY3Rpb25Ub2tlbjwnYW5kcm9pZCcgfCAnaW9zJyB8ICd3ZWInPihcbiAgICBuZ0Rldk1vZGUgPyAnVFVJX1BMQVRGT1JNJyA6ICcnLFxuICAgIHtcbiAgICAgICAgZmFjdG9yeTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluamVjdChUVUlfSVNfSU9TKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnaW9zJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGluamVjdChUVUlfSVNfQU5EUk9JRCkgPyAnYW5kcm9pZCcgOiAnd2ViJztcbiAgICAgICAgfSxcbiAgICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IFRVSV9JU19UT1VDSCA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX1RPVUNIJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT4ge1xuICAgICAgICBjb25zdCBtZWRpYSA9IGluamVjdChXQV9XSU5ET1cpLm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG5cbiAgICAgICAgcmV0dXJuIHRvU2lnbmFsKGZyb21FdmVudChtZWRpYSwgJ2NoYW5nZScpLnBpcGUobWFwKCgpID0+IG1lZGlhLm1hdGNoZXMpKSwge1xuICAgICAgICAgICAgaW5pdGlhbFZhbHVlOiBtZWRpYS5tYXRjaGVzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQ6IHVzZSBvbmx5IHtAbGluayBUVUlfSVNfRTJFfVxuICogRGV0ZWN0IGlmIGFwcCBpcyBydW5uaW5nIHVuZGVyIEN5cHJlc3NcbiAqIHtAbGluayBodHRwczovL2RvY3MuY3lwcmVzcy5pby9mYXEvcXVlc3Rpb25zL3VzaW5nLWN5cHJlc3MtZmFxI0lzLXRoZXJlLWFueS13YXktdG8tZGV0ZWN0LWlmLW15LWFwcC1pcy1ydW5uaW5nLXVuZGVyLUN5cHJlc3MgQ3lwcmVzcyBkb2NzfVxuICogVE9ETzogcmVtb3ZlIGluIHY1XG4gKi9cbmV4cG9ydCBjb25zdCBUVUlfSVNfQ1lQUkVTUyA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX0NZUFJFU1MnIDogJycsIHtcbiAgICBmYWN0b3J5OiAoKSA9PiAhIWluamVjdDxhbnk+KFdBX1dJTkRPVykuQ3lwcmVzcyxcbn0pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkOiB1c2Ugb25seSB7QGxpbmsgVFVJX0lTX0UyRX1cbiAqIE1hbnVhbGx5IHByb3ZpZGUgYHRydWVgIHdoZW4gcnVubmluZyB0ZXN0cyBpbiBQbGF5d3JpZ2h0XG4gKiBUT0RPOiByZW1vdmUgaW4gdjVcbiAqL1xuZXhwb3J0IGNvbnN0IFRVSV9JU19QTEFZV1JJR0hUID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KFxuICAgIG5nRGV2TW9kZSA/ICdUVUlfSVNfUExBWVdSSUdIVCcgOiAnJyxcbiAgICB7XG4gICAgICAgIGZhY3Rvcnk6IFRVSV9GQUxTRV9IQU5ETEVSLFxuICAgIH0sXG4pO1xuXG4vKipcbiAqIERldGVjdCBpZiBhcHAgaXMgcnVubmluZyB1bmRlciBhbnkgb2YgdGVzdCBmcmFtZXdvcmtzXG4gKi9cbmV4cG9ydCBjb25zdCBUVUlfSVNfRTJFID0gbmV3IEluamVjdGlvblRva2VuKG5nRGV2TW9kZSA/ICdUVUlfSVNfRTJFJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT5cbiAgICAgICAgaW5qZWN0KFRVSV9JU19DWVBSRVNTKSB8fFxuICAgICAgICBpbmplY3QoVFVJX0lTX1BMQVlXUklHSFQpIHx8XG4gICAgICAgIGluamVjdChXQV9OQVZJR0FUT1IpLndlYmRyaXZlcixcbn0pO1xuIl19